介面是組件對外服務的唯一協議。組件間、組件與客戶間僅透過介面交互。這一定律賦予介面三大核心屬性:
1. 契約穩定性:發布即凍結
- 介面語法/語義一旦發布,嚴禁修改,否則破壞所有現有客戶
- 新增功能 → 定義新介面(
IServiceV2),舊介面保持不變
- 組件可同時實現舊/新介面,平滑遷移
2. 自我描述性:零耦合發現
- 介面定義不依賴具體實現,徹底切斷「使用者-實現者」耦合
- 標準描述:.NET 中繼資料(IL + 型別資訊),取代傳統 IDL
- 反射 API 完整暴露介面結構,支援動態發現、代理生成、文檔自動化
3. 演進策略:增量擴展不破壞
- 新服務 → 新介面,客戶自主選擇升級時機
- 組件內部重構自由,只要介面行為不變
- 版本管理:組件強名稱版本號 + 介面命名版本(
IPaymentV1/V2)
介面設計鐵律
- 單一職責:一個介面只做一件事(
IPayment、IRefund、IInvoice 分離)
- 最小完整:介面包含完成業務閉環的最小方法集
- 無狀態:介面方法盡量無副作用,狀態由實現者封裝
- 異常契約:文檔化可能拋出的異常型別與條件
反模式警示
- ❌ 「萬能介面」:
IManager 包含 50+ 方法,實現者被迫空實現
- ❌ 介面洩露實現細節:參數/回傳型別暴露具體類別(應用抽象型別/介面)
- ❌ 頻繁修改公開介面:導致客戶地獄升級
- ❌ 介面循環依賴:
IA 參考 IB,IB 參考 IA
介面不只是語法結構,更是架構邊界的法律條文。嚴守介面規範,是構建長壽命、可演進、多團隊協作系統的前提。