2010-06-03 60 views
6

如果我有一個從幾個地方調用的函數,並且它需要滿足某些條件才能執行,那麼應該在哪裏檢查該條件?在我的情況下,它是爲了繪圖 - 如果按住鼠標按鈕,然後執行繪圖邏輯(當您拖動時,這是在鼠標移動處理程序中完成的)。最佳實踐 - 什麼時候評估函數執行的條件

選項一表示將它放入函數中它保證被檢查。抽象的,如果你願意的話。

public function Foo() { 
    DoThing(); 
} 

private function DoThing() { 
    if (!condition) return; 
    // do stuff 
} 

我有這樣的問題是閱讀的Foo的代碼,這可能是遠離DoThing時,它看起來像一個bug。首先想到的是條件沒有被檢查。

然後,選項二在調用之前進行檢查。

public function Foo() { 
    if (condition) DoThing(); 
} 

這讀起來更好,但現在你不必擔心從你所說的任何地方檢查。

選項三是重命名該函數以更具描述性。

public function Foo() { 
    DoThingOnlyIfCondition(); 
} 

private function DoThingOnlyIfCondition() { 
    if (!condition) return; 
    // do stuff 
} 

這是「正確的」解決方案嗎?或者這是否有點過分?我覺得如果一切都像這個函數名稱將開始重複他們的代碼。

關於這是主觀的:當然是,並且可能沒有正確的答案,但我認爲它在這裏仍然完美。從更好的程序員那裏獲得建議,而不是我第二個最好的學習方式。主觀問題正是Google無法回答的問題。

回答

5

根據DRY的說法,我會選擇第一個。

public function Foo() { 
    DoThing(); 
} 

private function DoThing() { 
    if (!condition) return; 
    // do stuff 
} 

一旦你習慣的模式,它不是那麼令人不安看到代碼中的孤獨DoThing()。你會開始像EnsureThingDone()一樣閱讀它。

+2

這回答了結構問題。至於名稱,多思考一點應該產生一個適當的描述性而不重複的選擇。也許在'DoThing()'的'DrawOnDrag()'方面有一些東西。 – Novelocrat 2010-06-03 13:18:19

0

我要檢查裏面的功能的前提條件,

public function DoThing() 
{ 
    ValidatePreconditions(); 
    DoWork(); 
} 

private function DoWork() 
{ 
    //Do the actual work; 
} 

這樣,我敢肯定所有適當的前提條件我的函數的執行之前得到滿足,並沒有必要爲消費者增添unnecesary每一個代碼我的功能被調用。

0

您可以使用類型系統。將該參數設置爲DoThing一個對象,只有在傳遞了前提條件時才能實例化該對象。

一個整潔的方式來做到這一點將是使DoThing在該對象上的實例方法。

2

選項四,將謂詞和實際調用包裝在第三個函數中。

function DoThing() { 
    // do stuff 
} 

function DoThingOnlyIfCondition() { 
    if (!condition) return; 
    DoThing(); 
} 

function Foo() { 
    DoThingOnlyIfCondition(); 
} 

// Foo version 2 
function FooBar() { 
    DoThing(); 
} 

現在Foo或其他函數可以使用最合適的DoXXX()版本。