簡(jiǎn)介
??? 函數(shù)是代碼的靈魂,函數(shù)的好壞直接體現(xiàn)代碼的質(zhì)量,決定代碼的可讀性昔逗。
應(yīng)遵循的規(guī)則
函數(shù)編寫(xiě)應(yīng)該遵循一些基本的規(guī)則。
短小
?????? 冗長(zhǎng)的函數(shù)會(huì)增加代碼閱讀的復(fù)雜性篷朵,極大降低代碼的閱讀速度纤子。函數(shù)編寫(xiě)最主要的規(guī)則是短小。上世紀(jì)的共識(shí)是函數(shù)的長(zhǎng)度不應(yīng)該長(zhǎng)于一屏,而如今隨著顯示技術(shù)的發(fā)展控硼,一些優(yōu)秀的工程師建議函數(shù)長(zhǎng)度不應(yīng)該超過(guò)100行泽论,20行封頂為最佳。在代碼的邏輯中卡乾,時(shí)常包含諸如if,else等邏輯判斷代碼以及while等循環(huán)邏輯代碼翼悴, 合理的建議是這些判斷和循環(huán)邏輯中的代碼塊應(yīng)該只包含一行語(yǔ)句,這行語(yǔ)句一般就是一個(gè)函數(shù)調(diào)用幔妨,如此不但可以保持函數(shù)短小鹦赎,還可以通過(guò)代碼塊中調(diào)用函數(shù)的名稱增強(qiáng)文檔的價(jià)值。函數(shù)不應(yīng)該大到足以容納所有的嵌套結(jié)構(gòu)误堡,函數(shù)的縮進(jìn)層級(jí)不應(yīng)該多于一層或者兩層古话,這樣可以便于代碼的閱讀以及理解。
只做一件事
?????? 強(qiáng)烈建議一個(gè)函數(shù)應(yīng)該只是完成一件事锁施,做好一件事陪踩,只做一件事。函數(shù)內(nèi)的邏輯應(yīng)該清晰明了悉抵,降低代碼間的耦合度肩狂,一個(gè)合理的函數(shù)應(yīng)該是“原子”的,也就是不可以再拆分成多個(gè)函數(shù)姥饰。
合理的抽象層級(jí)
?????? 要想保證函數(shù)只是做好一件事傻谁,那么函數(shù)中的語(yǔ)句應(yīng)該都在一個(gè)抽象層級(jí)上×蟹啵混雜不同抽象層級(jí)的函數(shù)很容易會(huì)讓讀者產(chǎn)生困擾审磁,讀者很可能無(wú)法判斷某個(gè)表達(dá)式是基礎(chǔ)概念還是細(xì)節(jié),而一旦細(xì)節(jié)與基礎(chǔ)概念混雜岂座,更多的細(xì)節(jié)就會(huì)在函數(shù)中糾結(jié)起來(lái)态蒂。我們總是以自頂向下的順序閱讀代碼的。編寫(xiě)代碼時(shí)應(yīng)該時(shí)時(shí)注意向下規(guī)則掺逼,在當(dāng)前函數(shù)中只是描述當(dāng)前抽象層級(jí),并且引用下一層級(jí)瓤介。
使用描述性的名稱
????? 在上一章《有意義的命名》中詳細(xì)講過(guò)函數(shù)的命名吕喘,在這里再次強(qiáng)調(diào)函數(shù)命名要使用描述性的名稱。如果我們堅(jiān)持了上述只做一件事的規(guī)則刑桑,那么我們的函數(shù)就短小氯质、功能集中,函數(shù)越短小祠斧,功能越集中闻察,函數(shù)名稱越好取。花時(shí)間取個(gè)好名字是值得的辕漂,這有助于理清模塊的設(shè)計(jì)思路呢灶。
函數(shù)參數(shù)
???? 函數(shù)的參數(shù)應(yīng)該越少越好,零參是最理想的情況钉嘹,除非有充足的理由鸯乃,要不然不要輕易使用三個(gè)以上的參數(shù)。函數(shù)的參數(shù)越多跋涣,要覆蓋所有情況的測(cè)試用例組合就越多缨睡,這將極大的增加測(cè)試的復(fù)雜性。
減少重復(fù)性
??? 代碼編寫(xiě)最忌諱重復(fù)造輪子陈辱,我們一定要將重復(fù)的代碼抽象出來(lái)組成新函數(shù)以供調(diào)用奖年。