短小
函數(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ō)明性的名稱讽坏,從而增加了文檔的價(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)档插,就還能容忍。
使用描述性的名稱
選擇描述性的名稱能理清關(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í)要注意名稱的區(qū)別锚烦,讓讀者能輕易分辨是哪種類型。 參數(shù)對(duì)象
如果函數(shù)看起來(lái)需要二個(gè)蛉拙、三個(gè)和三個(gè)以上參數(shù)彻亲,就說(shuō)明其中一些參數(shù)應(yīng)該封裝成類。動(dòng)詞與關(guān)鍵詞
給函數(shù)起個(gè)好名字畸肆,能更好的解釋函數(shù)的意圖宙址,以及參數(shù)的順序和意圖。對(duì)于一元函數(shù)抡砂,函數(shù)和參數(shù)應(yīng)當(dāng)形成一種非常良好的動(dòng)詞/名詞對(duì)形式。
其他
- 分隔指令與詢問(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)該盡量避免使用直撤。