『オブジェクト指向のこころ』演習問題 第1章

章の概要

  機能分解的なアプローチでは、一部分に責任が集中しすぎて変更に弱い設計になってしまう。OOPを考える上で、概念レベル・仕様レベル・実装レベルの3つの抽象度があり、各オブジェクトの持つ責任を明らかにするとうまく設計できる。OOP3原則と言われる継承・ポリモーフィズムカプセル化はこの責任を明示する設計の過程で自然に欲しくなる。実装レベルの概念(クラスとかpublic継承とかメソッドのオーバーライドとか)によりこれらが実現される。

 

演習問題

基礎

[1] 機能分解の基本的なアプローチを解説せよ。

 所望の機能を実現するための流れを細かい機能に分割し、それらを全て制御するメインプログラムに責任を投げる。

[2] 要求の変更を引き起こす主な理由3つとは。

・ユーザーのドメイン知識が増えてニーズが変わる

・開発者のドメイン知識が増えて考え方が変わる

・ソフトウェア開発を取り巻く環境が変化する

[3] 機能に着目するより責任に着目するほうが良い。例えば?

 分解して得られた機能の全てを考えようとすると辛い。各オブジェクトが何を実現すれば良いのかを概念レベルで考えるようにすれば、自然とまとまりができる。これにより高い凝集度と低い結合性が実現できる。よって、保守性・可読性・効率が良くなる。

[4] 結合度・凝集度とは

 結合度:2つのルーチン間の関連の強さ。低いほうが良い。

 凝集度:各ルーチン内の演算の関連性の強さ。高いほうが良い。

[5] オブジェクトにとってのインタフェースの目的とは

 オブジェクトのユーザに対し、必要以上の情報にアクセスしなくて済むように制限すること。外部から見てオブジェクト内部の具体的な動きが見えないように抽象化すること。

[6] クラスのインスタンスの定義は?

 あるクラスを型としてみたときに、その型をもつ実体化されたオブジェクトのこと。

[7] オブジェクトが定義する3つの観点とは?

・オブジェクトが保持するデータ項目の情報

・オブジェクトが実行できるメソッドの情報

・これらへのアクセス方法

[8] 抽象クラスとは

 いくつかの具体的なクラスの共通部分をくくりだし、継承の元にする。抽象度・

再利用性が上がる。具象クラスをカプセル化できる。

[9] オブジェクトが保持できるアクセス可能性の種類

・public (外部からアクセス可能)

・protected (一段階継承した先まで外部からアクセス可能)

・private (外部からアクセス不可能)

[10] カプセル化とは?

 様々な隠蔽のこと。オブジェクトがデータへのアクセス可能性を定めることでメンバを隠蔽したり、抽象クラスが具象クラスを隠蔽し、細かな具体的な派生を気にしなくてよくなったり。

例) public メンバー

例) Student (抽象クラス) -> 学部生・大学院生・ポスドク、などの具象クラス

 一律にstudentとして扱える。

[11] ポリモーフィズムとは?

 関連するオブジェクトたちに対して、そのオブジェクトの型毎に特化したメソッドを実装できる能力のこと。同名のメソッド、アクセスのための記述が同じ文法、というようにすれば、ユーザーはある一つのアクセス方法をしつつも、各オブジェクトはそれぞれに特化した処理が可能になる。

[12] OOPを考える3つの観点

・概念レベル

・仕様レベル

・実装レベル

 

応用

[1] ソースコードを分割するための「モジュール」の有効性

 変更に取り組む際に対応する部分だけを変更すればよい。

[3] カプセル化の利点

・ユーザーは見れる機能が限られることで考えるのが楽になる

・開発者側は呼び出し側のことを気にせずに変更できる。

・他のオブジェクトから内部処理を隠すことで抽象化する。

・オブジェクトにデータと責任を込めて実装することで、外部が変更されたときにそのオブジェクトには何ら影響が無いため、バグを減らせる。