軟件質(zhì)量,不但依賴于架構(gòu)及項(xiàng)目管理稀颁,更與代碼質(zhì)量緊密相關(guān)。簡潔高效的代碼不但易于閱讀楣黍,更能避免潛在 Bug 與風(fēng)險(xiǎn)匾灶,提高代碼質(zhì)量。這是顯而易見的道理租漂,但是要做到這個(gè)標(biāo)準(zhǔn)可不容易阶女。想想看,據(jù)說 Oracle 12.2哩治,有近 2500 萬行代碼秃踩,是不是很恐怖?你能做到在不破壞成千上萬個(gè)現(xiàn)有測試的情況下更改這樣產(chǎn)品中的單單一行代碼嗎业筏?很難憔杨,對吧?要想避免這樣的情況蒜胖,就要從源頭做起消别。“30”規(guī)則就是一個(gè)很好的辦法台谢,讓我們看看 Riccardo Giorato 是怎么說的寻狂?
正文:
如果你在編程中,不考慮代碼長度的話朋沮,那么可維護(hù)性蛇券、未來更新或?qū)Υa庫的更改,都將會(huì)變得異常困難。
方法或函數(shù)的大小應(yīng)該多大呢怀读?
我們都遇到過這樣的問題诉位,當(dāng)一個(gè)函數(shù)太長的時(shí)候。
或者類菜枷,或者包苍糠,或者任何其他代碼塊。在某些情況下啤誊,任何一段代碼都有可能會(huì)變得過于龐大岳瞭,以至于他人無法正確理解。但是蚊锹,多大才算大呢瞳筏?
在 Code Complete (《代碼大全》,金戈等人譯牡昆,電子工業(yè)出版社)姚炕, Steve McConnell 指出,理論上丢烘,一個(gè)方法或函數(shù)的最佳最大限制是在一個(gè)屏幕上可以容納的行數(shù)柱宦。
這種“適合屏幕”的尺寸相當(dāng)于 65~200 行之間的函數(shù)的最佳點(diǎn)。這種大小的例程開發(fā)成本更低播瞳,每行代碼的錯(cuò)誤也更少掸刊,而且它們的可維護(hù)性也很高。
如果你寫的代碼超過了 200 行赢乓,那么忧侧,你就會(huì)進(jìn)入了“危險(xiǎn)區(qū)”:代碼的可讀性和正確性即將開始崩潰。
30 行代碼規(guī)則
找尋找更嚴(yán)格的指導(dǎo)原則時(shí)牌芋,你可以在 Stephen Roock 和 Martin Lippert 合著的 Refactoring in Large Software Projects (《大型軟件項(xiàng)目的重構(gòu)》蚓炬,暫無中文版)一書中找到“30”規(guī)則:
如果一個(gè)元素包含超過 30 個(gè)子元素,那么極有可能會(huì)存在嚴(yán)重的問題:
a) 方法的平均代碼行數(shù)不應(yīng)超過 30 行(不含行空和注釋)姜贡;
b) 一個(gè)類應(yīng)該包含平均少于 30 個(gè)方法试吁,最多可以包含 900 行代碼棺棵;
c) 一個(gè)包包含的類不應(yīng)超過 30 個(gè)楼咳,因此最多可包含 27000 行代碼;
d) 應(yīng)當(dāng)避免使用超過 30 個(gè)包的子系統(tǒng)烛恤。這樣一個(gè)子系統(tǒng)最多包含 900 個(gè)類母怜,810000 行代碼;
e) 因此缚柏,一個(gè)有 30 個(gè)子系統(tǒng)的系統(tǒng)苹熏,將擁有 27000 個(gè)類,2430 萬行代碼。
你應(yīng)該遵循這些規(guī)則嗎轨域?如何做袱耽?
使用代碼大小作為編碼規(guī)則還是非常友好的;對于每個(gè)開發(fā)人員來說干发,無論年輕還是碾場朱巨,都很容易看到、理解枉长。其他度量冀续,如用于度量代碼質(zhì)量的循環(huán)復(fù)雜度(cyclomatic complexity),通常更難掌握必峰,并且需要外部工具進(jìn)行檢查洪唐。
將類或函數(shù)長度限制在這些值范圍內(nèi)將是一個(gè)更好的起點(diǎn),而不是對你的團(tuán)隊(duì)或開發(fā)人員沒有真正的參考吼蚁。你還會(huì)發(fā)現(xiàn)凭需,當(dāng)你審查或更新代碼時(shí),這“30”規(guī)則的真正價(jià)值是顯而易見的肝匆。
試圖將這些規(guī)則作為法律或強(qiáng)制性規(guī)則來執(zhí)行功炮,反而會(huì)讓你置于危險(xiǎn)之中——這并不是他們的目標(biāo)。當(dāng)你在編寫方法中寫到第 31 行時(shí)术唬,你不會(huì)希望停下寫代碼薪伏,對吧?
此舉將會(huì)降低工作速度粗仓,并迫使每個(gè)人都將代碼分解以適應(yīng)任意的大小限制嫁怀,這將使他們的代碼風(fēng)格變得更糟,而不是更好借浊。
正如 Jeff Langer 在討論 Ken Beck 在 Clean Code (《代碼整潔之道》塘淑,韓磊譯,人民郵電出版社)一書中提到的簡單設(shè)計(jì)的四條規(guī)則那樣:
我們的目標(biāo)是保持函數(shù)和類短小的同時(shí)蚂斤,保持整個(gè)系統(tǒng)短小精悍存捺。不過要記住,這在關(guān)于簡單設(shè)計(jì)的四條規(guī)則里面是有限相機(jī)最低的一條曙蒸。所以捌治,盡管使類和函數(shù)的數(shù)量盡量少是很重要的,但更重要的確實(shí)測試纽窟、消除重復(fù)和表達(dá)力肖油。
有時(shí)候,要完成一份連貫的工作需要 30 行或多或少的的代碼臂港。
更重要的是森枪,在編寫類時(shí)要小心视搏,要考慮自己在這里添加了多少東西,其他人會(huì)理解這些結(jié)構(gòu)和函數(shù)的分組嗎县袱?我應(yīng)該分割這個(gè)文件呢浑娜,還是講這個(gè)類與另一個(gè)類合并呢?
“30”規(guī)則將會(huì)給你帶來幫助式散,但你必須不能讓它支配你棚愤!