短小
函數(shù)的第一規(guī)則是要短小;第二條規(guī)則則是還要更短小。
函數(shù)應(yīng)該20行封頂。
- 代碼塊和縮進(jìn)
if語(yǔ)句、else語(yǔ)句、while語(yǔ)句等,其中的代碼塊應(yīng)該只有一行,該行大致是一個(gè)函數(shù)調(diào)用語(yǔ)句。這樣不僅能保持函數(shù)短小,而且因?yàn)閴K內(nèi)調(diào)用的函數(shù)擁有較具說(shuō)明性的名稱(chēng),從而增加了文檔的價(jià)值。 - 只做一件事
函數(shù)應(yīng)該做一件事。做好這件事。只做這一件事。
判斷函數(shù)是否做了不止一件事的一個(gè)方法就是能否再拆出一個(gè)函數(shù),這個(gè)函數(shù)不是單純的重新詮釋其實(shí)現(xiàn)。
只做一件事的函數(shù)無(wú)法被合理地切分為多個(gè)區(qū)段。 - 每個(gè)函數(shù)一個(gè)抽象層級(jí)
要確保函數(shù)只做一件事,函數(shù)中的語(yǔ)句都在同一抽象層級(jí)上。
自頂向下讀代碼:向下規(guī)則
我們想讓代碼擁有自頂向下的閱讀順序。我們想讓每個(gè)函數(shù)后面都跟著位于下一抽象層級(jí)的函數(shù),這樣一來(lái),在查看函數(shù)列表是,就能循抽象層級(jí)向下閱讀。我們把這叫做向下規(guī)則。
換一種說(shuō)法我們想要這樣讀程序:程序就像是一系列TO起頭的段落,每一段都描述當(dāng)前抽象層級(jí),并引用位于下一抽象層級(jí)的后續(xù)TO起頭段落。
- switch語(yǔ)句
對(duì)于switch語(yǔ)句,如果只出現(xiàn)一次,用于創(chuàng)建多態(tài)對(duì)象,并且隱藏在某個(gè)繼承關(guān)系中,在系統(tǒng)其他部分看不見(jiàn),就還能容忍。
使用描述性的名稱(chēng)
選擇描述性的名稱(chēng)能理清關(guān)于模塊的設(shè)計(jì)思路,有助于改進(jìn)。
命名方式要保持一致。使用與模塊名一脈相承的短語(yǔ)、名詞和動(dòng)詞給函數(shù)命名。
函數(shù)參數(shù)
零參數(shù)函數(shù) 優(yōu)于 單參數(shù)函數(shù) 優(yōu)于 雙參數(shù)函數(shù);因盡量避免三參數(shù)以上的函數(shù)。
輸出參數(shù)比輸入?yún)?shù)要難以理解。我們慣于認(rèn)為信息通過(guò)參數(shù)傳入函數(shù),通過(guò)返回值從函數(shù)輸出。我們不太期望信息通過(guò)參數(shù)輸出。
-
一元函數(shù)
向函數(shù)傳入單個(gè)參數(shù)有兩種極普遍的理由。- 問(wèn)關(guān)于那個(gè)參數(shù)的問(wèn)題
- 操作參數(shù)
還有一種不那么普遍但仍極有用的單參數(shù)函數(shù)形式,那就是事件。在這種形式中,有輸入?yún)?shù)無(wú)輸出參數(shù)。
所以我們?cè)诿麜r(shí)要注意名稱(chēng)的區(qū)別,讓讀者能輕易分辨是哪種類(lèi)型。 參數(shù)對(duì)象
如果函數(shù)看起來(lái)需要二個(gè)、三個(gè)和三個(gè)以上參數(shù),就說(shuō)明其中一些參數(shù)應(yīng)該封裝成類(lèi)。動(dòng)詞與關(guān)鍵詞
給函數(shù)起個(gè)好名字,能更好的解釋函數(shù)的意圖,以及參數(shù)的順序和意圖。對(duì)于一元函數(shù),函數(shù)和參數(shù)應(yīng)當(dāng)形成一種非常良好的動(dòng)詞/名詞對(duì)形式。
其他
- 分隔指令與詢(xún)問(wèn)
函數(shù)要么做什么事,要么回答什么事,但二者不可兼得。函數(shù)應(yīng)該修改某對(duì)象的狀態(tài),或者返回對(duì)象的有關(guān)信息。 - 使用異常代替返回錯(cuò)誤碼
- 抽離try/Catch代碼塊
- 錯(cuò)誤處理就是一件事
- 別重復(fù)自己
- 結(jié)構(gòu)化編程
每個(gè)函數(shù)、函數(shù)中的每個(gè)代碼塊都應(yīng)該有一個(gè)入口、一個(gè)出口。這意味著每個(gè)函數(shù)中只該有一個(gè)return,不能有break或continue語(yǔ)句,而且永永遠(yuǎn)遠(yuǎn)不能用有g(shù)oto語(yǔ)句。
但是只要函數(shù)保持短小,偶爾出現(xiàn)的return、break或continue語(yǔ)句沒(méi)有壞處。但是goto在小函數(shù)中應(yīng)該盡量避免使用。