函數(shù)設(shè)計(jì)心得:盡量避免布爾型參數(shù)
通常來說,我認(rèn)為在設(shè)計(jì)一個(gè)函數(shù)原型的時(shí)候,應(yīng)該盡量避免使用布爾類型的參數(shù),除非函數(shù)名稱能十分清楚的將這個(gè)參數(shù)的意思表達(dá)出來。
我并沒有想教你做事,但是請(qǐng)聽我細(xì)說
先舉兩個(gè)正面的例子,有一個(gè) API 函數(shù) EnableWindow,它用來啟用或禁用一個(gè)窗口。它的第二個(gè)參數(shù)是一個(gè)布爾型參數(shù),如果此參數(shù)傳入 TRUE,則調(diào)用此函數(shù)會(huì)將指定的窗口啟用,傳入 FALSE,則禁用窗口。
另外一個(gè)是 ShowScrollBar 的最后一個(gè)參數(shù),它也是一個(gè)布爾型的。它的含義也十分明顯,如果傳入 TRUE,則表明將會(huì)顯示滾動(dòng)條,如果傳入 FALSE,則會(huì)將滾動(dòng)條隱藏。
這兩個(gè)例子中,布爾型參數(shù)的含義都清楚的體現(xiàn)在了函數(shù)的名稱中,是一個(gè)良好設(shè)計(jì)。
但下面的例子就沒那么顯而易見了。
我們看看這個(gè)函數(shù) CreateEvent,它的第一個(gè)參數(shù)是布爾型的,但如果不查看函數(shù)的文檔,則開發(fā)者很難想象這個(gè)參數(shù)具體的作用是什么??戳宋臋n之后,才會(huì)明白:這個(gè)參數(shù)用來控制是否創(chuàng)建一個(gè)自動(dòng)重置的事件對(duì)象。更進(jìn)一步地,到底是傳入 TRUE 還是 FALSE 來創(chuàng)建一個(gè)自動(dòng)重置對(duì)象呢?每次當(dāng)我調(diào)用這個(gè)函數(shù)的時(shí)候,我都只能老老實(shí)實(shí)的翻開函數(shù)文檔認(rèn)真閱讀,才知道具體應(yīng)該傳入什么布爾值。
我認(rèn)為,這個(gè)參數(shù)應(yīng)該被設(shè)計(jì)為一個(gè) DWORD 或者,如果更優(yōu)雅一些的話,應(yīng)該設(shè)計(jì)為一個(gè)枚舉,類似于:EVENTTYPE_AUTORESET 和 EVENTTYPE_MANUALRESET,這樣就一眼可以看出來參數(shù)的含義了。
更加糟糕的是,CreateEvent這個(gè)函數(shù)中,總共有兩個(gè)布爾型參數(shù),你需要弄明白這些布爾值的含義,還得小心不要記錯(cuò)順序了,這可太糟了。
另外一個(gè)反面例子是:StreamReader(Stream, bool) 這個(gè)函數(shù),我想問問聰明的你,如果先不看函數(shù)文檔的話,你能猜到它的第二個(gè)參數(shù)是什么意思嗎?
總結(jié)
以上只是我的個(gè)人看法,怎么設(shè)計(jì)你的函數(shù)害得你自己決定。
但,為什么不讓生活變得更美好一些呢?
幫助他人(你代碼的閱讀者),善待自己(三個(gè)月后的自己)。