2017-10-17 163 views
0

我負責的幾個函數與一些代碼味道:函數返回值或整數狀態代碼重構

public function example($a, $b, $c) { 
    $something = doSomething($a); 
    $more = doMoreStuff($b,$c); 
    $evenMore = doEvenMoreStuff($a,$c); 

    if(!$something) { 
     //error code because blablabla 
     return 1; 
    } 

    if(!$something and $more == "whatever") { 
     //another different error because blebleble 
     return 2; 
    } 

    if(!$more) { 
     //this means another error because bliblibli 
     return 3; 
    } 

    if(!$evenMore) { 
     //yep, error, returning code error 4 
     return 4; 
    } 

    //etc... 

    //if no errors 
    return $something + $more + $evenMore; 
} 

我應該如何處理這些錯誤代碼?我想在像這樣創建具有常量值的類:

class ExampleError { 

    const BLABLABLA = 1; 
    const BLEBLEBLE = 2; 
    const BLIBLIBLI = 3; 
    const BLOBLOBLO = 4; 
} 

然後重構功能多變的線條像

return 1;;

return ExampleError::BLABLABLA;

試圖使其更具可讀性。有更好的方法嗎?

回答

1

這取決於應用程序的其餘部分是如何編寫的以及您稱爲「錯誤」的確實是錯誤還是可預測的合法邊緣情況。

第一個代碼的氣味是「幻數」;是的,用符號常量替換它們。

第二個代碼味道是你的返回簽名不是「乾淨的」 - 你要麼返回一個錯誤代碼,要麼返回一個結果集。這樣做,您需要調用代碼來理解代碼的語義 - 它需要知道BLABLABLA是連接到數據庫的不可恢復的錯誤,並且BLEBLEBLE意味着您在某處違反了某些約束。

您的問題表明您的代碼在生成結果時可能會遇到錯誤; 「最乾淨」的方式是使用例外來指示錯誤。異常具有內置語義或指示出錯,可以「包裝」並可以在調用堆棧中傳播。因此,如果BLABLABLA意味着您無法連接到數據庫,則調用您的函數的方法可以將該備份傳回到UI,而UI不必知道BLABLABLA意味着「無法連接到數據庫」。

當然,異常處理也會變得麻煩,並且可能會使代碼不易讀,所以您真的只想用它來處理錯誤,而不是邊緣情況。

編輯

(我假設你正在使用PHP,因此取得了特定於語言的鏈接)

missing ID field聽起來像一個典型的argument exception - 這調用此方法具有無效這樣做的代碼論據。你的函數不能指望這樣優雅地處理,所以這是一個合理的例外。

problem updating data聽起來像一個數據庫異常 - 您已經運行了一條SQL語句,但收到了一條錯誤消息。你的方法不能做它承諾的事情,並沒有明顯的恢復方式。可能是regular exception.

invalid status - 可能是另一個無效的論點,或者某種邏輯問題。再一次,你的函數不能處理這個問題,它不是函數通常採取行動的邊緣情況。

+0

mmm,錯誤包括'丟失的ID字段','問題更新數據','無效狀態',...(他們是邊緣情況?),感謝術語「幻數」 – vivoconunxino

+0

謝謝內維爾,我真的感謝你的taughts – vivoconunxino