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