オブジェクト指向のこころ 第9章の練習問題の解答をまとめてみる。
基礎
新たな要求を取り扱う方法として,どのような方法があるでしょうか?
- カットアンドペーストを使用する
- switchやifを用いて個別に対応する
- 関数ポインタや委譲を使用する(それぞれが各ケースを表現する)
- 継承を使用する(各ケースごとに派生クラスを作成する)
- 機能全体を新規オブジェクトに委譲する
GoFが提案した,変更に取り組み際の基本原則を3つ挙げてください.
- 「実装を用いてプログラミングするのではなく,インターフェースを用いてプログラミングしてください」
- 「クラス継承よりもオブジェクトの集約を多用してください」
- 「あなたの設計において,何を流動的要素とするべきかを考察してください」
Strategyパターンの目的とは何でしょうか?
アルゴリズムのファミリを定義し,それぞれをカプセル化し,それらを交換可能なものにすること. Strategyパターンにより,クライアントが使用するアルゴリズムを,独立して変更できるようにする.
Strategyパターンの因果関係とは何でしょうか?
- Strategyパターンはアルゴリズムのパファミリを定義するものである.
- switchあるいは条件分岐をなくすことができる.
- すべてのアルゴリズムは,同じ方法で起動しなければならない.(すべて同じインターフェースとなっている必要がある)
応用
GoFは「設計において,何を流動的要素とするべきかを考察する」ことを示唆しています.このことと再設計の原因に着目することとは,どのように違っているのでしょうか?
このことは,どこに変更が発生するのかを予測しようとしているといえる. それにより,システムが変化の影響を受けないように変更が起きるところをカプセル化しようとしている. 変更が何であるかは予測できないことを前提としている.
コピー&ペーストにおける問題とは何でしょうか?
コードの複製は,非常に高価なメンテナンスコストを要する.
「switchの泥沼」とは何でしょうか?
switchの処理が非常に理解しづらいものとなること. 可読性も非常に悪い. 新たな条件が発生した場合,その条件に関係しそうな部分を探し回る羽目になる.
流動的要素を取り扱う際,デザインパターンのアプローチを採用する利点は何でしょうか?
- 結合度を低くできる.
- 特定の振る舞いに対して責任を持つクラスを,周囲に悪影響を及ぼすことなく変更できる
流動的要素を取り扱う際に,クラス継承アプローチよりもオブジェクトの集約アプローチの方が優れているのは何故でしょうか?
複雑で巨大なプログラムを簡潔にできる. 独立したさまざまな流動的要素を独立したクラス階層内に管理できるようにしているため拡張が容易.