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

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

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

kyonc5.hatenablog.com

パターンで考える

Bridgeパターンが最年長のパターンということが分かったため、Bridgeパターンが姿を見せるコンテキストまで設計手順を遡る。

このシステムには複数のFeature(抽象的側面)と複数のCAD/CAMシステム(実装)が存在している。

Bridgeパターンの一般構造は以下の通り。

http://www.plantuml.com/plantuml/png/ZOx1JiCm38RlVWeVGQWI3y2XBQUUaE09qjI8Y3Y97FS0fU_EganJjbNJZlR_-VFVPZMYCtl8toua8uRHUfDpfofkd9K66yE7-oLyXYyt4H8d_K4c7aaoW1cpYh5Qhh0xZYu6NE09tnA9sQQ7HrW12lHEdoxGTCwkLww1aoUce54srqbrsDUsrnYia5A5TxZSpFkIGzq0N_wQPgSQL7U5sNru5zPVl8mDLYcq5AQP_Jy0

FeatureはAbstraction、V1、V2システムはConcreteImplementorにあたる。

http://www.plantuml.com/plantuml/png/ROwxQiGm44Nx-Oef4u8XIPt28H1mbSBWVYmFH4GF8OsAFFBlQn1hQRNRtdDdxXcJK9Hi3QGlxG95igWCfVGg4lMQXIVbtQn_61_XKs-CR8DyesMxSam0j2Q9fAHSuJkJvCZu2m_u4JYIQE_kxk4Ve1Hcu-KerVWjYy-tm1nOQJ8jwJSd6vhPOtMFs-7bQG_Qpylp4S3v7b_-Xk72iKEjPmzxLwXYXHU5wxoOL0i_OAt0o6xBrfm0

次に、エキスパートシステムとCAD/CAMシステムを関連付けるModelクラスを考える。
Modelの流動的要素は、それの実装のみであるため継承を利用して実現できる。

http://www.plantuml.com/plantuml/png/JSiz3i8m38RXtQVm1Ie1CqCP6PYGs9t44X5nMjdEm0ztHsfHbSr-z7wZEQatAM2FN6TI4eo5p4xkcaDpFiUfNlEBSGVtd1XPPd-Yi0HM0w1WhXHzNU5bIbpUy0LO_zj-4UpfqD5o7Z_3i9Kz_KiOkQOcvGS0

仮に、Bridgeパターンを使用するとModelクラスは単一となり、Bridgeモドキになってしまう。

http://www.plantuml.com/plantuml/png/RSmxoWCn30JWNgVG1HR-FtMAJRb5ga1whIs8YMKRIoxooDq3QzWyI3TymyoeHjMQHD1pI8Kg2Rf8gZkp6kPcFBcS3k7A-0Udu1bPYbrGM6Qk2a2pMYLdVONxx3dUuF6xcAJWKdOx_Y_wGPitwZ4Fhp6iQNiVXlNWc_i9Z9nya_W4

ModelがFeatureを保持し次のようになる。

http://www.plantuml.com/plantuml/png/ROynImGn48Nx-HLJAhAWLrkS2C8LOh5WFxixO33PX6HIwEb_Tt7EtRbuxVTUykRR5w4iDNWexsvEb2dWwAcK1v7iXYfy6EFSkq_6MtXp4oE791yOE0oS2m0DHJADeg_mYKbgPZp23RuapYGkpbVNy0sWXTv7sKehVgmIwwMWJpmwyZPfDmyXcTbrTS5s-7Mt03mQSBU2viFdEB4_Q_uIj6XdqDywtdzrtPbX4rdBDcnDOTFINE_zprLiko9sk5K0zCu5deW2VNdoiaYzOC_pL8F_0G00

Facadeの適用

v1の実装はV1のFacadeを介してV1システムにアクセスする。

http://www.plantuml.com/plantuml/png/RP31IiD048RlynG3NXHfiJsBL8H23qKmu7sI3BYucmsxiuTQVNU3qoJRZRVm_PFvTxvT50gId8NuQRgU0ZbiBCNuB19CdOGFZUygyyNu01-cPMJNomaTkvf31A0wIg16z2_SCqaAZ6UunzUU0udntUqT_03eG6MzJ4CpVadYqtz1rNDZoEP9sNbmVLOxjGuuBtxV3W3F6TWeM2uy-fRjrUGVmHnjbsYpfuPQnfkZYN9wyv6nN98iHuNZY_7nUxMwib94kPaoBEt0h49plN79LSRy2h_AB0BeRGEy40MNZHhcI5q0QDjw_JIvWF53wQW0TjoroTbV

Adapterの適用

V2の実装はAdapterを用いてOOGFeatureを適合させる。

http://www.plantuml.com/plantuml/png/RP1DImCn48Rlyoi2NXJPOdiMgGYL7ah1Gk_JtG63oMP99eVwyTzTdMsIfhs5vvtCEppBmEWvMWFXG_S3UhIgDHZ2CxFNXyYqRbs_qv-a7k1TTwJ83dnKbko1V030Gs2FBSiljIBaw4bzmRtQ3kIHjUjlx-07G0Psnd4QolWbielNWjr0hKPJ9dNdsWv5RMeTSLcyNuoWtBoV9r0jtBYEpDdaFr4bMboY-GfR70tLFwEXSBLdktqz7NwpqO6FRowGaj4qyIUiGYAhWfCeeQUrwl6xQSwSLr7flGvhzv15Iou6BxcepbUuHkKH034tmea8c3PAM28n3I1jizbJCWr9kT39DO0Su9ec6mPvvYCdjJKl_DPHOHcMr7VHcby0

Abstract Factoryの適用

最後にAbstract Factoryの適用を考えるが、この段階になって初めて分かるが、このパターンは今回必要ない。

Abstract Factoryが必要とされる背景は、V1システムの使用時にすべての実装オブジェクトをV1型に、V2システム使用時はV2型に保証するためであった。
こういったことは、Modelオブジェクト自体で実現できる。
オブジェクトの生成規則を簡単にカプセル化できるオブジェクトがあるなら、Abstract Factoryパターンを実装する意味はない。

まとめ

詳細に拘泥(こうでい)し局所的な意思決定に気を取られると、大枠が曇ってしまう。
パターンはこういった曇りを拭い去る言語である。

まず初めに最も大きな枠、つまりシステムのコンテキストを形作るパターンを選択し、次に重要なパターンを追加していくことで、クラスに着目するだけでは達成できなかったアーキテクチャを生み出すことができる。
つまり局所的に洗い出された断片を組み合わせるのではなく、コンテキストによる設計を行うようにする。