オブジェクト指向のこころ 第8章の練習問題の解答をまとめてみる。
基礎
カプセル化についての正しい認識とはどういったものでしょうか?
カプセル化とはすべてを隠蔽すること. データ,振る舞い,実装,派生クラス,その他すべてを隠すことを意味している.
問題領域を見る際の3つの観点とは何でしょうか?
- 概念
- 仕様
- 実装
応用
オブジェクトの理解として「メソッドを伴ったデータ」と「責務を伴ったものごと」という2つの考え方があります.
- 2つ目の考え方が1つ目のものよりも優れているのは,どういった点においてでしょうか?
- これによって,どういった見解が追加されるのでしょうか?
オブジェクトがどう実装されるかではなく,オブジェクトがどう実行されるか・オブジェクトの本質的概念とは何かに着目する点で優れている. このアプローチはプログラマが早期にコーディングに走りがちな傾向を防ぐことができる.
どう実装するかではなく何をするかに焦点を当てることで,設計がより柔軟にできる. 必要とされる公開インターフェースについてのみに着目すべき対象を絞ることができるのだ.
オブジェクトは他のオブジェクトを保持することができるのでしょうか?これはオブジェクトがデータメンバを保持することと違っているのでしょうか?
オブジェクト指向システムでは,すべてがオブジェクトである. オブジェクトは他のオブジェクト,データ,その他すべてを保持できる. 実際,データはオブジェクトであるので,本質的な違いはない.
「流動的要素を見つけ出し,それをカプセル化する」という言葉には,どういった意味があるのでしょうか?例を挙げて説明してください.
可変的な流動性要素は,理解を難しくさせる特定のケースとなるので, 概念レベルでは,共通性によってそれらをまとめる概念を定義することで,隠蔽する. 可変性はデータや振る舞いに現れる.
共通性/可変性分析と問題領域を見る際の3つの観点の関係を説明してください.
オブジェクトが何をすべきか(概念上の観点)を見ることで,どのように呼び出すべきか(仕様上の観点)を決められる. 共通性/可変性分析は,ある概念に存在するのすべてのケースを取り扱うためのインターフェースを洗い出す.
仕様は,実装レベルにおいて抽象クラスとなる. そして,ある仕様が与えられたとき,その特定ケース(可変性)における実装方法を決定することができる.
抽象クラスは「中央集権の概念」と対応付けられます.これはどういった意味を持っているでしょうか?
核となる概念は,流動的要素に共通するものを定義する.
抽象クラスは核となる概念そのものである.
核となる概念に与えた名前は抽象クラスと同じとなる.
(p.115)
「可変性分析によって,ファミリ構成員がどのように違っているのかが明らかになります.可変性は特定の共通性においてのみ意味を持ちます」
- これはどういった意味を持っているのでしょうか?
- 共通概念を表現するためには,どういった種類のオブジェクトが使用されるでしょうか?
- 流動的要素を表現するためには,どういった種類のオブジェクトが使用されるでしょうか?
可変性分析は,概念上の可変物すべて(抽象クラスの具象インスタンス)すべてに対応する. 共通性は流動的要素を結びつける本質的な概念である. 目的は,流動的要素をまとめる名前をつけること. そうすれば,流動的要素をまとめて定義でき扱えることになる
抽象クラスが共通性を表現するのに使われる. 具象クラスは流動的要素を表現するのに使われる. 木々に対してではなく,森に対して処理を行うことができる.