2010-09-03 75 views
3

假設我有一個函數,只有在定義了某個常量時才應該執行。以下哪項會更好風格問題:如果阻止功能或功能?

選項1:包裝在一個if塊中的所有函數調用:

if(defined('FOO_BAR_ENABLED')) { 
    foobar(); 
} 

我想,這樣的意圖較爲明確,但它需要檢查每一次定函數被調用。

選項2:檢查功能本身不變:

function foobar() { 
    if(!defined('FOO_BAR_ENABLED')) { 
    return; 
    } 
    //do stuff 
} 

這種方式需要較少的代碼行,並不斷肯定會得到遏制。但是,我發現當它實際上沒有做任何事情時,看到對這個函數的調用會感到困惑。思考?

回答

10

我可以建議將函數重命名爲FoobarIfEnabled(),然後在函數中進行檢查嗎?

從一個偉大的語言無關answer to one of my own questions寬鬆竊取,編程時,我們有以下的憂慮:

  1. 讓它正確。
  2. 說清楚。
  3. 簡潔。
  4. 快點。 ... 以該順序。

如果您在功能外進行檢查,最終可能會在一個地方丟失它。如果你想改變行爲,你必須找到所有被調用的地方並修復它。這是違反原則1的維護夢魘。通過在名稱中添加「IfEnabled」或類似的東西,現在它不僅正確,而且很明顯。你怎麼能擊敗?

除非最終速度不令人滿意,並且您已將此視爲瓶頸(不太可能),否則性能不用擔心。

我建議你按照上面的鏈接閱讀,因爲這是一個非常有用的答案,給了我很多想法。

0

選項2,減少代碼,並確保按照您的建議定義常量。

1

if的條件是否屬於該功能的責任範圍?在沒有if的情況下調用函數是否有用例?

如果條件總是需要檢查,我會把它放在函數中。遵循DRY原則:不要重複自己。另一個可能有用的訣竅是SRP - 單一責任原則 - 做一件事,做得很好。

2

方案3:

void maybe_foobar() { 
    if(defined('FOO_BAR_ENABLED')) really_foobar(); 
} 

void really_foobar() { 
    // do stuff 
} 

一個很好的一天我會想好名字的不是「可能」與「真」,但它取決於使用的功能做什麼和爲什麼它關閉 - 和 - onable。

如果沒有這種情景下,任何人都可以有效方式「做的東西」沒有定義FOO_BAR_ENABLED的時候,那麼我會去與你的選項2(也許調用函數do_stuff_if_possible而非foobar,如果名稱foobar是引起混淆是否調用它實際上需要做任何事情)。如果「做東西」總是有效的,但有些用戶只是這樣做有條件,那麼我會選擇我的選項3.

選項1將導致您複製和粘貼代碼,這幾乎總是一個不好的跡象。

[編輯:這裏的選項4,我懷疑是過度工程,但你永遠不知道:

void if_enabled(string str, function f) { 
    if (defined(str + '_ENABLED')) f(); 
} 

然後你把它叫做:

if_enabled('FOO_BAR', foobar); 

顯然,有一些問題,用你的語言處理函數的方式,以及是否有任何方法通過if_enabled傳遞任意參數和返回值。]

1

在頭文件中,if foob​​ar的始終以相同數量的參數,

 
#ifdef ENABLE_FOOBAR 
#define maybe_foobar(x) foobar(x) 
#else 
#define maybe_foobar(x) 
#endif 

不知道如何做,在C++或以上ç方言如果foobar的可以採取可變數目的參數。那麼,上面的技術就是我在它的語言裏提出的建議;也許是對那些有缺少宏的語言使用內聯函數)。

0

由於這顯然只與foobar()函數一起使用,所以選項2應該是您的選擇。這意味着測試僅位於一個地方,您的代碼更具可讀性。