【オブジェクト指向のこころ】15章 共通性/可変性分析

デザインパターンとともに学ぶオブジェクト指向のこころ」の学習記録。
「第15章 共通性/可変性分析」のまとめ。


共通性/可変性分析: Commonality / Variability Analysis(CVA)

手順

本書では、アプリケーションの設計を行う際、次の手順で行うことを推奨している。

共通性/可変性分析を用いて、概念と実装を洗い出す

共通性/可変性分析を用いて、問題領域内に存在している概念(共通性)と具体的な実装(可変性)を洗い出す。
この時点で主な興味の対象は、存在している概念の洗い出しだが、このプロセスの途中で多くの可変性も洗い出される。

抽象的側面のインタフェースを規定する

必要な機能に対する概念が洗い出せたら、次はそれをカプセル化する抽象的側面のインタフェースを規定する。
この抽象的側面から派生する具体的実装の使用方法を考えながら、インタフェースを導き出す。

具体例

本書のCAD/CAMシステムでは以下の要素が見つかった。

  • さまざまなCAD/CAMシステム:
    • V1システムとV2システム
  • さまざまなフィーチャー:
    • スロット、ホール、カットアウトなど
  • さまざまな種類のモデル:
    • V1に基づいたモデルとV2に基づいたモデル

さまざまなCAD/CAMシステムが存在するということは、「CAD/CAMシステム」という概念が存在し、その流動的要素としてV1システムとV2システムが存在しているということである。

この分析を進めるアプローチとして、問題領域から2つの言葉を任意に選択し、以下の質問をしてもよい。

  • いずれかは、もう一方の流動的要素なのか?
  • これらはいずれも、何か他のものの流動的要素なのか?

例えば、

  • フィーチャーとスロットの存在に気付いた場合、スロットはフィーチャーの一種のため、「フィーチャー」は共通性であり、「スロット」はその流動的要素と類推できる。
  • スロットとホールの存在に気付いた場合、いずれかがもう一方の流動的要素になっているようには見えない。両方「フィーチャー」の流動的要素だと類推する。

このようにして共通性と流動的要素を導くことができる。

共通性 流動的要素
CAD/CAMシステム V1システム
V2システム
フィーチャー スロット
ホール
カットアウト
スペシャ
イレギュラー
モデル V1に基づいたモデル
V2に基づいたモデル

しかし、このように分析が上手くいかない場合もあり、概念を見過ごす例としては次のような場合がある。

V1Slot、V1Hole、V2Slot、V2Holeが存在すると考えた場合、この場合の共通性は「CAD/CAMシステムのフィーチャー」となってしまう。
この共通性には「CAD/CAMシステム」と「フィーチャー」という2つの概念が含まれている。
共通性/可変性分析では共通性はそれ自体が1つの関心事に基づいているべきで、そうしないと凝縮度が高められない。

まとめ

デザインパターンの目的は流動的要素を隔離する、ということであり、共通性/可変性分析も結果的に同じことを行っている。
そのため、共通性/可変性分析のアプローチでも、デザインパターンから考えるアプローチでもどちらも似た解決策が得られる。

しかし、以下のような違いがある。

  • 共通性/可変性分析の利点は、いつでもこの手法を採用できるという点である。
  • デザインパターンを用いた設計は、問題領域に存在しているパターンを特定できなければ採用できない。