新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 《代碼整潔之道》精讀與演繹】之一 讓代碼比你來時更干凈

《代碼整潔之道》精讀與演繹】之一 讓代碼比你來時更干凈

作者: 時間:2016-08-24 來源:網(wǎng)絡(luò) 收藏

  “我們就是一群猴子,上躥下跳,自以為領(lǐng)略了編程的真諦??上М?dāng)我們抓著幾個酸桃子,得意洋洋坐到樹枝上,卻對自己造成的混亂熟視無睹。那堆“可以運(yùn)行”的亂麻程序,就在我們的眼皮底下慢慢腐壞。”

本文引用地址:http://www.butianyuan.cn/article/201608/295974.htm

  ——《整潔之道》作者 RobertC.Martin,于SD West 2007技術(shù)大會

  一、系列文章前言

  敲完上面這段文字的時候,心里在想,一個剛踏入編程生涯的新人,要經(jīng)歷多少的淬煉,才能領(lǐng)略到Bob大叔所謂的編程的真諦。

  有人說,這個過程會很漫長,大概至少是在讀完N本編程領(lǐng)域的經(jīng)典著作,并經(jīng)過大量的思考與實(shí)踐之后。

  而寫這個系列的起因,正是因?yàn)樽罱e暇時一直在閱讀一些之前一直想看的經(jīng)典著作,并有將閱讀過程中一些思考和總結(jié)記錄下來。為了不枉費(fèi)這些閱讀、思考與總結(jié)的過程,決定將這些零散的內(nèi)容整理成文,沉淀下來。過些年后再回首,也許會覺得當(dāng)時的一些思考,彌足珍貴。

  這個系列的文章,不僅僅是讀書筆記,而是對一本書核心內(nèi)容的全新演繹,內(nèi)容解刨,與重組。希望自己的這些文字,能對各位想進(jìn)一步了解這些經(jīng)典著作的讀者們有所幫助。

  二、《整潔之道》其書

  《代碼整潔之道》(《Clean Code》)是幾乎每一個對編程境界有追求、有志于改善代碼質(zhì)量的編程者,都應(yīng)該閱讀的一本好書。

  這本書提出了一個觀點(diǎn):代碼質(zhì)量與其整潔度成正比,干凈的代碼,既在質(zhì)量上可靠,也為后期維護(hù)、升級奠定了良好基礎(chǔ)。

  書中介紹的規(guī)則均來自作者多年的實(shí)踐經(jīng)驗(yàn),涵蓋從命名到重構(gòu)的多個編程方面,雖為一“家”之言,然誠有可資借鑒的價值。

  

 

  三、本文涉及知識點(diǎn)思維導(dǎo)圖

  先放出這篇文章所涉及內(nèi)容知識點(diǎn)的一張思維導(dǎo)圖,就開始正文。大家若是疲于閱讀文章正文,直接看這張圖,也是可以Get到本文的主要知識點(diǎn)的大概。

  

 

  四、糟糕代碼,是如何產(chǎn)生的

  最初的問題來了,我們都不喜歡壞代碼,為何壞代碼還總會產(chǎn)生?

  拋開編程者本身技藝的問題,答案也許是想要快點(diǎn)完成任務(wù),項(xiàng)目進(jìn)度趕著時間,或許我們只是不耐煩再繼續(xù)做這個需求,渴望它能早點(diǎn)結(jié)束。

  很多時候,會有一堆事情壓著你去完成,你覺得自己需要趕緊弄完手上的東西,好接著做下一件工作,所以,為了走捷徑,為了特定實(shí)現(xiàn)功能而強(qiáng)加的糟糕的代碼,就悄悄地誕生了。我們都曾經(jīng)瞟一眼自己親手造成的混亂,決定棄之不顧,走向新的一天,等有朝一日再來清理。

  然而中國古訓(xùn)有云,“明日復(fù)明日,明日何其多”,勒布朗(LeBlanc)法則也表示,“稍后等于永不。”你會發(fā)現(xiàn),因?yàn)楦鞣N各樣的原因,很多時候你根本都不會(沒時間)去整理之前的代碼。所以,正如本書作者Robert C.Martin(Uncle Bob),在SD West 2007技術(shù)大會上所說的,“那堆“可以運(yùn)行”的亂麻程序,就在我們的眼皮底下慢慢腐壞。”

  我們知道,壞代碼會污染環(huán)境,最后會壞掉整個項(xiàng)目。保持整潔的習(xí)慣,發(fā)現(xiàn)臟代碼就要及時糾正?;〞r間保持代碼代碼整潔,不但有關(guān)效率,還有關(guān)項(xiàng)目的生存。

  五、為什么好代碼會很快變質(zhì)?

  為什么好代碼會很快變質(zhì)?一般情況下,需求一直在變更、需求變化違背了初期設(shè)計(jì)、進(jìn)度太緊是導(dǎo)致好代碼變質(zhì)的誘因。

  多數(shù)的產(chǎn)品經(jīng)理想要好的代碼,即便他們總是癡纏于進(jìn)度,他們會奮力的維護(hù)進(jìn)度和需求。而程序員們則當(dāng)以同等的熱情捍衛(wèi)代碼的整潔性和可擴(kuò)展性。

  舉個栗子,如果你是醫(yī)生,病人在請求給給他們做手術(shù)前別洗手,因?yàn)槟菚ㄌ鄷r間,你會照辦嗎?本該是病人說了算,但醫(yī)生卻絕對應(yīng)該拒絕遵從。為什么?因?yàn)獒t(yī)生比病人更了解疾病個感染的風(fēng)險。醫(yī)生如果按病人說的辦,就是一種不專業(yè)的態(tài)度。

  同理,程序員遵從不了解混亂代碼風(fēng)險的產(chǎn)品經(jīng)理(策劃)的意愿,都是不專業(yè)的做法。

  六、程序員的基礎(chǔ)價值謎題

  程序員都面臨著一種基礎(chǔ)價值的謎題。有那么幾年經(jīng)驗(yàn)的開發(fā)者都知道,之前的混亂拖了自己的后腿,但開發(fā)者背負(fù)期限的壓力,只好制造混亂。簡言之,他們沒花時間讓自己做得更快。

  而其實(shí)真正專業(yè)的人士明白,這道謎題第二部分說錯了,制造混亂無助于趕上期限,混亂只會立刻拖慢你,叫你錯過期限,趕上期限的唯一方法——做得更快的唯一方法——就是始終盡可能保持代碼的整潔。

  七、大師們眼中的整潔代碼

  到底什么是整潔的代碼?有多少程序員,就有多少定義。 “大師級程序員把系統(tǒng)當(dāng)故事來講,而不是當(dāng)做程序來寫”。就讓我們一起看看經(jīng)驗(yàn)豐富的大師級程序們都是如何定義整潔代碼的。

  Bjarne Stroustrup ,C++語言之父, TheProgramming Language(中譯版《C++程序設(shè)計(jì)語言》)一書作者:

  “我喜歡優(yōu)雅和高效的代碼,代碼邏輯應(yīng)直截了當(dāng),叫缺陷難以隱藏;盡量減少依賴關(guān)系,使之便于維護(hù);一句某種分層戰(zhàn)略完善錯誤處理代碼;性能調(diào)至最優(yōu),省得引誘別人做沒規(guī)矩的優(yōu)化,搞出一堆混亂來。整潔的代碼只做好一件事。”

  Grady Booch,Object Orient Analysis and Design with Application(中譯版《面向?qū)ο蟪绦蚍治雠c設(shè)計(jì)》) 一書作者:

  “整潔的代碼簡單直接,整潔的代碼如優(yōu)美的散文。整潔的代碼從不隱藏設(shè)計(jì)者的意圖,充滿了干凈利落的抽象和直截了當(dāng)?shù)目刂普Z句。”

  Michael Feathers,Working Effectively withLegacy programming(中譯版《修改代碼的一書》)一書的作者:

  “整潔的代碼總是看起來想是某位特別在意它的人寫的,幾乎沒有改進(jìn)的余地,代碼作者署名都想到了,如果你企圖改進(jìn)它,總會回到原點(diǎn),贊嘆某人留給你的代碼——全心投入到某人留下的代碼。”

  Ron Jeffries,Extreme Programming Installed(中譯版《極限編程實(shí)施》)以及Extreme Programming Adventures in (C#中譯版《C#極限編程探險》)作者:

  “減少重復(fù)的代碼,提高表達(dá)力,提早構(gòu)建簡單抽象,這就是我寫整潔代碼的方法。”

  八、編寫代碼的難度,取決于周邊代碼的閱讀難度

  編寫代碼的難度,取決于周邊代碼的閱讀難度。何出此言?因?yàn)楦鞣N實(shí)踐與統(tǒng)計(jì)表明,在項(xiàng)目里開發(fā)新功能的過程中,閱讀之前代碼與書寫新的代碼,花費(fèi)的時間比例超過10:1,新寫代碼時,我們一直在讀舊代碼。既然比例如此之高,我們就應(yīng)該讓讀的過程變得輕松,即便那會使得編寫過程更難。

  所以說,編寫代碼的難度,取決于周邊代碼的閱讀難度,想要快速實(shí)現(xiàn)需求,想要快速完成任務(wù),想要輕松的寫代碼,先讓你書寫的代碼整潔易讀吧。

  九、讓代碼比你來時更干凈

  我們知道,光把代碼寫好可不夠,必須時時保持代碼整潔,我們都見過代碼隨著時間的流逝而腐壞。我們應(yīng)該更積極地阻止腐壞的發(fā)生。

  借用美國童子軍的一條簡單的軍規(guī),應(yīng)用到我們的專業(yè)領(lǐng)域:

  “讓營地比你來時更干凈。”

  那么可以同樣對編程領(lǐng)域這樣說:

  “讓代碼比你來時更干凈。”

  也就是說,如果我們每次簽入時,代碼都比簽出時干凈,那么代碼就不會腐壞。這就是我們需要遵從的代碼整潔之道。

  十、本文涉及知識點(diǎn)提煉整理

  文章開頭部分已經(jīng)用思維導(dǎo)圖的方式展現(xiàn)了本文的知識點(diǎn),這邊再貼出一個文字列表版,方便大家整理:

  1. 編寫代碼的難度,取決于周邊代碼的閱讀難度。想要快速實(shí)現(xiàn)需求,想要快速完成任務(wù),想要輕松的寫代碼,請先讓你書寫的代碼整潔易讀。

  2. 保持整潔的習(xí)慣,發(fā)現(xiàn)臟代碼就要及時糾正?;〞r間保持代碼代碼整潔,這不但有關(guān)效率,還有關(guān)項(xiàng)目的生存。

  3. 程序員遵從不了解混亂風(fēng)險的產(chǎn)品經(jīng)理(策劃)的意愿,都是不專業(yè)的做法。

  4. 讓代碼比你來時更干凈:如果每次簽入時,代碼都比簽出時干凈,那么代碼就不會腐壞。

  5. 趕上期限的唯一方法,做得更快的唯一方法,就是始終盡可能保持代碼的整潔。

  本文就此結(jié)束。

  下篇文章,我們將繼續(xù)《代碼整潔之道》的精讀與演繹,探討更多的內(nèi)容。

  Best Wish~



關(guān)鍵詞: 代碼 C++

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