每個軟件工程師都希望看到好代碼铆惑,從好代碼中學(xué)習(xí)范嘱,并進(jìn)一步寫出好代碼。然而员魏,“橫看成嶺側(cè)成峰”丑蛤,每個人對好代碼的理解可能不盡相同,好代碼是每個人心中那個不同的哈姆雷特嗎撕阎?
從不同的角度看好代碼受裹,雖然不夠完善,或者有失偏頗虏束,但可以為討論“好代碼”提供一些切入的維度棉饶。
1. 莫將畫竹論難易——大道至簡
最重要的可能是——代碼必須簡單。對于少數(shù)人來說魄眉,復(fù)雜的代碼很好思考砰盐,但是簡單的代碼很容易被所有人理解。如果喜歡保密的話坑律,那么應(yīng)該去從事魔術(shù)表演岩梳,而不是編程寫代碼的工作。
KISS 原則體現(xiàn)了簡單就是美晃择,據(jù)說有多個版本:
Keep It Simple and Stupid冀值;
Keep It Sweet and Simple;
Keep It Short and Simple宫屠;
Keep it Simple, Sweetheart列疗;
Keep it Simple, Sherlock。
代碼的設(shè)計越簡單越好浪蹂,任何沒有必要的復(fù)雜都是需要避免的抵栈。
2. 竹竿頭上愿絲多——少即是多
一般地,更多的代碼往往意味著它更復(fù)雜坤次,往往需要更多的時間來理解古劲,維護十行代碼的成本往往不是維護一行代碼成本的10倍。尋找機會缰猴,將軟件分解為更少的代碼模塊产艾,以鼓勵代碼的重用。
Less is More, 簡單的東西往往帶給人們的是更多的享受,好的代碼也是如此闷堡。
3. 共看明月皆如此——可讀性強
好的代碼應(yīng)該是所有讀者都能理解的隘膘,不僅僅是為了執(zhí)行而編寫的。每一行都應(yīng)該是出于實際的原因而寫的杠览,但是在實踐中弯菊,代碼會被其他人閱讀,所以它必須是可讀的踱阿。它應(yīng)該是有意義的误续;命名約定、縮進(jìn)扫茅、分號等都應(yīng)該是提高可讀性的合理語法的一部分。閱讀代碼育瓜,就像閱讀優(yōu)美的文章一樣流暢葫隙。
4.云解有情花解語——自我解釋
盡管注釋和外部文檔非常有用,但它們不是編寫良好的自我解釋代碼的替代品躏仇。好的代碼本身就是最好的說明文檔恋脚,無需解釋就能讓別人明白,每一行代碼都應(yīng)該是這樣焰手。
但是糟描,代碼自解釋不是不寫注釋的理由,即使變量书妻、方法船响、類、函數(shù)躲履、模塊的名稱是自解釋的见间,但這些并不能描述出代碼的全貌。
5. 清池不測通滄汗げ拢——可測性好
只要編寫了代碼米诉,就可以測試代碼。每次執(zhí)行代碼并檢查其效果時篷帅,都在測試它史侣,但這不應(yīng)該是測試代碼的唯一方法。單元測試是好代碼的一部分魏身,單元測試常常記錄了代碼的意圖惊橱。單元測試用例能成功運行的前提是該方法內(nèi)部的所有邏輯必須是能正常運行的,編寫可測試的代碼使其具有了可塑性叠骑。
6.伐竹為橋結(jié)構(gòu)同——可被重構(gòu)
重構(gòu)是在不改變行為的情況下改變實現(xiàn)李皇。如果沒有測試來證明行為沒有改變,就不能真正重構(gòu)。如果有一個公共接口掉房,那么對代碼進(jìn)行更改茧跋,以使公共接口更改,這不是重構(gòu)卓囚,而是重寫瘾杭。
真正可以重構(gòu)的代碼是可以用更少的努力改進(jìn)的代碼,不費吹灰之力就能改進(jìn)的代碼是好代碼哪亿,價值體現(xiàn)主要在于可維護性和可擴展性粥烁。
7. 因君為問平安否——安全可靠
采用良好的編程風(fēng)格,可以防范大多數(shù)編碼錯誤蝇棉。用懷疑的眼光審視所有的輸入和所有的結(jié)果讨阻,采用防御式編程,直到可以能證明它們正確時為止篡殷。如果無法使用安全的數(shù)據(jù)結(jié)構(gòu)钝吮,就要對不安全的數(shù)據(jù)類型系統(tǒng)地使用安全操作。重視所有稀有的資源板辽,審慎地管理它們的獲取和釋放奇瘦。
安全可靠是永恒的主題,可靠劲弦、可預(yù)測和平實的代碼才可能是安全的耳标,重視安全從每一行代碼做起。
8. 專一始終無變異——職責(zé)單一
好的代碼“塊”有一個單一的責(zé)任邑跪,應(yīng)該做一件事次坡,并做好它,具有功能的明確性画畅。符合單一職責(zé)原則的代碼會由更多的小規(guī)模但目標(biāo)更明確的代碼組成贸毕,然后通過接口抽象以及在運行時將無關(guān)功能的責(zé)任委托給相應(yīng)的接口來達(dá)成目標(biāo),目的就是提高代碼的可維護性夜赵、可讀性明棍、擴展性。
9. 有似山開萬里云——公開分享
編程就是一項運動寇僧,通過不斷地練習(xí)摊腋,不斷地向他人學(xué)習(xí),才能不斷地提高代碼的質(zhì)量嘁傀。改進(jìn)代碼的好方法之一是共享代碼并通過共享接受更改兴蒸,也是另一種程度上的復(fù)用。代碼開源或許是走向好代碼的路徑之一细办,可惜老碼農(nóng)從社區(qū)獲得很多橙凳,貢獻(xiàn)很少蕾殴,慚愧之至。
10.萬態(tài)千端一瞬中——只有更好
總有更好的程序員寫出更好的代碼岛啸,總會有更好的解決方案钓觉,可以通過共享和重構(gòu)來改進(jìn)代碼。如果好代碼可以改進(jìn)坚踩,就應(yīng)該改進(jìn)荡灾,因此是暫時的。好代碼可能不是一次性的瞬铸,要為未來寫代碼批幌,沒有最好,只有更好嗓节。
關(guān)聯(lián)閱讀:
紙上得來終覺淺——成長的10條...
Bug與Debug的隨筆
無我編程的10條誡律
關(guān)于軟件開發(fā)荧缘,都應(yīng)該知道的10個常識
軟件架構(gòu)的10個常見模式
如何進(jìn)入一個新領(lǐng)域
PHP 是最好的語言嗎?
一個函數(shù)的自白
6行python代碼的愛心曲線
10行Python代碼的詞云
一行Python代碼