2017-08-11 117 views
1

我和一位初級開發人員進行了一次代碼審查,並討論了關於布爾人的問題,他在Robert Martin的一本名爲「Clean Code」的書中閱讀了一些內容。他說,這本書解釋說,在參數中使用布爾值是不好的做法,並使代碼更難以測試。具體來說,我們正在談論的代碼類似於下面:將布爾值作爲方法參數是不好的做法嗎?

public static void setActivateValidation(Boolean activate) 
{ 
    System.validation = activate; 
    update System.validation; 
} 

,他正在宣稱是一個非常不好的做法說法相反,它應該是2層的方法,如:

public static void turnOffValidation() 
{ 
    System.validation = false; 
    update System.validation; 
} 

public static void turnOnValidation() 
{ 
    System.validation = true; 
    update System.validation; 
} 

是否有任何第一個例子會被認爲是不好的做法?我個人不喜歡第二個版本,因爲我覺得它只是重複代碼。單元測試在兩個方面都非常相似,而我需要兩種測試。我沒有看到一個人比另一個人測試更復雜。

+1

只要api一致,我也不會感到驚訝。你有這種事情的房子規則? 我可能會重命名setActivateValidation類似toggleValidation來清除它的時間。 更大的問題是System.validation來自哪裏。我希望你把它注入到這個類的構造函數中! –

+0

如果該方法只有一個參數,我不擔心它 – Kai

+0

相關:https://softwareengineering.stackexchange.com/questions/147977/is-it-wrong-to-use-a-boolean-parameter-to -determine-behavior – dan

回答

3

第一版代碼沒有問題。只是一個簡單的邏輯setter。

恕我直言,布爾參數不好的情況是,當你使用這個參數來分支方法內的邏輯。一個簡單的例子:

public void apply(boolean applyForAllUsers) { 
    if (applyForAllUser) { 
     // some logics to apply some operations for all users 
    } else { 
     // some logics to apply some operations for one users 
    } 
} 

壞事情都可能發生這種方法:

  • 方法將繼續增長,因爲它做多件事情。
  • 很難理解,取決於每個邏輯的工作原理。
  • 很難測試。
  • 和很多其他原因。

在這種情況下,重構代碼然後重構代碼的第一個版本更有意義。

+0

這幾乎就是我提到的例子,當我說作者本人想說的話時,我相信作者。 – dphil

+1

@dphil如果下次發生類似事情,請根據您在此代碼審查中的體驗給他一些事實。也許做這個重構,你的評論者建議是一件好事,或者不是。但下一次你會有事實,你會體驗到這一點。所以享受體驗。在下一次做錯和獲得正確的結果要比試圖在第一次嘗試中得到正確的結果要好。祝你好運! – rafaelim

相關問題