Clean Code — 無瑕的程式碼 敏捷軟體開發技巧守則 — 讀後心得和筆記

Harry Xie
6 min readJun 13, 2020

--

書本封面

前言

之前在網路上看到 Clean Code 系列的書,在網路上的評價是不錯的,因此就到學校圖書館借來看了,其系列著名的還有《 無瑕的程式碼 番外篇-專業程式設計師的生存之道 》和《 無瑕的程式碼-整潔的軟體設計與架構篇 》,也已列入書單。

此書以 Java 作為程式碼範例,從對於變數和函式的命名規則、如何將註解和縮排、物件和類別、單元測試、錯誤處理等寫得比較乾淨都有詳細介紹,也提到了許多軟體工程的專有名詞。但也因本書內容豐富,所以只整理了各章節個人主觀覺得重要的觀念,並略過了程式碼範例。

Ch1 無暇的程式碼

大致上在說幾個程式開發專家對於 clean code 的看法,總結起來有以下幾點:

Bjarne Stroustrup:

盡可能地最佳化程式效能
注意細節處,例如處理錯誤的程式碼必須完整,注意 Race Condition,memory leak,甚至是命名方式等

Dave Thomas:

重視可讀性,認為 clean code 是可被原作者以外的開發者閱讀和修改的
clean code 應經過單元測試和驗收測試

Ron Jeffries:

能通過所有測試
沒有重複的程式碼
充分表達系統設計的概念
具有最少數量的實體(包含類別,方法,函式等)

Ch2 有意義的命名

這個章節談的是變數/函式的命名方式,介紹幾個比較良好的命名規則

1. 產生有意義的命名區別

舉例來說,如果一個 Product 的類別,其後又有 ProductInfo 和 ProductData 兩個子類別,那就只是名稱不相同而已,並非意義上產生區別,因為 info 和 data 兩個意義太相近了

2. 類別和方法的命名

類別和物件應使用名詞來命名,例如 Customer,Account
方法應使用動詞來命名,例如 deletePage、getter 和 setter 使用 get 和 set 當字首,而判定用 is 當字首

3. 替每個概念(動作/行為)使用一種字詞,並持續使用

舉例來說,在為不同類別設定取得方法時,如果取用 fetch、retrieve 和 get 和全部只使用 get 相比,是否後者來的清楚和一致

4. 避免雙關語

雖然上一點提到為每個概念(動作/行為)使用一種字詞,但若是其目的不同,建議就使用不同的字詞,舉例來說,我們用 add 命名一個兩個數字相加的方法,而用 insert 將一個數字加入陣列

Ch3 函式

1. 簡短

作者提出個人經驗,建議函式的行數/內容要簡短,而且一個函式內只做一件事

2. 函式的參數不宜過多,避免超過三個

原因是可減少函式的複雜度,且做測試時,參數越少比較好做測試
Tip: 可以建立物件,把多個參數放在物件內

3. 使用例外處理取代 if else 做判斷後回傳錯誤碼

此外,把 try/catch 擷取出來成一個區塊,因為函式應該只做一件事

4. 使用具有描述能力的名稱

ex: isTestable()、includeSetupAndTeardownPages()

Ch4 註解

這章節講的是註解,在此章節的開頭作者提出,當程式碼呈現的意圖不夠明確時,才需要寫程式碼,否則就不必寫註解

1. 註解無法彌補糟糕的程式碼

與其花時間寫註解解釋混亂的程式碼,不如花時間整理它們

2. 有益的註解

有幫助的註解常用於:

  1. 資訊型註解: 說明回傳值,參數的意義
  2. 修改某段程式後果的告誡
  3. 放大某段程式的重要性

3. 糟糕的註解

  1. 誤導型註解: 寫了意思不夠精確的註解
  2. 規定型註解: 假如有規定說每個函式都必須有一個 Javadoc,或每個變數都要寫註解,這就是多餘的註解
  3. 一直被註解起來的程式碼: 在許多年前,被註解的程式碼可能是有用的,所以保留,但現在有版控系統,不需要一直留著被註解的程式碼

ch5 編排

程式碼的編排也相當重要,良好的縮排可增加程式的可讀性

垂直空白間隔

是用來分隔套件的宣告,library 的引入和不同的函式

水平空白間隔

單行不宜過長

團隊的共同準則

所有的團隊開發者都應該選擇同一種縮排風格並使用它

ch6 物件導向及資料結構

介紹程序式程式設計和物件導向程式設計的不同,提醒讀者根據情況選用不同程式設計的方式

使用資料結構的程式碼

將資料放在抽象層並隱藏,而且容易操作和新增函式

物件導向的程式碼

不易變動現有函式,但容易增加類別和資料

注意: 須避免出現以上兩者的混合體,只會集兩者缺點於一身

ch7 錯誤處理

使用異常處理(try catch),而非錯誤碼

ch9 單元測試

說明測試對產品程式的重要性

本章重點:

  • 測試程式和產品程式一樣重要
  • 寫出整潔的測試程式最重要的就是可讀性
  • 一個測試只測試一個功能

TDD 三大法則

  • 第一法則: 沒有寫任何單元測試之前不可寫任何功能程式碼
  • 第二法則: 只撰寫能夠呈現一種失敗情況的程式碼
  • 第三法則: 只撰寫剛好能透過測試的功能程式碼

F.I.R.S.T 原則

整齊的測試應包括以下幾點:

  1. F(Fast): 測試速度應夠快
  2. I(Independent): 測試程式不應該互相依賴
  3. R(Repeatable): 測試程式應該可以在任何環境重複執行
  4. S(Selft-Validating): 測試程式應輸出布林值,不論有沒有通過
  5. T(Timely): 撰寫測試要及時,單元測試要在撰寫產品功能程式前寫

ch10 類別

介紹類別的簡潔寫法

重點:

  • 類別不該包含過多職責/方法(類別要簡短)
  • 保持類別的凝聚性。在方法內操縱越多變數,代表此方法更凝聚於此類別

單一職責原則(SRP)

此原則為物件導向設計 SOLID 五個原則之一,主張一個類別或模組應該只能有一個被修改的理由(職責)。

參考文章:
單一職責原則。到底什麼是改變的理由?

ch12 羽化

此章提出簡單設計四守則:

1. 執行完所有測試

透過單一職責原則創造小型單一用途的類別,使用相依性反轉原則(依賴反轉原則)最小化耦合性,不但改善程式碼架構,也減少測試的難度

2. 沒有重複的部分

3. 表達程式設計師的本意

意思是程式碼要有良好的可讀性

4. 最小化類別和方法的數量

單一職責原則不宜做過頭,因此要避免產生不必要的類別和方法,此點的優先權為四守則最低的一點

心得

筆記內容就到這裡結束,我覺得我的筆記還蠻簡潔的XD,在書中確實提出蠻多程式設計的原則,有些是我單看文字就能了解的,而且也有吸收到一些觀念,但有些是我覺得我需要實際進入到工作才會體會該原則和應用。總結來說,這本書是有用的,值得一看,希望我過幾年有機會再翻閱這本書時,能夠更深入體會它。想知道更詳細內容和程式碼範例,可以自行購買囉!

如果此篇筆記對你有幫助,不妨鼓鼓掌,這也是我寫文的動力來源之一哈哈,感謝你囉~

--

--

Harry Xie

這輩子做過最不後悔的選擇就是成為軟體工程師。更多關於我 : https://linktr.ee/harry.xie