【オブジェクト指向のこころ】16章 分析マトリクス

デザインパターンとともに学ぶオブジェクト指向のこころ」の学習記録。
「第16章 分析マトリクス」のまとめ。

分析マトリクス

概念における流動的要素は、アナリストが直面する最大の難関の一つと言える。
分析マトリクスは、流動的要素を整理する際に役立つことができる分析ツールである。

これは簡単なテクニックながら、現実世界に数多く存在する小さな問題領域から大きな問題領域までを扱えるものとなっている。

手順

本書のe-コマース企業の受注処理システムの例。
このシステムでは、多くの国からの注文を処理する必要がある。

最初の要求であるアメリカとカナダからの注文を考える。
以下はシステムが取り扱う必要がある初期機能の一覧である。

  • アメリカとカナダ向けの受注処理システムを構築する。
  • 顧客が住んでいる国に基づいて送料を計算する。
  • 顧客が住んでいる国の通貨を取り扱う。
  • アメリカ国内の場合、その地域に基づいて税金を計算する。
  • 住所の確認は、顧客が住んでいる国の郵便規則を使用する。
  • カナダ国内の場合はFedEx(国際宅配便)のカナダあて送料を使用し、GST(連邦政府税)とPST(州税)を適用する。

要求をシナリオに分類する

まず最初に行うべきは、今わかっている要求を2つのシナリオに分類すること。

  • 顧客がアメリカに住んでいる場合
  • 顧客がカナダに住んでいる場合
ケース 手続き
アメリ UPSの価格表を使用し送料を計算する。
住所の確認は、アメリカの郵便規則を使用する。
地域に基づいて売上税および/あるいはサービス税を計算する。
通貨は米ドルを使用する。
カナダ 通貨はカナダドルを使用する。
住所の確認は、カナダの郵便規則を使用する。
カナダにはFedExを使って発送する。
カナダ各州の税法に従い、物品および/あるいはサービスに基づいて
税金(GSTおよびPST)を計算する。

この段階での目標は、変化する概念を洗い出すこと、共通性のポイントを洗い出すこと、見落としている要求を洗い出すことである。

概念を見つけ出す

実装する必要のある各機能に着目し、それが表現している概念を見つけ出す。
各機能を独立した行に記述し、それが表現する概念を一番左側に記述する。

まず「UPSの価格表を使用し、送料を計算する」を考える。

アメリカ国内からの注文
送料の計算 UPSの価格表を使用する

次の情報である「住所の確認は、アメリカの郵便規則を使用する」の行を追加する。

アメリカ国内からの注文
送料の計算 UPSの価格表を使用する
住所の確認 アメリカの郵便規則を使用する

このように進めると次の表になる。

アメリカ国内からの注文
送料の計算 UPSの価格表を使用する
住所の確認 アメリカの郵便規則を使用する
税金の計算 州税と地方税を使用する
通貨 米ドル

この後はケース毎に列を追加する。

アメリカ国内からの注文 カナダ国内からの注文
送料の計算 UPSの価格表を使用する FedExの価格表を使用する
住所の確認 アメリカの郵便規則を使用する カナダの郵便規則を使用する
税金の計算 州税と地方税を使用する GSTとPSTを使用する
通貨 米ドル カナダドル

新たにドイツ国内からの注文というケースが発生した場合を考える。
新たなケースによって新たな概念が出てきた場合、その他のケースに適用できない概念であったとしても、新たに行を追加する。
これにより分析の網羅性を確認することができる。

アメリカ国内からの注文 カナダ国内からの注文 ドイツ国内からの注文
送料の計算 UPSの価格表を使用する FedExの価格表を使用する ドイツの運用会社の価格表を使用する
住所の確認 アメリカの郵便規則を使用する カナダの郵便規則を使用する ドイツの郵便規則を使用する
税金の計算 州税と地方税を使用する GSTとPSTを使用する ドイツVATを使用する
通貨 米ドル カナダドル ドイツマルク
日付 mm/dd/yyyy dd/mm/yyyy dd/mm/yyyy
重量制限 30kg

顧客へ「アメリカやカナダでも重量制限があるのか?」と質問することで、「他に何かありませんか?」という曖昧な質問では得られなかった情報を確認することができる。

行と列の規則を確認する

「送料の計算」を見ると、「UPSの価格表を使用する」、「FedExの価格表を使用する」、「ドイツの運送会社の価格表を使用する」となっている。
この行は以下のことを表している。

  • 「送料の計算」を実装するための一般的な規則
  • 実装すべき特定の規則

それぞれの行は一般化された概念を実装する際における特定の方法を表現している。

アメリカ国内からの注文 カナダ国内からの注文 ドイツ国内からの注文
送料の計算 送料の計算方法についての具体的な実装
住所の確認 住所の確認方法についての具体的な実装
税金の計算 税金の計算方法についての具体的な実装
通貨 Moneyオブジェクトを使用することで内部に保持したCurrencyとAmountから自動的に通貨換算を行う
日付 Dateオブジェクトを使用することで、顧客の居住国に合った形式で日付を表示する
重量制限 重量制限を確認する方法について具体的な実装

