面向介面程式設計不僅是「用 interface 關鍵字」,而是一種架構治理哲學。在面向對象系統中,功能由眾多對象協作完成。對象內部實現對系統設計者次要,對象間協作關係才是設計核心。從類通訊到模組交互,介面設計贯穿系統設計始終。
| 類型 | 對應概念 | Java 表達 | 語義 |
|---|---|---|---|
| 對一個體的抽象 | 抽象體 | abstract class | is-a:核心身份 |
| 對一個體某面向的抽象 | 抽象面 | interface | like-a:附加能力 |
一個體可有多個抽象面(多重實作),但僅有一個核心抽象體(單一繼承)。
Component (組件) ←→ Contract (契約/介面) ←→ Container (容器)
| 誤區 | 澄清 |
|---|---|
| 面向介面 = 面向對象 | 不同維度:OO 是建模方法,面向介面是協作治理策略 |
| 面向介面 = 面向過程 | 錯誤:面向過程關注流程實現,面向介面關注契約邊界 |
| 介面只是 Java interface | UML 介面 = 協約,可映射為 Java interface、COM interface、CORBA IDL、REST API、gRPC Protobuf 等 |
| 有介面就能複用 | 無實現的介面、無介面的實現均無價值,違背 OO 本質 |
面向介面程式設計原意 = 面向抽象協約程式設計。實現者嚴格遵循協約(如 RFC 規範),使用者僅依賴協約。這正是「介面」一詞的語源:介面 = 兩側邊界的協定。
Booch 提出的 Interaction Designer 專司介面/協作設計,層次高於類設計。當前軟體團隊最缺乏的正是此類人才:能從業務流提煉穩定契約、預見演進方向、平衡耦合與內聚。
面向介面程式設計,實為面向抽象協約程式設計。它要求我們:
老老實實面向對象建模,老老實實面向協約治理協作,才是正道。拒絕為術語爭吵,專注於構建可演進、可維護、可信賴的系統架構。