現代語言雖強制面向對象結構(無 goto、基於類),但「看起來像 OO」不代表「符合 OO 原則」。依賴管理是軟體架構優劣的分水嶺:惡劣依賴導致代碼難改、易破、不可復用;良性依賴賦予靈活、健壯、可復用。本文梳理 Bob 大叔 (Robert C. Martin) 提出的 11 大原則,聚焦依賴管理。
一個類應有且僅有一個變更理由。 若類承擔多項職責,修改其中一項可能破壞其他職責,導致耦合與脆弱性。
對擴展開放,對修改封閉。 通過抽象介面與多態,在不修改現有代碼前提下新增功能。是所有原則的終極目標。
子類型必須能替換其基類型。 派生類不應破壞基類契約(前置條件不強於基類,後置條件不弱於基類),確保多態行為正確性。
依賴抽象,而非具體實現。 高層模組不應依賴低層模組,二者應依賴抽象;抽象不應依賴細節,細節應依賴抽象。打破傳統自上而下的依賴鏈。
客戶不應強迫依賴它不使用的介面。 將臃腫介面拆分為多個專用介面,降低耦合,防止「介面污染」。
重用粒度 = 發布粒度。 只有通過發布單元追蹤版本、授權,重用才可控。包內所有類必須共享同一版本號。
包內所有類對同一類變化應共同封閉。 將因同類業務變更而聚合的類放入同一包,變更影響局限於單一包內。
包內所有類應共同重用。 不應強迫依賴者依賴它不需要的類。違反 CRP 會導致不必要的重新發布與編譯。
包依賴圖中不得存在環。 環狀依賴導致發布順序死鎖、測試困難、強制整體部署。解決:創建新包、應用 DIP 反轉依賴。
依賴方向應指向穩定性更高的包。 穩定性 = 不易變更(被多包依賴、抽象度高)。易變包依賴穩定包,反之則傳播不穩定。
包的抽象程度應與其穩定程度一致。 高穩定包應高抽象(介面/抽象類為主),低穩定包應具體(實現類為主)。主序列:抽象度 + 穩定度 = 1。
這 11 原則構成依賴管理的完整體系:前 5 原則治理類級依賴,後 6 原則治理包級依賴。掌握它們,即掌握了讓軟體架構保持優良、可演進的基石。