《代碼整潔之道》:5大基本要點

2020-12-25 讀芯術

全文共3257字,預計學習時長10分鐘

評論區常常有小夥伴推薦羅伯特·C·馬丁的《代碼整潔之道(Clean Code)》。今天我們就來了解一下這本書,它值不值得一看?

關於此書

《代碼整潔之道》出版於2008年,近年來,一直被列為「亞馬遜最暢銷的五本書」之一。本書作者被親切地稱為「Bob叔叔」,他也是《敏捷宣言》的原作者之一,資歷非常豐富。本書在Goodreads上平均評分為4.4(評分人數超13,000)。可以說,這是一本程式設計師的必讀書。

本文將本書精簡為五個要點。

1.尊重抽象

《代碼整潔之道》中寫到:如果要確保函數僅做一件事,則需要確保每個函數的語句都位於同一抽象層次。

為說明這一點,馬丁用了以下示例(出自FitNesse):

public String render() throws Exception{ StringBuffer html =new StringBuffer("<hr"); if (size >0) html.append(" size="").append(size + 1).append("\""); html.append(">"); return html.toString();} 在GitHub上查看no_abstraction.java原始碼

這裡至少混合了兩個抽象層次。第一個是固定大小的hr標籤的高級概念,第二個是處理實際標籤構造的低級語法細節。為了說明這一點,對代碼進行更清晰地重構,如下所示:

public String render() throws Exception{ HtmlTag hr =new HtmlTag("hr"); if (extraDashes >0) hr.addAttribute("size", hrSize(extraDahses)); return hr.html(); }private String hrSize(int height){ int hrSize = height +1; return String.format("%d", hrSize);} 在GitHub上查看abstraction.java原始碼

注意:

· Render()函數現在僅負責構建hr標籤

· 將構建標籤的底層詳細信息的任務轉給HtmlTag模塊

· 大小格式被抽象為獨立的函數

馬丁認為:

「分離抽象層次是重構最重要的功能之一,也是最難實現的功能之一。」

當然,在以後的代碼中,我會有更多考慮。

2.整潔代碼關乎規則,要花大量精力

我不希望本文僅是列出編寫整潔代碼的要點和規則。對本書而言這也無甚作用——因為採取教條式的教學方法是遠遠不夠的。

相反,在本書中馬丁呼籲發展強烈的個人原則感,且不斷說明將「髒代碼」變整潔所需的努力和職責。本書將其稱為「代碼感」,它要求「嚴格使用艱難獲得整潔代碼的大量小技巧。」

「整潔代碼並非遵循一組規則編寫的。不可能因為學習一套金規玉律就成為軟體大師。專業精神和手工藝來自於推動規則形成的價值。」 —羅伯特·C·馬丁(RobertC. Martin)

就個人而言,我沒什麼自信,所以很喜歡這種說法。就連Bob叔叔都堅信編寫代碼是一份需要嚴肅自律的工作,要花費大量精力,真是極大的安慰。為了真正擅於整潔代碼,我們需要迭代我們作為程式設計師的個人開發以及代碼的開發。

3.代碼儘量精簡

「函數的首要規則是體積小。第二規則是使其儘可能地變小。」 ——羅伯特·C·馬丁

這裡有兩個含義:

· 函數本身應該簡短——幾乎不超過20行,大多數情況下少於10行

· 函數應儘可能不要採用參數

簡潔函數能增加代碼的易讀性。這也使我們傾向於編寫功能單一高效的函數。

對於類,他也有類似的看法。他建議使用「職責」而非「代碼行」來衡量類的大小。即一個類應該只有一個職責。這就是所謂的「單一職責原則」(SRP)。

保持代碼簡短是「分劃」策略,如果一個大文件包含大量冗長而複雜的代碼,則可以將該文件分為多個模塊,將模塊分為多個函數,再將函數分為多個子函數,直至看到代碼邏輯和任務。

4.編程是工藝

我時常認為,將編程喻為建築和構造並不恰當。因為程式設計師不會做一個完整的設計,從頭開始建基,再一步步搭建直至完工。

