オブジェクト指向のこころー演習問題(第4部)


以下の問題及び回答は書籍を参考に記載しています。また一部引用があります。

第12章:エキスパートはどのように設計するのか?

基礎

Q1. Alexanderは、優れた設計を特徴付けるため、「活き活きした」という言葉を使用しています。ソフトウェアの場合、どういった用語を使用するのが良いでしょうか?
A1. 堅牢で柔軟なシステム

Q2. 優れた設計を行うには、何を念頭に置いておく必要があるでしょうか?
A2. 全体像またはコンテキスト。

Q3. Alexanderは、設計を行うための最前のアプローチには「複雑化」がある示唆しています。これはどう行った意味でしょうか?
A3. 最も簡潔な用語(概念レベル)によって問題を捉え、その後、追加機能を付加(区別)し、情報の追加によって設計をより複雑化していく考え方

Q4. Alexanderにとって、パターンは何の関係を定義するものなのでしょうか?
A4. 問題領域における実体化の関連を定義するもの

Q5. Alexanderの設計手順を述べてください。
A5.
・パターンの洗い出し:問題領域内に存在するパターンを洗い出す。洗い出したパターンを用いて問題について考える。ただし、パターンの目的が実体間の関連を定義するものであることは忘れないようにする。
・コンテキストを作るパターンの発見:最初に、他のパターンのためのコンテキストを作るパターンを洗い出す。
・コンテキスト内への着目:それ以外のパターンと、発見していない他のパターンがないかという点に着目する。これらの作業で得られたものから、残りのパターンのためのコンテキストを作るパターンの洗い出しを行う。
・設計の洗練:パターンのが意味しているコンテキスト常に意識しながら行う。
・実装:詳細を組み込む。

応用

Q1. Alexanderは、「既存の部品を追加していくことによって自然なものを作ることは不可能である」と述べています。これはどう行った意味なのでしょうか。
A1. 単に既存のものを組み合わせるだけでは、特定のニーズにうまく合わせたものを作ることができず、ニーズにフィットさせて行くには、より大きな全体のコンテキストの中に位置付けが必要ということ。(抽象クラスによる、インターフェースなど)

第13章:CAD/CAMの問題をパターンによって解決す

基礎

Q1. この章で解説した、パターンを用いたソフトウェア設計の3つの手順を答えてください。
A1.
・パターンの洗い出し
・パターンの分析・適用
・詳細の追加

Q2. コンテキストを定義してください。
A2. 何らかのものをその中に存在させる、または発生させる、互いに関連し合う条件、環境や設定のこと。

Q3. 最年長のパターンを定義してください
A3. システム内に存在し、他のパターンのためのコンテキストを構築する、1つまたは2つのパターン。これによって、他のパターンの行えることが限定される。

Q4. 2つのパターンのうち、どちらが「年長」であるかを調べるための2つの規則を答えてください。
A4.
・あるパターンが他のパターンの振る舞い方を定義しているか。
・2つのパターンが互いに影響を与えあっているか。

Q5. パターンの一般的構造を定義してください。それはいつ使用
するのでしょうか?
A5.
クラス図のこと。問題に適用する際に、クラス名を置き換えるなどして使用する。

応用

Q1. パターンを用いれば、必ず問題を定義することができるのでしょうか?できない場合、他に何が必要なのでしょうか?
A1.
できない。パターンを用いる方法は、問題領域全体をパターンの観点から理解出来る場合にのみ有効。一般的には、問題領域内に存在する概念間の関係を洗い出すことにより、他の部分を肉付けする必要がある。これは、共通性/可変性分析によって行う。

Q2. CAD/CAMの問題に置いて、Abstract Factoryは「最年長」のパターンから除外されました。その理由を答えてください。
A2.
オブジェクトの使用によって生まれるパターンは、オブジェクトの実体化に関するパターン(生成に関するパターン)のためのコンテキストを生成する。よって、必要となるオブジェクトを決定したあとにファクトリが定義される。つまり、ファクトリはコンテキストを生成するパターンではないので、除外される。(よって、この問題に限らず、一般的にAbstract Factoryは最年長のパターンになりづらい)

Q3. CAD/CAMの問題に置いて、BridgeがAdapterよりも年長であると判断された理由は何でしょうか。
A3.
Adapterパターンは、インタフェースを変更するものである。この例では、OOGFeatureをクライアンの期待するインタフェースに変える。Bridgeパターンは、抽象的側面nにおkる複数の具体例をその実装から切り出すものである。この例では、抽象的側面であるFeatureを実装V1,V2から切り離す。このとき、Bridgeパターンは、OOGFeatureを元々とは異なったインタフェースで使用する。そのため、Adapterを必要とする。よって、BridgeがAdapterを使用する。よって、BridgeパターンがAdapterパターンのコンテキストを生成するため、Bridgeがより年長と判断された。