本章主軸#

現實世界的問題從來不規則。當特例與變化多到讓你抓不到全貌時,需要一個工具把變動「攤開來看」。本章介紹作者自創的分析矩陣(Analysis Matrix)——一個簡化版的決策表,可揭露問題中的概念與變化,並指引出該用哪些設計模式。

步驟總覽#

  1. 取一個情境,挑出最重要的功能點,整理為矩陣(每列是一個概念)
  2. 處理下一個情境,需要時擴展矩陣
  3. 出現新概念時新增列,即使其他情境暫時沒有對應實作
  4. 代表規則
  5. 代表特定情境
  6. 從矩陣識別適用的模式
  7. 發展高層設計

案例:跨國 e-commerce#

需求:先支援美國與加拿大;之後再加德國等。

概念美國銷售加拿大銷售德國銷售
Calculate freightUPS ratesCanadian shipperGerman shipper
Verify addressU.S. postal rulesCanadian postal rulesGerman postal rules
Calculate taxState and local taxesGST + PSTGerman VAT
MoneyUSDCADDM
Datesmm/dd/yyyydd/mm/yyyydd/mm/yyyy
Maximum weight30 kg

矩陣建立過程中自然會發現需求漏洞——某個情境提到了重量上限,其他卻沒提;這種不一致就是回頭追問客戶的具體題目。

客戶的特性:

  • 對問題領域非常熟,但不擅長以概念表達
  • 常用「always」「never」其實是「usually」「seldom」
  • 你問具體問題就能得到好答案,問「還有什麼」幾乎沒用

從矩陣讀出模式#

列 → Strategy#

每一列是「某個概念在不同情境下的不同實作」——典型的 Strategy 場景。 (Money、Dates 兩列例外,可用語言內建類型搭配 Currency / Locale 處理。)

欄 → Abstract Factory#

每一欄是「某個情境要用的整組物件」——典型的 Abstract Factory 場景。

結合起來#

  1. 為每一列建立一個 Strategy
  2. 為每一欄建立一個 ConcreteFactory,負責挑出該情境要用的 Strategy 們

Figure 16-1: 高層應用設計——AbstractFactory(USAF/CanAF/GermanAF)與三組 Strategy(Tax、Freight、Address)合作

變體:印製銷售單#

若再加上印單需求:

  • 美國:要表頭
  • 加拿大:表頭 + 表尾
  • 德國:兩個不同的表尾

可用 Decorator 列表示。幾乎任何牽涉多型的模式(Bridge、Composite、Chain of Responsibility、Command、Decorator、Iterator、Mediator、Observer、Proxy、Template、Visitor)都可能在分析矩陣中出現。

矩陣中的矩陣#

實務上常出現「矩陣裡又有矩陣」。例如美國運送,可再依運送商(USPS、UPS、FedEx)拆分。當情境太複雜,作者會先用矩陣中的矩陣,再進一步轉成共通/差異表。

何時最有用?#

  • 需求散亂、特例多到無法掌握全貌時
  • 客戶以「特例」而非「規則」描述問題時
  • 把複雜問題壓進一張表後,模式自然浮現

分析矩陣不一定能涵蓋整個設計,但通常能涵蓋一大塊。它是「想清楚」與「動手實作」之間極好用的橋樑。

本章重點#

  • 把每個情境逐欄填,每個概念逐列展開,新需求只需新增欄或列
  • 列代表規則 → 多半對應 Strategy 模式
  • 欄代表情境 → 多半對應 Abstract Factory 模式
  • 矩陣讓不一致與漏洞「視覺化」,是與客戶釐清需求的好工具
  • 來自人類學與認知工程的方法,在軟體領域同樣有效