核心觀點#
作者 Robert C. Martin 在本章探討「簡單設計(Simple Design)」的概念。
他引用 Kent Beck 提出的簡單設計四原則,認為只要遵循,良好的系統架構與程式碼品質會自然而然地「羽化(Emerge)」成形。
這四條規則按重要性排序如下:
- 執行所有測試
- 沒有重複程式碼
- 表達程式設計師的意圖
- 最小化類別與方法的數量
設計不是一種靜態藍圖,而是一個動態演進過程。
透過撰寫測試並持續重構,我們能消除對修改程式碼的恐懼,讓設計隨需求持續優化。
簡單設計的四條守則#
1. 執行所有測試 (Runs All Tests)#
這是最基本也最重要的規則。
- 不可驗證即不可部署: 系統不能被測試,就無法被驗證;無法被驗證的系統,絕不該被部署
- 測試驅動設計: 為了讓系統「易於測試」,開發者會自然傾向撰寫遵守單一職責原則 (SRP) 的類別,降低模組間的耦合度
- 消除恐懼: 這是最大價值。當你擁有 100% 的測試覆蓋率,
你就不會害怕「整理程式碼會破壞它」。這賦予了你重構的自由
2. 消除重複 (No Duplication)#
重複是良好設計的大敵。重複代表了額外作業、額外風險與不必要的複雜度。
- 從小處著手: 即便只是幾行程式碼的重複,也該被提煉出來重複利用
- 模組化: 透過消除重複,我們會發現某些邏輯應被抽象化,進而發現類別職責的邊界
3. 表達意圖 (Expresses Intent)#
大部分開發成本都花在「維護」上,而維護難度取決於閱讀程式碼的人能否理解你的意圖。
越清晰的程式碼,他人(或未來的你)接手時所需時間就越少。
- 勇於嘗試: 表達力的關鍵在於開發者願花時間修飾。寫完程式碼後,停下來看看:這容易讀嗎?
- 具體做法:
- 選擇良好的命名
- 保持函式和類別簡短
- 使用標準命名法(如 Design Pattern 的名稱),善用專有名詞傳遞設計意圖
- 撰寫良好的單元測試,測試本身就是最好使用文件
4. 精簡類別和函式大小 (Minimal Classes and Methods)#
這條規則是用來平衡前述規則,避免過度設計。
- 避免教條主義: 不要為了遵守某些死板規定(例如「類別都須有介面」、「欄位都須分開處理」)
而造出大量無意義的微小類別或方法 - 實用至上: 雖然希望類別小、數量少,但「測試」、「消除重複」與「表達意圖」的重要遠高於此
重構的目標#
擁有了測試作為安全網,我們就可以開始重構。
重構不僅是為美觀,而是為了讓程式碼結構更健康。
重構時應追求的屬性
整理程式碼的過程,我們應致力於:
- 增加凝聚性 (Cohesion)
- 降低耦合度 (Coupling)
- 分離關注點 (Separation of Concerns)
- 模組化系統關注點
- 輕量化函式與類別
- 選擇更好的命名