続いて列について考える。
最初の列は、アメリカ国内からの注文を処理するために使用される具体的な実装を示している。

アメリカ国内からの注文 カナダ国内からの注文 ドイツ国内からの注文
送料の計算 アメリカ国内から注文が発生した場合に使用される カナダ国内から注文が発生した場合に使用される ドイツ国内から注文が発生した場合に使用される
住所の確認
税金の計算
通貨
日付
重量制限

デザインパターンを洗い出す

  • 「送料の計算」は「送料はどのようにして計算するのか?」ということを表している。
    カプセル化されるアルゴリズムは「送料の計算」であり、具体的な規則が「UPSの価格表」、「FedExの価格表」、「ドイツの運送会社の価格表」である。
  • 「通貨」と「日付」の行は、国によって振る舞いを変えるものの、アプリケーションを通じて一貫した整合性を持つはずである。

「通貨」と「日付」以外の行は、Strategyパターンとして考えることができる。

アメリカ国内からの注文 カナダ国内からの注文 ドイツ国内からの注文
送料の計算 「送料の計算」規則をカプセル化したStrategyパターンとして実装できる
住所の確認 「住所の確認」規則をカプセル化したStrategyパターンとして実装できる
税金の計算 「税金の計算」規則をカプセル化したStrategyパターンとして実装できる
通貨 内部に保持したCurrencyとAmountから自動的に通貨換算を行う、Moneyオブジェクトを使用することができる
日付 顧客の居住国に合った形式で日付を表示する、Dateオブジェクトを使用することができる
重量制限 「重量制限の計算」規則をカプセル化したStrategyパターンとして実装できる

続いて列について考える。
各列は、各ケースに対して使用する規則を表している。
こういったエントリは、そのケースに必要となるオブジェクトのファミリを表している。
つまりAbstract Factoryパターンとして考えることができる。

アメリカ国内からの注文 カナダ国内からの注文 ドイツ国内からの注文
送料の計算 これらのオブジェクトはAbstract Factoryパターンを用いて体系化することができる これらのオブジェクトはAbstract Factoryパターンを用いて体系化することができる これらのオブジェクトはAbstract Factoryパターンを用いて体系化することができる
住所の確認
税金の計算
通貨
日付
重量制限

高次のアプリケーション設計を行う

いくつかの行はStrategyパターン、各列はAbstract Factoryパターン中を用い、次のような設計を行うことができる。

http://www.plantuml.com/plantuml/png/TPF1QXH148Rl_HG5NXJ9uZb8oB2mua64R7o0tkqY6RPxUkckaQmna9pKWueNnQkdu24F8FWqIZPv2zlQTQpfz2piOVwF_kUVlxhs8-b0hRCgBkfcgODsCBSwneeerBEMyEdSDzFw5S8ZTLmR17HBMe53DyCGbTApI47FQNCAgktZ9FrzM06SgeVWz0B7siuFzSdz1-9v4h0-EgQULXbpq5gCIJnJQcFwObfDuDwpEjBgm4TCdXqQwoOngJp1uEw8XpeknhwXuAt58C1KMupFWy40h6QV8r8oRpmXa5_kmktvnVNdhpUNRzTNNtvTN4tJASAZrV_8ssF3kQMlp2v18H3NoBMU_cDdGFgaShvjKfUm2yQtCukzkElB3xTlFXNYTdcJwt3M1FESGiplW341O-Gnva5VQbiRJPZ6A-Fz_ldn-jtv-jkFc-_lYst-zHoEnpJF9zJyLZv-lRF3jwf8sB6Cs9cfabU3KJVo7B7X8ElDd6rvmCnuAb9YAw492vQLx9xXjhi2I4vb8kfJghyvC1hjYPrHIkoFPy_kwqeeHSnb-NQbUDD7wRSdwko9oQ8lSCnzR4phx1y0

マトリクス内のマトリクスを考える

現実的には、単純な分析マトリクスだけで収まらない場合がある。

アメリカ国内からの注文 カナダ国内からの注文
送料の計算 アメリカの運送会社の規則を使用 FedExの価格表を使用する
住所の確認 アメリカの運送会社の規則を使用 カナダの郵便規則を使用する
税金の計算 州税と地方税を使用する GSTとPSTを使用する
通貨 米ドル カナダドル

分析マトリクス内部に、もう一つのマトリクスを保持させる。
太字の部分を分析すると次のようになる。

送料の計算 郵便小包を使用 UPSを使用 FedExを使用
住所の確認 郵便規則を使用 郵便規則を使用(私書箱宛ては不可) 郵便規則を使用
ピックアップチャージ - $5.00 $4.00
重量制限 50ポンド 70ポンド 無制限

まとめ

分析マトリクスは問題領域に存在する流動的要素の整理と洞察に活用することができるが、これだけで設計における全ての側面を補足できるわけではない。
最も有効となるのは、数多くの特殊ケースが存在し、全体像が見えなくなっているような場合である。
このような場合は分析マトリクスを使うことで何らかの改善がみられるはずである。