這章概括了軟體工程歷史上僅有的三個主要典範(Paradigm)。
Uncle Bob 提出一個深刻洞見:這些典範的出現,並非教會「該做什麼」,而是限制「不該做什麼」。
它們透過拿走原本擁有的能力來規範程式設計。
一、三大典範的本質:負向的限制#
程式設計的歷史,就是一段不斷增加「限制」的歷史。
1. 結構化程式設計 (Structured Programming)#
- 核心定義: 規範直接的控制移轉(Direct transfer of control)
- 移除什麼:
goto - 架構意義: 得以將大系統拆解成小模組(函式)。
它提供了遞迴分解(Recursive decomposition)的基礎,讓我們能將大問題拆解為小問題
2. 物件導向程式設計 (Object-Oriented Programming)#
- 核心定義: 規範間接的控制移轉(Indirect transfer of control)
- 避免什麼: 濫用函式指標(Function Pointers)
- 架構意義: 藉多型(Polymorphism),安全地跨越架構邊界。
允許我們控制依賴關係的方向(依賴反轉),讓高層策略不需依賴低層細節(Plugin 架構)
3. 函數式程式設計 (Functional Programming)#
- 核心定義: 規範賦值(Assignment)
- 避免什麼: 隨意賦值變數(可變性(Mutability))
- 架構意義: 規範了資料的位置與存取方式。
在多核心與併發(Concurrency)下,不可變性(Immutability)是避免死鎖與競爭條件的關鍵
二、典範與架構的對應#
這三個典範恰巧回應了軟體架構的三大關注點:
| 典範 | 限制的對象 | 架構上的關注點 |
|---|---|---|
| 結構化 | 程式流程 (Flow) | 元件分離 (模組化、演算法拆解) |
| 物件導向 | 程式依賴 (Dependency) | 跨越邊界 (多型、插件化) |
| 函數式 | 資料狀態 (Data) | 資料管理 (資料存取、不可變性) |
為什麼沒有第四個典範?
自 1958 年以來,我們幾乎沒再發明新典範。原因是:我們已沒什麼可以「拿走」。
- 拿走
goto➡️ 結構化- 拿走
函式指標➡️ 物件導向- 拿走
賦值➡️ 函數式這意味軟體工程的基礎規則已穩定,現在所學的架構原則,在未來幾十年內依然適用。