《代碼整潔之道》精讀與演繹】之一 讓代碼比你來(lái)時(shí)更干凈
“我們就是一群代碼猴子,上躥下跳,自以為領(lǐng)略了編程的真諦??上М斘覀冏ブ?zhù)幾個(gè)酸桃子,得意洋洋坐到樹(shù)枝上,卻對自己造成的混亂熟視無(wú)睹。那堆“可以運行”的亂麻程序,就在我們的眼皮底下慢慢腐壞。”
本文引用地址:http://dyxdggzs.com/article/201608/295974.htm——《代碼整潔之道》作者 RobertC.Martin,于SD West 2007技術(shù)大會(huì )
一、系列文章前言
敲完上面這段文字的時(shí)候,心里在想,一個(gè)剛踏入編程生涯的新人,要經(jīng)歷多少的淬煉,才能領(lǐng)略到Bob大叔所謂的編程的真諦。
有人說(shuō),這個(gè)過(guò)程會(huì )很漫長(cháng),大概至少是在讀完N本編程領(lǐng)域的經(jīng)典著(zhù)作,并經(jīng)過(guò)大量的思考與實(shí)踐之后。
而寫(xiě)這個(gè)系列的起因,正是因為最近閑暇時(shí)一直在閱讀一些之前一直想看的經(jīng)典著(zhù)作,并有將閱讀過(guò)程中一些思考和總結記錄下來(lái)。為了不枉費這些閱讀、思考與總結的過(guò)程,決定將這些零散的內容整理成文,沉淀下來(lái)。過(guò)些年后再回首,也許會(huì )覺(jué)得當時(shí)的一些思考,彌足珍貴。
這個(gè)系列的文章,不僅僅是讀書(shū)筆記,而是對一本書(shū)核心內容的全新演繹,內容解刨,與重組。希望自己的這些文字,能對各位想進(jìn)一步了解這些經(jīng)典著(zhù)作的讀者們有所幫助。
二、《代碼整潔之道》其書(shū)
《代碼整潔之道》(《Clean Code》)是幾乎每一個(gè)對編程境界有追求、有志于改善代碼質(zhì)量的編程者,都應該閱讀的一本好書(shū)。
這本書(shū)提出了一個(gè)觀(guān)點(diǎn):代碼質(zhì)量與其整潔度成正比,干凈的代碼,既在質(zhì)量上可靠,也為后期維護、升級奠定了良好基礎。
書(shū)中介紹的規則均來(lái)自作者多年的實(shí)踐經(jīng)驗,涵蓋從命名到重構的多個(gè)編程方面,雖為一“家”之言,然誠有可資借鑒的價(jià)值。
三、本文涉及知識點(diǎn)思維導圖
先放出這篇文章所涉及內容知識點(diǎn)的一張思維導圖,就開(kāi)始正文。大家若是疲于閱讀文章正文,直接看這張圖,也是可以Get到本文的主要知識點(diǎn)的大概。
四、糟糕代碼,是如何產(chǎn)生的
最初的問(wèn)題來(lái)了,我們都不喜歡壞代碼,為何壞代碼還總會(huì )產(chǎn)生?
拋開(kāi)編程者本身技藝的問(wèn)題,答案也許是想要快點(diǎn)完成任務(wù),項目進(jìn)度趕著(zhù)時(shí)間,或許我們只是不耐煩再繼續做這個(gè)需求,渴望它能早點(diǎn)結束。
很多時(shí)候,會(huì )有一堆事情壓著(zhù)你去完成,你覺(jué)得自己需要趕緊弄完手上的東西,好接著(zhù)做下一件工作,所以,為了走捷徑,為了特定實(shí)現功能而強加的糟糕的代碼,就悄悄地誕生了。我們都曾經(jīng)瞟一眼自己親手造成的混亂,決定棄之不顧,走向新的一天,等有朝一日再來(lái)清理。
然而中國古訓有云,“明日復明日,明日何其多”,勒布朗(LeBlanc)法則也表示,“稍后等于永不。”你會(huì )發(fā)現,因為各種各樣的原因,很多時(shí)候你根本都不會(huì )(沒(méi)時(shí)間)去整理之前的代碼。所以,正如本書(shū)作者Robert C.Martin(Uncle Bob),在SD West 2007技術(shù)大會(huì )上所說(shuō)的,“那堆“可以運行”的亂麻程序,就在我們的眼皮底下慢慢腐壞。”
我們知道,壞代碼會(huì )污染環(huán)境,最后會(huì )壞掉整個(gè)項目。保持整潔的習慣,發(fā)現臟代碼就要及時(shí)糾正?;〞r(shí)間保持代碼代碼整潔,不但有關(guān)效率,還有關(guān)項目的生存。
五、為什么好代碼會(huì )很快變質(zhì)?
為什么好代碼會(huì )很快變質(zhì)?一般情況下,需求一直在變更、需求變化違背了初期設計、進(jìn)度太緊是導致好代碼變質(zhì)的誘因。
多數的產(chǎn)品經(jīng)理想要好的代碼,即便他們總是癡纏于進(jìn)度,他們會(huì )奮力的維護進(jìn)度和需求。而程序員們則當以同等的熱情捍衛代碼的整潔性和可擴展性。
舉個(gè)栗子,如果你是醫生,病人在請求給給他們做手術(shù)前別洗手,因為那會(huì )花太多時(shí)間,你會(huì )照辦嗎?本該是病人說(shuō)了算,但醫生卻絕對應該拒絕遵從。為什么?因為醫生比病人更了解疾病個(gè)感染的風(fēng)險。醫生如果按病人說(shuō)的辦,就是一種不專(zhuān)業(yè)的態(tài)度。
同理,程序員遵從不了解混亂代碼風(fēng)險的產(chǎn)品經(jīng)理(策劃)的意愿,都是不專(zhuān)業(yè)的做法。
六、程序員的基礎價(jià)值謎題
程序員都面臨著(zhù)一種基礎價(jià)值的謎題。有那么幾年經(jīng)驗的開(kāi)發(fā)者都知道,之前的混亂拖了自己的后腿,但開(kāi)發(fā)者背負期限的壓力,只好制造混亂。簡(jiǎn)言之,他們沒(méi)花時(shí)間讓自己做得更快。
而其實(shí)真正專(zhuān)業(yè)的人士明白,這道謎題第二部分說(shuō)錯了,制造混亂無(wú)助于趕上期限,混亂只會(huì )立刻拖慢你,叫你錯過(guò)期限,趕上期限的唯一方法——做得更快的唯一方法——就是始終盡可能保持代碼的整潔。
七、大師們眼中的整潔代碼
到底什么是整潔的代碼?有多少程序員,就有多少定義。 “大師級程序員把系統當故事來(lái)講,而不是當做程序來(lái)寫(xiě)”。就讓我們一起看看經(jīng)驗豐富的大師級程序們都是如何定義整潔代碼的。
Bjarne Stroustrup ,C++語(yǔ)言之父, The C++ Programming Language(中譯版《C++程序設計語(yǔ)言》)一書(shū)作者:
“我喜歡優(yōu)雅和高效的代碼,代碼邏輯應直截了當,叫缺陷難以隱藏;盡量減少依賴(lài)關(guān)系,使之便于維護;一句某種分層戰略完善錯誤處理代碼;性能調至最優(yōu),省得引誘別人做沒(méi)規矩的優(yōu)化,搞出一堆混亂來(lái)。整潔的代碼只做好一件事。”
Grady Booch,Object Orient Analysis and Design with Application(中譯版《面向對象程序分析與設計》) 一書(shū)作者:
“整潔的代碼簡(jiǎn)單直接,整潔的代碼如優(yōu)美的散文。整潔的代碼從不隱藏設計者的意圖,充滿(mǎn)了干凈利落的抽象和直截了當的控制語(yǔ)句。”
Michael Feathers,Working Effectively withLegacy programming(中譯版《修改代碼的一書(shū)》)一書(shū)的作者:
“整潔的代碼總是看起來(lái)想是某位特別在意它的人寫(xiě)的,幾乎沒(méi)有改進(jìn)的余地,代碼作者署名都想到了,如果你企圖改進(jìn)它,總會(huì )回到原點(diǎn),贊嘆某人留給你的代碼——全心投入到某人留下的代碼。”
Ron Jeffries,Extreme Programming Installed(中譯版《極限編程實(shí)施》)以及Extreme Programming Adventures in (C#中譯版《C#極限編程探險》)作者:
“減少重復的代碼,提高表達力,提早構建簡(jiǎn)單抽象,這就是我寫(xiě)整潔代碼的方法。”
八、編寫(xiě)代碼的難度,取決于周邊代碼的閱讀難度
編寫(xiě)代碼的難度,取決于周邊代碼的閱讀難度。何出此言?因為各種實(shí)踐與統計表明,在項目里開(kāi)發(fā)新功能的過(guò)程中,閱讀之前代碼與書(shū)寫(xiě)新的代碼,花費的時(shí)間比例超過(guò)10:1,新寫(xiě)代碼時(shí),我們一直在讀舊代碼。既然比例如此之高,我們就應該讓讀的過(guò)程變得輕松,即便那會(huì )使得編寫(xiě)過(guò)程更難。
所以說(shuō),編寫(xiě)代碼的難度,取決于周邊代碼的閱讀難度,想要快速實(shí)現需求,想要快速完成任務(wù),想要輕松的寫(xiě)代碼,先讓你書(shū)寫(xiě)的代碼整潔易讀吧。
九、讓代碼比你來(lái)時(shí)更干凈
我們知道,光把代碼寫(xiě)好可不夠,必須時(shí)時(shí)保持代碼整潔,我們都見(jiàn)過(guò)代碼隨著(zhù)時(shí)間的流逝而腐壞。我們應該更積極地阻止腐壞的發(fā)生。
借用美國童子軍的一條簡(jiǎn)單的軍規,應用到我們的專(zhuān)業(yè)領(lǐng)域:
“讓營(yíng)地比你來(lái)時(shí)更干凈。”
那么可以同樣對編程領(lǐng)域這樣說(shuō):
“讓代碼比你來(lái)時(shí)更干凈。”
也就是說(shuō),如果我們每次簽入時(shí),代碼都比簽出時(shí)干凈,那么代碼就不會(huì )腐壞。這就是我們需要遵從的代碼整潔之道。
十、本文涉及知識點(diǎn)提煉整理
文章開(kāi)頭部分已經(jīng)用思維導圖的方式展現了本文的知識點(diǎn),這邊再貼出一個(gè)文字列表版,方便大家整理:
1. 編寫(xiě)代碼的難度,取決于周邊代碼的閱讀難度。想要快速實(shí)現需求,想要快速完成任務(wù),想要輕松的寫(xiě)代碼,請先讓你書(shū)寫(xiě)的代碼整潔易讀。
2. 保持整潔的習慣,發(fā)現臟代碼就要及時(shí)糾正?;〞r(shí)間保持代碼代碼整潔,這不但有關(guān)效率,還有關(guān)項目的生存。
3. 程序員遵從不了解混亂風(fēng)險的產(chǎn)品經(jīng)理(策劃)的意愿,都是不專(zhuān)業(yè)的做法。
4. 讓代碼比你來(lái)時(shí)更干凈:如果每次簽入時(shí),代碼都比簽出時(shí)干凈,那么代碼就不會(huì )腐壞。
5. 趕上期限的唯一方法,做得更快的唯一方法,就是始終盡可能保持代碼的整潔。
本文就此結束。
下篇文章,我們將繼續《代碼整潔之道》的精讀與演繹,探討更多的內容。
Best Wish~
評論