本附錄彙整本書最重要的設計原則紅旗,作為設計與審查時的快速參考。

設計原則彙整#

以下是書中討論過、最重要的軟體設計原則:

  1. 複雜性是逐步累積的:必須在意每一個小細節
  2. 能跑還不夠:程式可運作只是底線
  3. 持續、小額地投資改善系統設計
  4. 模組要深
  5. 介面應為最常見用法設計得最簡單
  6. 模組擁有簡單介面比擁有簡單實作更重要
  7. 通用模組更深
  8. 把通用與特殊用途的程式碼分開
  9. 不同層次應有不同抽象
  10. 把複雜性向下拉
  11. 把錯誤(以及特殊情況)從定義中消除
  12. 設計兩次
  13. 註解應描述程式碼看不出的事
  14. 軟體應為易讀設計,不是為易寫設計
  15. 開發的增量單位應是抽象,不是功能

紅旗清單#

以下任一徵兆出現在系統中,都暗示設計可能有問題:

淺模組(Shallow Module)#

類別或方法的介面並不比其實作簡單多少。

資訊洩漏(Information Leakage)#

某個設計決定被反映在多個模組中。

時序分解(Temporal Decomposition)#

程式結構建立在「操作執行的順序」上,而非資訊隱藏。

過度暴露(Overexposure)#

某 API 強迫呼叫端為了使用常用功能、必須先學習極少用到的功能。

穿透型方法(Pass-Through Method)#

一個方法幾乎只把參數轉送給另一個簽章類似的方法。

重複(Repetition)#

同一段非平凡程式碼一再出現。

通用 / 特殊混合(Special-General Mixture)#

特殊用途程式碼未與通用程式碼乾淨分離。

連體方法(Conjoined Methods)#

兩個方法依賴緊密到「不看另一個就無法理解這一個的實作」。

註解重複程式碼(Comment Repeats Code)#

註解中的所有資訊都能立刻從旁邊的程式碼看出。

實作文件汙染介面(Implementation Documentation Contaminates Interface)#

介面註解中描述了使用該實體不需要知道的實作細節。

模糊名稱(Vague Name)#

變數或方法名涵蓋範圍太廣,無法傳達有用資訊。

難以命名(Hard to Pick Name)#

很難為某個實體取出精確且直覺的名字。

難以描述(Hard to Describe)#

要把某變數或方法描述完整,文件必然冗長。

不顯而易見的程式碼(Nonobvious Code)#

一段程式碼的行為或意義無法被快速看懂。

使用方式#

把本附錄當作設計檢查清單

  • 寫新模組時,自問是否符合每條設計原則
  • Code review 時,掃過紅旗清單
  • 看到任一紅旗 → 停下來思考是否有更簡單的設計

隨著你經常使用這份清單,你會內化它們,最終不需要查就能直覺辨識出設計問題。