這章概括了軟體工程歷史上僅有的三個主要典範(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 ➡️ 結構化
  • 拿走 函式指標 ➡️ 物件導向
  • 拿走 賦值 ➡️ 函數式

這意味軟體工程的基礎規則已穩定,現在所學的架構原則,在未來幾十年內依然適用。