編程的步驟是:先畫草圖,再反覆添加細節。程式設計師要做的是修改、完善和擴展——這些都在各抽象層次上完成,直到軟體滿足要求為止。而軟體永遠不會真正完成。

這就是《代碼整潔之道》的中心思想。貫穿全書的要點是:軟體是一門藝術,做軟體就像「畫畫」。作者認為編程的本質是一門工藝。

但如何讓編程從單純地寫代碼變成「工藝」呢?

馬丁認為,程式設計師掌握的主要工具是持續重構和測試驅動開發(TDD)。兩者像硬幣的兩面般協同工作。來看一些概念:

重構是在不更改輸出的情況下調整現有計算機代碼結構的過程。

測試驅動開發是將需求轉換為特定測試用例,再添加代碼以使測試通過的過程。

因此,製作軟體的過程可能如下所示:

1. 編寫測試代碼以驗證所需但未實現的功能。

2. 編寫有效代碼(可能不整潔),並通過測試。

3. 逐步重構代碼(保證每次通過測試),使代碼在每次開發迭代中都更加清晰。

「不要想著一次性編程後系統就能正確、漂亮地運行。今日的任務僅僅是讓程序運行起來,而重構和擴展系統是明天的任務。這是迭代和增量敏捷的本質。」——羅伯特·C·馬丁

因此,本書的中心思想是,整潔代碼是在開發和實踐中實現的,而非簡單地一口氣創建出來。

5.代碼本身清晰易讀

注釋很少卻清晰、表達力強的代碼優於注釋多的混亂、複雜的代碼。」 ——羅伯特·C·馬丁

在「注釋、有意義的命名和格式「一章中,馬丁強烈主張代碼本身應該清晰易讀。示例:

// Check to see if theemployee is eligible for full benefitsif ((employee.flags & HOURLY_FLAG) && (employee.age > 65))

將其重構為:

if(employee.isEligibleForFullBenefits())

注意:

· 刪除注釋

· 條件邏輯封裝到一個方法中

· 因為使用的是方法而不是獨立函數,因此可以使用實例變量,從而創建調用零參數的方法

· 給該方法起一個描述性的名稱,使其職責更加明確

《代碼整潔之道》關於命名寫了整整一個章節,本質上是對Tim Ottinger規則的詳細說明。包括:

· 設置可讀性高的名稱——例如,int elapsedTimeInDays,而不是in days

· 使用讀得出來的名稱——例如,客戶而不是DtaRcrd102

· 避免使用編碼——不要用前綴m_表示"members",也不要使用匈牙利表示法

· 每個概念對應一個詞——不要fetch,retrieve,get多個概念對應一個詞

結語

《代碼整潔之道》中,並非每個想法都是Bob叔叔提出的,他在書中的各部分都承認了這一點。而這反而是使本書如此成功的一個原因——它是編程界智慧的匯聚,並附有實例。

如果要說一個小瑕疵,那就是與高層概念的章節相比,有關底層細節的章節有點少。「系統」章只有13頁,僅僅是「注釋「章的一半。但是,我懷疑減少對系統的重視,是為了將討論保留在他後來的書《架構整潔之道(CleanArchitecture)》中。

綜合考慮,這真的是目前最好的編程書籍之一,我會把該書放到我的2021年書單中。

留言點讚關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範

