本章主軸#

設計模式並非萬能;當問題中沒有現成模式可套時,仍需有方法。本章把模式背後的精神延伸成一套通用的應用架構設計法——以共通與差異分析(Commonality and Variability Analysis, CVA)為核心。

整合新程式碼到既有系統的成本,常常比新程式本身的開發成本還高。原因是元件之間耦合過緊。

經驗豐富的開發者甚至比新手更容易掉入這個陷阱:太早思考「實體之間如何關聯」,而不先確認「實體本身對不對」。

應用架構的兩階段設計法#

  1. CVA 找出問題領域中的「概念(commonality)」與「具體實作(variability)」
  2. 使用方視角反推每個抽象的介面(即依賴倒置原則的應用)

把 CAD/CAM 問題用 CVA 解一次#

找出概念#

概念變化
CAD/CAM 系統V1、V2
Featureslot、hole、cutout、special、irregular
ModelV1-based、V2-based

找概念的另一種方法:兩兩比對「這是那個的變化嗎?」「這兩者是某概念的不同變化嗎?」

一個 commonality = 一個議題#

若把問題拆成 V1Slots、V1Holes、V2Slots、V2Holes⋯⋯ 共通性看起來是「CAD/CAM features」,但其實混了兩個議題(CAD/CAM 版本 + feature 種類)。

一個 commonality 應只承載一個議題,否則設計凝聚會被破壞。

把表格翻成類別圖#

每個 commonality 變成抽象類別、其變化變成衍生類別;接下來再決定它們之間的關聯。

Figure 15-1: CVA、三種視角與抽象類別之間的對應關係(同 Figure 8-5)

補上關係#

  • Model 包含 Feature
  • Feature 從 CAD/CAM 萃取資訊
  • 設計取捨:要做兩種 Model、還是讓單一 Model 透過共同 CADCAM 介面使用兩種版本?
  • 後者凝聚較強,因為「Model 的概念並不屬於 CAD/CAM 系統本身」

把 V1、V2 接起來#

依先前所學,V1CADCAM 用 Facade 簡化 V1,V2CADCAM 用 Adapter 包住 OOG_Part

為什麼 CVA 與設計模式得到極相似的答案?#

兩者最終結構驚人地一致,因為它們遵循同一組原則:找出變動、封裝、設計到介面、聚合勝於繼承。

方法強項
CVA強迫你先找出對的抽象,任何問題都適用
設計模式提供前人經驗,告訴你抽象之間典型的關係如何安排

CVA 找抽象,設計模式組關係——兩者互補

例:CVA 不會告訴你「Facade 應做成 Singleton 以省效能、把狀態移到 Adapter 中」這種實戰級的優化;模式書才會。

設計流程簡述#

  1. 識別 commonality
  2. 從 commonality 建立抽象
  3. 用 variability 建立衍生
  4. 觀察 commonality 之間的關係

本章重點#

  • 設計時最常見的錯誤是太早談「實體間關係」、太晚問「實體對不對」
  • CVA 提供全域可用的找抽象方法
  • 它與 Alexander 的脈絡設計、依賴倒置原則本質相同
  • 與設計模式互補使用,能寫出既穩健又具彈性的架構