設計模式 (Singleton、Decorator、Observer) 固然重要,但**面向物件設計原則 (OOD Principles)** 才是寫出可維護、可擴展代碼的根基。許多資深工程師聽過 Design Patterns 卻說不清 SOLID。本文精煉 10 大核心原則,附實戰場景。
| # | 原則 | 核心口訣 | 關鍵收益 |
|---|---|---|---|
| 1 | DRY (Don't Repeat Yourself) | 抽象共性,避免重複 | 易維護,單點修改 |
| 2 | 封裝變化 | 識別易變點,封裝起來 | 隔離影響範圍 |
| 3 | 開閉原則 (OCP) | 對擴展開放,對修改關閉 | 不動舊代碼加新功能 |
| 4 | 單一職責 (SRP) | 一個類只做一件事 | 降低耦合,易測試 |
| 5 | 依賴倒置 (DIP) | 依賴抽象而非具體 | 解耦,利於 Mock 測試 |
| 6 | 組合優於繼承 | 用 HAS-A 代替 IS-A | 運行期動態換行為 |
| 7 | 里氏替換 (LSP) | 子類必須能替換父類 | 保證多態正確性 |
| 8 | 介面隔離 (ISP) | 多個專用介面優於一個大介面 | 減少無用方法實現 |
| 9 | 面向介面編程 | 用介面類型宣告變數/參數/回傳 | 實現細節可替換 |
| 10 | 委派原則 | 讓專人做專事 (如 equals/hashCode) | 避免重複,集中維護 |
// 繼承:編譯期固定,破壞封裝,父類改動波及子類
class Bird { void fly() {} }
class Penguin extends Bird { /* 不會飛卻繼承 fly */ }
// 組合:運行期動態注入行為
interface FlyBehavior { void fly(); }
class Bird {
private FlyBehavior flyBehavior;
public void setFlyBehavior(FlyBehavior fb) { this.flyBehavior = fb; }
public void performFly() { flyBehavior.fly(); }
}
《Effective Java》條目 18 強力推薦。
// 悪例
ArrayList<String> list = new ArrayList<>();
list.add("a");
// 優例
List<String> list = new ArrayList<>(); // 變數型別用介面
// 後續可無縫換成 LinkedList、CopyOnWriteArrayList
理論是第一步,**實戰中反覆權衡、重構、體會** 才能內化。原則非教條,權衡取捨才是架構師核心能力。