相關焦點

  • 金庸群俠傳5代碼工具怎麼用?全物品代碼一覽表
    《金庸群俠傳5》全物品代碼一覽表 代碼工具怎麼用?  金庸群俠傳5代碼工具怎麼用?很多玩家對一些重要物品的代碼不是很清楚,為了便於大家的使用和查詢,這裡為諸位帶來了「fir3637」整理的金庸群俠傳5全物品代碼一覽表,一起來看下吧。
  • 清新整潔桌布當道 紡織品桌布的分類與清潔
    清新整潔桌布當道 紡織品桌布的分類與清潔 2013-05-24 11:07:26 來源:網上輕紡城 桌布是廚房裡一道不可或缺的風景線,它不僅能幫助餐桌保持清潔,更能裝點獨特個性廚房空間
  • 上古捲軸5代碼大全_1818399.99% 專區
    上古捲軸5代碼有哪些?又怎麼用呢?還不是很了解的朋友們,接下來心願遊戲小編就為你們帶來了上古捲軸5代碼大全,一起來看看吧。 上古捲軸5代碼可分為控制臺常用代碼、特技代碼、魔法代碼、物品代碼、靈魂石代碼、箭矢代碼、配料代碼、藥劑代碼、食物代碼、裝備代碼、武器代碼、怪物代碼。
  • 狀態機——單片機的萬能語言(附代碼)
    switch/case的方法來實現要點用switch/case的結構配合一個狀態變量,通過修改狀態變量的值來切換狀態。代碼如下 1//代碼參考網絡 2 3//! 通用的if/else來了要點用if else…else if結構的組合來描述狀態流程圖。範例 1//代碼參考網絡 2//!
  • 快速挑選排籠鳥的基本要點
    快速挑選排籠鳥的基本要點 好多畫眉商家一批畫眉進到家,一般都是把各地賣畫眉的老闆約齊了一起批發或出售,如果你能知道信息,挑一隻好點的鳥沒問題,在眾多養鳥高手面前你只能靠速度取勝,一定頭尖眼快,有個性的人養有個性的鳥,時間決定一切,等你去慢慢挑鳥籠都沒有了。
  • 《上古捲軸5》時間流速代碼分享 時間流速代碼是什麼
    導 讀 上古捲軸5中的時間有些時候是讓玩家十分頭疼的一個點,因為有些任務與時間有關,那麼在上古捲軸中時間流速代碼是什麼,下面九遊小編為大家帶來介紹。
  • 中文命名實體識別_01_基本要點
    導語:最近想換換腦子,趁著天池上的中藥說明書實體識別挑戰賽的機會,花了兩個周末的時間把最基本的中文命名實體相關的算法模型,以及必讀經典文獻簡單過了一下,了解了個基本套路,本來是打算趕個晚集把BERT用一用,無奈前排大佬太多,進不了複賽繼續玩耍,姑且就先記錄一下最基本的東西了,坐等TOP選手的方案出來後再追加幾篇,完善整個知識體系。
  • 《俠盜獵車手5(GTA5)》使用代碼簡易製作幫會徽章圖文教程攻略
    logo製作方法基本相同,都是通過圖片代碼直接上傳完成的,如果有玩過戰地4的同學應該很熟悉,但是BF4的代碼又無法直接用在GTA5中,這就很傷心了。下面帶來《俠盜獵車手5(GTA5)》使用代碼簡易製作幫會徽章圖文教程,希望對大家有所幫助。
  • 杭州一位校長發現,孩子們的成績與抽屜的整潔有關
    ,也是學生的核心素質之一因此,陳校長覺得有必要從小學開始抓學生的習慣,前提是教師也要注意把抽屜作為基本的學習習慣來抓新考核辦法實施後,抽屜整理合格率,部分班級從原來的不到50%,已經上升到98%以上,效果還是比較明顯的|||||||||||||||||||||||||||||||為核實說法,記者同行前往杭州建蘭中學做小調查調查查看二(三)班前5名學生抽屜結果,四個學生的抽屜相當整潔,只有一個男抽屜不合格那個男孩坐在教室的最後一排
  • 《金庸群俠傳5》修改器及實用代碼分享
    導 讀 展開 《金庸群俠傳5》中的很多開關都可以自主修改,增強了遊戲各方面的體驗,比如門派選擇、修改體力上限等,下面請看由「玉瓏之耀」帶來的《金庸群俠傳
  • 上古捲軸5最強武器代碼
    我們可以通過代碼進入到裝備室,可以自由的選取武器,代碼:【coc qasmoke】。最強的武器代碼:000139BA 魔族戰錘、000139B9 魔族長劍、000139B8 魔族釘頭錘、000139B7 魔族巨劍、000139B6 魔族匕首、000139B5 魔族弓、000139B4 魔族戰斧、000139B3 魔族巨斧。
  • 0基礎學習JavaScript一定要知道如何使用VS2019去編寫代碼
    然後在此項目中再創建一個HTML頁面,用於編寫JavaScript代碼。圖1創建的是一個空的Web項目,項目中除了基本的引用、Properties、Web.config之外,沒有其他任何多餘的文件。在圖1右擊項目名稱,添加一個新項目。
  • 《巫師3狂獵》武器冬之刃代碼怎麼樣 冬之刃代碼分享
    導 讀 《巫師3:狂獵》中的很多武器都是很強的,很多玩家都不太清楚武器冬之刃的代碼是多少,今天小編就給大家帶來玩家「Klaus77777」分享的武器冬之刃代碼
  • 我國組織機構代碼—代碼發展史是什麼?
    對單位法人實行組織機構代碼和對自然人實行社會保障號碼制度,是國家整個經濟和社會實現現代化管理的基本制度,儘快建立這一制度對建立社會主義市場經濟體制和推動社會進步具有十分重要的意義,且具緊迫性。1997年1月23日,國務院召開第143次總理辦公會議,專門聽取有關部門「社會保障號碼」與「組織機構代碼」推行情況匯報,並在會議紀要中提出了建立組織機構代碼制度的重要意義和緊迫性。這是國務院對組織機構代碼工作探索性實踐的充分肯定,也為組織機構代碼工作自此以後的穩步發展指明了方向。
  • 購買4K電視必讀:3大理由和5個小要點
    買4K電視的3大理由理由一
  • 鴻蒙OS開原始碼精要解讀之——init
    寫在前面的話我們對OpenHarmony的代碼進行了一個簡單粗略的統計。除去所有的third_party代碼(即OpenHarmony使用的第三方開源庫),其他剩餘的代碼中,以.c、.h文件為統計入口,總有效代碼行數(不含注釋、空行等,統計工具為tSourceCounter)為325627行。
  • 金庸群俠傳5物品秘籍代碼及使用教程
    代碼物品 效果509周公劍譜 可習三重,會成為隱者510陽春白雪 古琴譜,消耗三百潛能習得心法,並增加氣血五百點。511愣嚴經 可習得九陽神功至第三重。520黃帝內經 春宮圖…可習得黃帝內經至三重521十八泥偶 羅漢伏魔功至一重522苗家劍譜 苗家劍法至三重523夫妻刀譜 夫妻刀法至三重524易容術密笈 易容術至九重525修真辟穀之法 辟穀之術至九重526
  • 《嗜血代碼》的啟發
    遠的不說,近的塞爾達火紋嗜血代碼通通不能免俗。然而在以塞爾達荒野之息為這套路最高成就的今天,有一個充滿野心的製作人想去製作一個真正的充滿記憶碎片的世界。他想用這個世界,探索這大千世界的愛,正義,和平,甚至於人之所以為人的終極意義。對絕大多數普通人來說,這是一個高不可攀的人類頂級命題。敢攀登人類存在意義的哲學命題的作品,都是一群大無畏的天才瘋子才敢挑戰創作的大題目。
  • TGS2019《嗜血代碼》現場訪談:歷經5年時間開發
    吉村廣(以下簡稱吉村):其實從企劃開始算的話,距今已經開發近5年了,如今終於要發售了。前幾天,在發布了體驗版之後,我們就收到了從公布時就一直在等待的玩家評論,他說「我一直都在等待」,看到這個,我感到非常開心。讓大家等了這麼久,並且期待值也上升了,我們能不能滿足大家呢?心裡有些忐忑啊。
  • IATA機場代碼
    如果按官方的說法,我們所說的機場三字碼叫國際航空運輸協會機場代碼,簡稱IATA代碼;四字碼叫國際民航組織機場代碼,簡稱ICAO代碼。平時工作的時候,正常人一般都叫簡稱。在IATA的三字代碼出現以前,飛行員使用的是二字代碼。大概在20世紀30年代,那時候機場還很少,但是天氣對於飛行的重要性已經被人們熟知,所以每次飛行前的必備步驟之一就是看天氣怎麼樣。