close
這一篇主要是針對 函數設計準則 (2) 所作的修訂,為了讓看的人了解變化的過程,我選擇另開一篇來寫。
在過年前其實已經有定見了,不過前幾天跟我的父親吵了一架,心情不是很好,所以遲了幾天才寫,吵架的原因我會另開一篇說明。
首先是函數的特性,從單一處理到批次處理時,針對失敗與中斷的作法,如果要強調「無縫」的特性,其行為特徵應該改成這樣:
理由很簡單,我們既然不在乎成功或失敗的理由,我們還會在乎失敗的是哪幾個項目嗎?
以一般正常的函數來說,我們所期望的是成功的結果,而非失敗的結果(而目前我們所討論的這類函數,是被嚴格限制的),所以即便是批次處理,也應該遵循一致的作法。
要了解失敗的項目,一般來說是在除錯的時候比較需要,但一旦可以傳回失敗的項目,那麼在應用上就會面臨判斷式的改寫。對於程式流程上的處理,每包一層就要多作判斷,實在是不需要,防止過多的資訊亂竄,也是程式設計要考慮的事項。
接下來讓我們看看改寫後的函數:
function 載入:模組集($模組集){
$模組集 = &條件:陣列($模組集, false);
foreach($模組集 as $模組 => $條件){
if(!載入:模組($模組, $條件)){
return false;
}
}
return true;
}
function 選擇:模組($選擇集){
foreach($選擇集 as $選擇 => $模組集){
if(載入:模組集($模組集)){
return $選擇;
}
}
return false;
}
如此一來,對於批次處理的形式,就會精簡多了,而且把中斷的作用往下層推。
實際上,仍然可以將中斷的作用放在批次處理中,像底下這樣:
function 載入:模組集($模組集, $中斷 = true){
$輸出 = true;
$模組集 = &條件:陣列($模組集, false);
foreach($模組集 as $模組 => $條件){
if(!載入:模組($模組, $條件)){
if($中斷){
return false;
}
$輸出 = false;
}
}
return $輸出;
}
如何設計還是要看實際的需求,不過以這個例子來說,在批次處理時並不需要中斷的設計。
而 載入:模組集 函數中,哪些是屬於失敗處理呢?有兩個地方:
第二個部份,他是屬於偵測失敗的處理,這個觀點是將 載入:模組 函數視為一種測試,而非實際的動作(實際上 載入:模組 兼有兩者的特性,這裡注重其測試的特性)。
在過年前其實已經有定見了,不過前幾天跟我的父親吵了一架,心情不是很好,所以遲了幾天才寫,吵架的原因我會另開一篇說明。
首先是函數的特性,從單一處理到批次處理時,針對失敗與中斷的作法,如果要強調「無縫」的特性,其行為特徵應該改成這樣:
單一 | 批次 | |
(全部)成功 | 傳回 true | 傳回 true |
失敗 | 傳回 false | 傳回 false |
中斷 | 丟出中斷訊息 | 傳回 false |
理由很簡單,我們既然不在乎成功或失敗的理由,我們還會在乎失敗的是哪幾個項目嗎?
以一般正常的函數來說,我們所期望的是成功的結果,而非失敗的結果(而目前我們所討論的這類函數,是被嚴格限制的),所以即便是批次處理,也應該遵循一致的作法。
要了解失敗的項目,一般來說是在除錯的時候比較需要,但一旦可以傳回失敗的項目,那麼在應用上就會面臨判斷式的改寫。對於程式流程上的處理,每包一層就要多作判斷,實在是不需要,防止過多的資訊亂竄,也是程式設計要考慮的事項。
接下來讓我們看看改寫後的函數:
function 載入:模組集($模組集){
$模組集 = &條件:陣列($模組集, false);
foreach($模組集 as $模組 => $條件){
if(!載入:模組($模組, $條件)){
return false;
}
}
return true;
}
function 選擇:模組($選擇集){
foreach($選擇集 as $選擇 => $模組集){
if(載入:模組集($模組集)){
return $選擇;
}
}
return false;
}
如此一來,對於批次處理的形式,就會精簡多了,而且把中斷的作用往下層推。
實際上,仍然可以將中斷的作用放在批次處理中,像底下這樣:
function 載入:模組集($模組集, $中斷 = true){
$輸出 = true;
$模組集 = &條件:陣列($模組集, false);
foreach($模組集 as $模組 => $條件){
if(!載入:模組($模組, $條件)){
if($中斷){
return false;
}
$輸出 = false;
}
}
return $輸出;
}
如何設計還是要看實際的需求,不過以這個例子來說,在批次處理時並不需要中斷的設計。
而 載入:模組集 函數中,哪些是屬於失敗處理呢?有兩個地方:
- $模組集 = &條件:陣列($模組集, false);
- if(!載入:模組($模組, $條件)) 判斷式內
第二個部份,他是屬於偵測失敗的處理,這個觀點是將 載入:模組 函數視為一種測試,而非實際的動作(實際上 載入:模組 兼有兩者的特性,這裡注重其測試的特性)。
全站熱搜
留言列表