【オブジェクト指向のこころ】13章 エキスパートはどのように設計するのか?(1)

デザインパターンとともに学ぶオブジェクト指向のこころ」の学習記録。
「第13章 エキスパートはどのように設計するのか?」のまとめ。

パターンで考えるための手順

  1. パターンの洗い出し
    • 問題領域に存在するパターンを見つけ出す
  2. パターンの分析、適用(すべてのパターンを概念設計に統合するまで、2.1~2.3を繰り返す)
    1. パターンの並び替え
      • パターンがどのように他のパターンのためのコンテキストを生成するのかに従い、パターンを並び替える。
      • これは、あるパターンが他のパターンのためにコンテキストを生成することはあっても、2つのパターンが互いのコンテキストを生成しあうことは無いという考え方に基づいている。
    2. パターンの選択と設計の拡張
      • 並び替えた準にパターンを用いて、高次の概念設計を行う
    3. 追加のパターンの洗い出し
      • 分析中に出てきた追加のパターンを洗い出す
  3. 詳細の追加
    • 必要に応じてメソッドとクラス定義の拡張を行い、設計に詳細を追加する

パターンの並び替え

4つのパターンが見つかった問題領域について考える。

  • Abstract Factoryパターン
  • Adapterパターン
  • Bridgeパターン
  • Facadeパターン

問題領域に存在するパターン間の依存関係(どのパターンが他のパターンのためのコンテキストを生み出しているか)を見極めるには、パターンの組み合わせを考察すれば良い。
次の6つの組み合わせを考察する。

パターン数が多くなると、このプロセスは大変に感じるかもしれないが、パターンの多くは他のパターンと関連を持たないため、慣れればそれらを簡単に除去できるようになる。

http://www.plantuml.com/plantuml/png/TOr1oi8m44RtESN0l_x10vJIkX3SwWccoKSD9ccPJ1TLlBjTX8915zcylEzDbvL5bnZCpJiGugmhHSG1aas--pIpS2GREETULVomACvsIbV_01sC4LZbD0PGFsGLjdhQtYGhFSthuzlnh90Q7yMx4JNT6kmAhRlK_BTxxUy2zytOb5B-PRJbI15Ahzc7DQy6HQex7P9ROdW3

どのパターンがどのパターンのコンテキストを生成するのかについては、パターンの概念に着目することで決定できる。

  • Abstract Factoryパターン: 関連あるオブジェクト群(ファミリ)を生成する
  • Adapterパターン: 既存クラスAのインタフェースを適合させ、クラスBから使用できるようにする
  • Bridgeパターン: 関連オブジェクト群(パターン中の抽象的側面を具体化したクラス)から、様々な実装を使用できるようにする
  • Facadeパターン: 既存システムAをクラスBから簡単に利用できるようにする

このとき、Abstract Factoryが先頭に来ることはあり得ない。
Abstract Factoryが生成しようとしているオブジェクト(ファミリ)によって、Abstract Factoryパターンのコンテキストが生成される。
つまりAbstract Factoryパターンのコンテキストは他パターンによって生成されなければならない。

よって考察する必要があるペアは3つだけとなる。

http://www.plantuml.com/plantuml/png/VOt1YiCW48RlFiN0dWFx0659mhAmr_O99Zga4ZLX70zfwRjNYeHKIWzUll_pcouAiYJlrCKQ0lAhRE39ZyHHnTc65HazQ8SnzY9inoJqhvTmjbU2RwMOj62O744_Hc7KyfVVmXlSrFrbDhWASOq7jcQYckO6caBhBhJD7llwHPu7b-YTrPJuPwlSEaWbdhUVlN0YS-1vUFugGv7Q2dSKJFBk0G00

コンテキストを考慮すると時の規則

必要となるオブジェクトが判るまで、オブジェクトの実体化方法は気にしないようにする。
オブジェクトがすでに存在していると仮定した上での、それらの関連を考える。
そうすることで、設計中に考える物事の数をできるだけ減らすようにする。

最年長のパターンが他のパターンを制約する

最年長とは、システム内に存在し、他パターンのためのコンテキストを構築する、1つまたは2つのパターンを指す
外縁パターンやコンテキスト設定パターンとも呼ぶ。

これを意識して考察する。

AdapterパターンとBridgeパターンの考察

Adapterパターンは、クライアントが期待する形にクラスのインタフェースを変更する。
Bridgeパターンは、抽象的側面における複数の具体例をその実装から切り出す。

本書のCAD/CAMの例では、 Bridgeパターンにより抽象的側面をFeature、実装をV1、V2システムに切り出している。
そしてOOGFeature(V2におけるフィーチャークラス)を元々とは異なったインタフェースで使用している。
Adapterパターンは、Bridgeパターンが定義した実装のインタフェースに、V2システムのインタフェースを適合させるために存在している。

http://www.plantuml.com/plantuml/png/VOr12i8m44NtESM0wu87AD8M4Tpg2QR9K4EJj4mcYohUtIv2qL1SPFF-ovic2h8axzJ36WBoiopWoVV4KSNHXXaPFMY7CROYRFiaTDLJkDidmL4f9YqO1aVGzb4OjLpMD_42B_N-cGtEGbpYZgqPgAHh0qscPHVgQeiTpiXZvnBjMLME_xVohMyfn-iSsD-gq_RpHaPbiovmGy4axpu0

BridgeパターンとFacadeパターンの考察

BridgeとAdapterに対して適用した論理が、BridgeとFacadeに対しても適用できることは明らかである。

  • FacadeパターンはV1システムのインタフェースを簡潔にする
  • 新しいインタフェースを使うのはBridgeパターンのいずれかの実装である

したがってBridgeパターンがFacadeパターンのためのコンテキストを生成する

http://www.plantuml.com/plantuml/png/VOr1QiCm44NtEiM0ruOUm1JR54EXg_O4OsbmXINPZ4O5D-Jk2KJOYMEocCt_R_wheo1ByaxzMaD0VfO5FFcUEAeusZ0ZemVjCCP6X6sVX3xr57xiFy6RKanQC0oEeEcZC6hfhZVn0YTrVgWDpaAyZrksPY0ell2FWddkEzHew9Rk3L2LwspnWJosBj4HLMRDQogxxg4yNkM1uwvyNp-_oQXCRkdsKrCmoRiB

これでBridgeパターンが最年長のパターンであることが分かる。

続き↓

kyonc5.hatenablog.com