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


第20章:生成に関するパターンから得られる教訓

基礎

Q1. 「ファクトリ」を定義してください。
A1. 他のオブジェクトを実体化するために使用される、メソッド、オブジェクトなど。

Q2. 以前の章で解説したファクトリパターンの名前を答えてください。この章で言及したファクトリパターンの名前を答えてください。
A2. 前の章:Abstract Factoryパターン、この章:Builderパターン、Factory Methodパターン、Prototypeパターン、Singletonパターン

Q3. オブジェクトの生成、管理が必要となった際に使用する一般規則を答えてください
A3. オブジェクトは、他のオブジェクトを生成および/あるいは管理するか、ほかのオブジェクトを使用するかのどちらかのみを行い、双方を行ってはいけない。

応用

Q1. オブジェクト指向プログラミングを初めて間もない開発者は、オブジェクトの生成管理とオブジェクトの実体化をごちゃまぜにして考えがちです。これによって生み出される問題を答えてください。
A1. どのオブジェクトを生成するのか、生成パラメータは何か、生成後はどうやってしようするのか、複数のオブジェクトをどうやって管理するのかを関知する必要が出てくる。そのため、凝集度が低下する

Q2. ファクトリによって凝集度が高くなります。その理由を答えてください。
A2. ファクトリを用いない場合を考える。この場合、状況毎に、コードの機能と、どのオブジェクトを実体化及び管理するかという規則をまとめて扱わなければならなくなる。これらを分離することによって、特定クラス内ではどちらか一方を扱えば済むようになる。

Q3. ファクトリによってテスティングの効率が改善されます。それは、どういった場合でしょうか?
A3. 使用側は派生クラスに関係なくテストでき、ファクトリ側
は派生クラス毎に独立してテストできる場合?

第21章: SingletonパターンとDouble-Checked Lockingパターン

基礎

Q1. Singletonとは、どういったタイプのパターンなのでしょうか?パターンの分類では、どのカテゴリに属するのでしょうか?
A1. 生成に関するパターン。特定クラスのオブジェクトを1つだけ実体化したい場合に使用する。

Q2. Singletonパターンの目的を答えてください。
A2. オブジェクトを1つだけ欲しいものの、そういったオブジェクトの実体化を制御するような大域的なオブジェクトが存在しない。また、このオブジェクトの同一インスタンスを、すべての実体間で参照を引き回すことなく使用させたい。

Q3. Singletonの責務は、いくつのオブジェクトを生成することでしょうか?
A3. 1つだけ

Q4. Singletonは、オブジェクトを生成するための特殊なメソッドを使用します。このメソッドの特殊な点を解説してください。
A4.
1. メソッドが呼び出されたとき、オブジェクトがすでに実体化されているかどうかをチェックする。
2. コンストラクタをprotectedかprivateで宣言

Q5. SingletonパターンとDouble-Checked Lockingパターンは、どのようにして使い分けるのでしょうか?
A5.マルチスレッドアプリケーションの場合に、Double-Checked Lockingパターンを使用する。

応用

Q1. オブジェクトを1つだけ実体化させるという責務は、該当オブジェクト以外のオブジェクトに課した方がよいのでしょうか?その答えと理由を述べてください。
A1.
該当オブジェクトに課した方がよい。そうしないと、オブジェクトを管理するためのオブジェクトが必要となる。

第22章: Object Poolパターン

基礎

Q1. 設計時に従うべき、一般的な3つの戦略とは何でしょうか?
A1.
1. 自分の本能に注意を支払う
2. 自分自身(システム自身)システム変更の影響からシールドする
3. クライアントコードから切り離す(最も重要な問題に集中できるようになる)

Q2. Object Poolパターンに組み込まれている2つのパターンとは何でしょうか?
A2.
1. Singletonパターン
2. Objectの生成と管理をするfactoryパターン

Q3. Object Poolパターンの目的は何でしょうか?
A3. オブジェクトの生成が高価なものであるか、生成可能なオブジェクト総数が制限されている際に、オブジェクトの再利用を管理する

応用

Q1. エクストリームプログラミングのコミュニティで使われているYAGNIという言葉の意味を答えてください
A1. YANGIはYa ain't gonna need itの略で、訳すと、「そんな機能必要にならないって」ということ。今必要なものだけを
開発し、それ以外は無視スべきであるという考え方。

第23章: Factory Methodパターン

基礎

Q1. ファクトリの責務とは何でしょうか?
A1. オブジェクトの生成及び管理

Q2. Factory Methodパターンを使用する本質的な理由とは何でしょうか
A2. クラスは実体化に関する決定をサブクラスの実装時まで保留するため。これを行う要因としては、責務をクライアントに持たせないようにするなどがある。

Q3. Factory Methodパターンは、主要なオブジェクト指向言語でも使用されています。Java, C# C++ではどのような形で使用されているでしょうか。
A3.
- Java:コレクションに対するiterator
- C# IEnumerableインタフェースでの、GetEnumerator
- C++ begin()、end()など

応用

Q1. このパターンが「factory Method」と呼ばれているのはなぜでしょうか
A1. 生成という責務の割当を支援するパターンであるため

Q2. Factory Methodパターンは、他のファクトリとどのように連携するのでしょうか?
A2. 抽象クラス内に定義した各メソッドを派生クラス内でオーバーライドする

Q3. GoFはFactory Methodの目的を「オブジェクト生成用のインタフェースを定義するものの、実体化するクラスの決定はサブクラスに任せる」と述べています。なぜこれが重要となるのでしょうか?
A3. ファクトリの利点(テスティングの効率改善、凝集度の向上、結合度の低下、カプセル化、関心事項の分離)を実現できるため。