【オブジェクト指向のこころ】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つの関心事に基づいているべきで、そうしないと凝縮度が高められない。
まとめ
デザインパターンの目的は流動的要素を隔離する、ということであり、共通性/可変性分析も結果的に同じことを行っている。
そのため、共通性/可変性分析のアプローチでも、デザインパターンから考えるアプローチでもどちらも似た解決策が得られる。
しかし、以下のような違いがある。
- 共通性/可変性分析の利点は、いつでもこの手法を採用できるという点である。
- デザインパターンを用いた設計は、問題領域に存在しているパターンを特定できなければ採用できない。