為什么編程應(yīng)遵循“30行”原則

軟件質(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ì)給你帶來幫助式散,但你必須不能讓它支配你棚愤!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市杂数,隨后出現(xiàn)的幾起案子宛畦,更是在濱河造成了極大的恐慌,老刑警劉巖揍移,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件次和,死亡現(xiàn)場離奇詭異,居然都是意外死亡那伐,警方通過查閱死者的電腦和手機(jī)踏施,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罕邀,“玉大人畅形,你說我怎么就攤上這事∷咛剑” “怎么了日熬?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肾胯。 經(jīng)常有香客問我竖席,道長,這世上最難降的妖魔是什么敬肚? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任毕荐,我火速辦了婚禮,結(jié)果婚禮上艳馒,老公的妹妹穿的比我還像新娘憎亚。我一直安慰自己,他們只是感情好弄慰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布第美。 她就那樣靜靜地躺著,像睡著了一般曹动。 火紅的嫁衣襯著肌膚如雪斋日。 梳的紋絲不亂的頭發(fā)上牲览,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天墓陈,我揣著相機(jī)與錄音恶守,去河邊找鬼。 笑死贡必,一個(gè)胖子當(dāng)著我的面吹牛兔港,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仔拟,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衫樊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了利花?” 一聲冷哼從身側(cè)響起科侈,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炒事,沒想到半個(gè)月后臀栈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挠乳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年权薯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睡扬。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盟蚣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卖怜,到底是詐尸還是另有隱情屎开,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布马靠,位于F島的核電站牍戚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虑粥。R本人自食惡果不足惜如孝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娩贷。 院中可真熱鬧第晰,春花似錦、人聲如沸彬祖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽储笑。三九已至甜熔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間突倍,已是汗流浹背腔稀。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工盆昙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人焊虏。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓淡喜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诵闭。 傳聞我的和親對象是個(gè)殘疾皇子炼团,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355