本章主軸#
設計模式並非萬能;當問題中沒有現成模式可套時,仍需有方法。本章把模式背後的精神延伸成一套通用的應用架構設計法——以共通與差異分析(Commonality and Variability Analysis, CVA)為核心。
整合新程式碼到既有系統的成本,常常比新程式本身的開發成本還高。原因是元件之間耦合過緊。
經驗豐富的開發者甚至比新手更容易掉入這個陷阱:太早思考「實體之間如何關聯」,而不先確認「實體本身對不對」。
應用架構的兩階段設計法#
- 用 CVA 找出問題領域中的「概念(commonality)」與「具體實作(variability)」
- 從使用方視角反推每個抽象的介面(即依賴倒置原則的應用)
把 CAD/CAM 問題用 CVA 解一次#
找出概念#
| 概念 | 變化 |
|---|---|
| CAD/CAM 系統 | V1、V2 |
| Feature | slot、hole、cutout、special、irregular |
| Model | V1-based、V2-based |
找概念的另一種方法:兩兩比對「這是那個的變化嗎?」「這兩者是某概念的不同變化嗎?」
一個 commonality = 一個議題#
若把問題拆成 V1Slots、V1Holes、V2Slots、V2Holes⋯⋯ 共通性看起來是「CAD/CAM features」,但其實混了兩個議題(CAD/CAM 版本 + feature 種類)。
一個 commonality 應只承載一個議題,否則設計凝聚會被破壞。
把表格翻成類別圖#
每個 commonality 變成抽象類別、其變化變成衍生類別;接下來再決定它們之間的關聯。

Figure 15-1: CVA、三種視角與抽象類別之間的對應關係(同 Figure 8-5)
補上關係#
Model包含FeatureFeature從 CAD/CAM 萃取資訊- 設計取捨:要做兩種
Model、還是讓單一Model透過共同CADCAM介面使用兩種版本? - 後者凝聚較強,因為「Model 的概念並不屬於 CAD/CAM 系統本身」
把 V1、V2 接起來#
依先前所學,V1CADCAM 用 Facade 簡化 V1,V2CADCAM 用 Adapter 包住 OOG_Part。
為什麼 CVA 與設計模式得到極相似的答案?#
兩者最終結構驚人地一致,因為它們遵循同一組原則:找出變動、封裝、設計到介面、聚合勝於繼承。
| 方法 | 強項 |
|---|---|
| CVA | 強迫你先找出對的抽象,任何問題都適用 |
| 設計模式 | 提供前人經驗,告訴你抽象之間典型的關係如何安排 |
CVA 找抽象,設計模式組關係——兩者互補。
例:CVA 不會告訴你「Facade 應做成 Singleton 以省效能、把狀態移到 Adapter 中」這種實戰級的優化;模式書才會。
設計流程簡述#
- 識別 commonality
- 從 commonality 建立抽象
- 用 variability 建立衍生
- 觀察 commonality 之間的關係
本章重點#
- 設計時最常見的錯誤是太早談「實體間關係」、太晚問「實體對不對」
- CVA 提供全域可用的找抽象方法
- 它與 Alexander 的脈絡設計、依賴倒置原則本質相同
- 與設計模式互補使用,能寫出既穩健又具彈性的架構