這一篇主要是針對 函數設計準則 (2) 所作的修訂,為了讓看的人了解變化的過程,我選擇另開一篇來寫。
在過年前其實已經有定見了,不過前幾天跟我的父親吵了一架,心情不是很好,所以遲了幾天才寫,吵架的原因我會另開一篇說明。

首先是函數的特性,從單一處理到批次處理時,針對失敗與中斷的作法,如果要強調「無縫」的特性,其行為特徵應該改成這樣:

 單一批次
(全部)成功傳回 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 $輸出;
}
如何設計還是要看實際的需求,不過以這個例子來說,在批次處理時並不需要中斷的設計。
而 載入:模組集 函數中,哪些是屬於失敗處理呢?有兩個地方:
  1. $模組集 = &條件:陣列($模組集, false);
  2. if(!載入:模組($模組, $條件)) 判斷式內
第一個部份,我歸類在預防失敗的處理,以這個例子來說,他是屬於將輸入參數格式化的處理,以防輸入的參數不合規格。
第二個部份,他是屬於偵測失敗的處理,這個觀點是將 載入:模組 函數視為一種測試,而非實際的動作(實際上 載入:模組 兼有兩者的特性,這裡注重其測試的特性)。
arrow
arrow
    全站熱搜

    HACGIS 發表在 痞客邦 留言(0) 人氣()