從最基礎的命令式,到抽象的宣告式,再到模擬現實社會的物件導向與並行設計,不同範式代表不同的思維模式與解決問題的途徑。
1. 命令範式:一切行動聽指揮#
命令式程式設計(Imperative Programming)是電腦科學中最基礎的範式,其核心精神在於由程式設計師明確指定電腦執行的每步驟。
結構化定理#
任何程式邏輯,無論多複雜,都可透過以下三種基本控制結構表示:
| 邏輯 | 描述 |
|---|---|
| 循序 (Concatenation) | 指令按照先後順序依序執行 |
| 選擇 (Selection) | 根據條件判斷結果決定執行的路徑 |
| 迴圈 (Repetition) | 在滿足特定條件下重複執行特定代碼區塊 |
關於結構化流程圖的演進
- 非嚴格的結構化流程圖:早期流程圖無法單純用上述三種基本結構組合,導致邏輯混亂
- 嚴格的結構化流程圖:引入
Quit標誌來保證迴圈完整性,確保程式流程的可預測性
維度 設計原則 宏觀策略 採用「Top-Down」設計,由上而下拆解問題 微觀實踐 嚴格遵守循序、選擇和迴圈結構 結構禁令 摒棄或嚴格限制 Goto語句,以換取清晰結構與易於除錯、維護的特性
2. 宣告範式:目標決定行動#
與命令式不同,宣告式程式設計(Declarative Programming)強調 「做什麼(What)」而非「如何做(How)」。 它是 Goal-Driven(目標驅動)的,演算法由隱性機制處理,程式設計師只需定義目標。
命令式 vs. 宣告式#
| 維度 | 命令式 (Imperative / Action-Oriented) | 宣告式 (Declarative / Goal-Driven) |
|---|---|---|
| 核心思維 | 如何做 (How):詳細描述步驟與狀態轉移 | 做什麼 (What):描述期望結果或邏輯關係 |
| 變數本質 | 抽象化的記憶體:內容可變 (Mutable),存在賦值操作 | 抽象化符號:內容不變 (Immutable),類似數學常數 |
| 演算法特徵 | 顯性:循環、條件判斷等邏輯路徑清晰可見 | 隱性:封裝在表達式或引擎中,程式碼即規格 |
| 狀態管理 | 頻繁改變狀態,易產生副作用 (Side Effect) | 傾向無狀態或狀態隔離,降低系統複雜度 |
| 代表語言 | C, C++, Java (早期), Assembly | SQL, HTML, CSS, Haskell, React (UI 層) |
宣告式的兩大分支#
- 函數式程式設計 (Functional):透過數學函數的運算式變換與計算來求值
- 邏輯式程式設計 (Logical):透過事實(Facts)和規則(Rules),利用數理邏輯進行推導與論證
三大核心範式比較表#
| 範式 | 程式本質 | 輸入 | 輸出 | 設計重點 | 運行機制 |
|---|---|---|---|---|---|
| 命令式 | 自動機 | 初始狀態 | 最終狀態 | 設計指令 | 執行命令 |
| 函數式 | 數學函數 | 自變數 | 應變數 | 設計函數 | 運算式變換 |
| 邏輯式 | 邏輯證明 | 假設 | 結論 | 設計命題 | 邏輯推理 |
3. 物件範式:民主制社會的法則#
物件導向程式設計(OOP)將系統視為一組相互作用的「物件」集合。 雖然 OOP 大多基於命令式語言,但它也可以融合函數式或邏輯式的特性。
OOP 的三大支柱與身份隱喻#
| OO 原則 | 社會學隱喻 (身分認同) | 技術層面的實踐 | 價值與目的 |
|---|---|---|---|
| 封裝 (Encapsulation) | 個體身分 (Privacy/Boundary) | 隱藏內部屬性,僅透過 Public 方法溝通 | 保護主權:確保個體狀態不被外力非法篡改,維持自主性 |
| 繼承 (Inheritance) | 家庭身分 (Lineage/Legacy) | 子類別承接父類別的特徵與行為。 | 承襲資源:建立層級與血緣,達成程式碼重用與文化傳承 |
| 多型 (Polymorphism) | 社會身分 (Roleplay/Contract) | 同個介面,依據執行物件展現不同結果 | 適應環境:讓物件在不同社交場景(Context)中展現多元行為 |
維度 程序式設計 (君主制) 物件式設計 (民主制) 權力中心 程序 (Procedure/Function):邏輯凌駕於一切 物件 (Object/Data):資料與行為封裝於個體 設計哲學 Top-Down (自上而下):君主發號施令,逐層拆解任務 Bottom-Up (自下而上):定義個體行為,透過協作達成目標 資料關係 資料是被動的臣民,等待被程序處理 資料是主動的公民,擁有自己的狀態與能力 應對變革 脆弱:君主決策錯誤或主流程變動,全局崩潰 強韌 (Robust):局部變動由個體吸收,社會整體架構穩定 擴張性 隨著複雜度增加,中央管理的成本呈指數級成長 適合大型系統,透過增加物件與介面來橫向擴展
觀念導正:
- OOP 並非萬能,不能脫離其他範式存在
- 可維護性、擴充性是所有範式的共同目標,非 OOP 獨有
- OOP 的優勢與其說是「重用性」,不如說是 「易用性」
4. 並行範式:合作與競爭#
並行式程式設計(Concurrent Programming)是為了更真實地模擬現實世界並提升效率。
- 特徵:以處理程序(Process)為導向,以任務為中心。主線在於資源的分享與競爭
- 優勢:提高執行效率、改善使用者體驗(回應力)、保證公平競爭
- 設計目標:
- 軟體易於重用、維護和測試
- 有效利用資源,最佳化性能
- 保障處理程序的安全(Safety)和活性(Liveness)
總結:五大範式體系對照#
最後,我們將上述提到的範式進行一次宏觀的體系比較:
| 範式 | 體系隱喻 | 核心模組 | 模組關係 |
|---|---|---|---|
| 程序式 | 君主 | 程序 (Procedure) | 授命與聽命 |
| 函數式 | 數學 | 函數 (Function) | 替換與合成 |
| 邏輯式 | 邏輯 | 斷言 (Assertion) | 歸納與演繹 |
| 物件式 | 民主 | 物件 (Object) | 交流與服務 |
| 並行式 | 生產 | 處理程序 (Process) | 競爭與合作 |