2010-10-02 89 views
5

是否有一些規則何時使用兩個函數或何時傳遞布爾參數。兩個函數或布爾參數?

感謝

+2

是什麼,即使是什麼意思?你能提供一個代碼示例嗎? – NullUserException 2010-10-02 17:58:29

+0

是的,有很多規則。所有這些都是矛盾的,所有這些都是個人(或團隊)偏好的問題。我個人的規則很簡單:如果我覺得需要給方法添加註釋或者調用方法,我需要改變它。 – Tergiver 2010-10-02 18:02:24

回答

7

它已經有一段時間,因爲我最後再閱讀代碼完成,但我依稀記得麥康奈爾解決這個,的一句「轉折conherence」跳進我的腦海。簡單地說,

void f(int x, int y, bool b) 

void f1(int x, int y) 
void f2(int x, int y) 

往往是一個選擇,這取決於f如何相似或不同將true下的行爲與false,它可能是有意義的掰成兩個函數,給他們不同的名字。通常第三種選擇更好,即將bool更改爲兩值枚舉,其中枚舉名稱明確區分。

關鍵是看看電話網站,看看它的意思是否清楚,只是通過閱讀代碼。如果你很想把一個評論對每一個布爾調用點:

f(3, 4, true /* absoluteWidgetMode */) 

,被呼叫的網站通常與布爾常數打電話,這是一個強烈的氣味,你應該把它分解成多種功能。

4

布爾參數意義大部分的時間,基本上值得同樣的批評幻數做的。您只有查看函數調用,纔有可能不瞭解所做的事情。

因此,即使爲非常相似的代碼(追加/覆蓋文件)提供布爾參數很方便,請將其保留爲內部私有,並且不要讓它在界面中可見。

相反,總是迫使程序員是明確

使用枚舉給予了區別有意義的說明或只使用獨立的功能

比較:

WriteFile(path, "Hello, World", true) 

WriteFile(path, "Hello, World", FileMode.Append) 

或者乾脆

AppendFile(path, "Hello, World") 
+2

請注意,這不適用於具有命名參數的語言。 'WriteFile(Append:True)'可能與'WriteFile(Mode:FileMode.Append)'一樣可讀。 – sepp2k 2010-10-02 18:42:13

+0

@ sepp2k:雖然我不喜歡命名參數的方法 - 儘管是冗長的 - 因爲它們的使用沒有被強制執行,因此仍然可能發生無意義的參數(例如由於懶惰)。強制使用參數名稱會改善情況,但可能會降低抽象的可能性(高階函數,委託,部分應用程序,默認編程)。在這種情況下,強類型或不同功能仍然是最佳選擇。 – Dario 2010-10-03 08:48:05