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

以下の問題及び回答は[書籍](https://www.amazon.co.jp/dp/4621066048/)を参考に記載しています。また一部引用があります。

# 1章：オブジェクト指向パラダイム
## 基礎
Q1. 機能分解の基本的なアプローチを解説してください
A1. 問題を小さな機能にブレークダウンすることで、その問題を構成する機能要素の洗い出しを行う。

Q2. 要求の変更を引き起こす３つの理由とは何でしょうか
A2. 1. ユーザがソフトウェアの可能性に気づき 、変更をする
      2. 問題領域に対する理解が深まり、開発者の意見が変わる
      3. 開発環境自体が変化する

Q3. 機能に着目するよりも責任に着目する方が良いとされています。これはどう言った意味を持つのでしょうか？例をあげてみてください。
A3. 機能分解を用いた場合、機能を細かくモジュール化することになる。これは、機能の変更によって、他の部分に悪影響を及ぼすプログラムになる傾向がある。例えば、教師が学生に次のセミナーの場所を伝えると言う場面を考える。機能的アプローチの場合は、聴講している学生の一覧を取得し、各学生が次のセミナーを受講するかを調べ、そのセミナーの教室とそこまでの行き方を調べ、聴講する学生に行き方を伝えると言う方法になる。しかし、実際には、教師はセミナーの教室とそこまでの行き方を調べ、ポスターとして教室に張りアナウンスをする。よって、前者は全てのことに責任を持っているが、後者は学生の振る舞いまでは責任を持っていない。この様にすると責任を移行することができる。これによって、要求変更に対して頑強になる。（以下、後者を責任アプローチと呼ぶ）この例で考えた場合、大学院生の学生にアンケート回収をやってもらうとすると、機能アプローチの場合は、教師が全生徒に対して大学院生かそうで無いかを判断して、教師側に処理プログラムを書くことになるが、責任アプローチの場合は、ポスターに大学院生は手伝うと伝える。そして、生徒側に処理プログラムを書くことになる。

Q4. 結合度と凝集どの定義を答えてください。結合度が高いというのは、どういうことでしょうか？
A4.
結合度：２つのルーチン間の関連の強さを表す尺度であり、凝集度を保管するもの。
    凝集度：ルーチン内の演算がどれだけ密接に関係しているのかを表す尺度
凝集度はルーチン内の中身がどれだけ強く関連しあっているかを示すもの。結合度はあるルーチンが他のルーチンとどれだけ強く関連し合っているかを表すもの。結合度が高い場合、他のルーチンとの関連が強くなり、関係が硬直的になる。

Q5. オブジェクトにとってのインターフェースの目的は何でしょうか？
A5. 共通する規定クラスを持たないクラス群に、特定の抽象的な性質を実装できる。

Q6. クラスのインスタンスの定義を答えてください。
A6. あるクラスに属する具体的なオブジェクトを指す。クラスのインスタンスを生成することを実体化という

Q7. クラスとは、オブジェクトの完全な振る舞いを定義したものです。オブジェクトが定義する３つの観点とは何でしょうか？
A7. 
該当オブジェクトが保持するデータの項目についての情報
該当オブジェクトが実行できるメソッド
これらのデータ項目やメソッドにアクセスするための方法

Q8. 抽象クラスとは何を行うものでしょうか？
A8. 概念的に類似しているクラス群において、共通しているメソッドと属性を定義したもの。それが表現している概念を具体化したクラスの実装を格納するための場所を提供する。関連あるクラス群に名前を割り当てる方法が与えられ、関連のあるクラス群を１つの概念として扱えるようになる。

Q9. オブジェクトが保持できるアクセス可能性にはどのようなものがあるでしょうか？
A9. 
public-何からでもアクセスできる。
protedted-このクラスの派生クラスのオブジェクトからのみアクセスできる
private-このクラスのオブジェクト内からのみアクセスできる

Q10. カプセル化の定義を答えてください。また、振る舞いをカプセル化する例を挙げてください。
A10. 
定義：隠蔽すること。あらゆる種類の隠蔽を指す。オブジェクトはそのデータをカプセル化する。抽象クラスはそこから派生された具象クラスをカプセル化する。
例：学生の型（大学生か大学院生か）を講師が考慮する必要がなかったので、隠蔽されていた。オブジェクト指向では、studentという抽象クラスによって、そのクラスから派生したクラスの型情報が隠蔽される。

Q11. ポリモーフィズムの定義を答えてください。また、ポリモーフィずむの例をあげてください。
A11. 
定義：関連するオブジェクト群に対して、そのオブジェクトの型毎に特化したメソッドを実装する能力のこと
例：学生がその種類によって行動形態を変えること

Q12. オブジェクトを考える際の３つの観点とは何でしょうか？
A12. 概念、仕様、実装。
概念：オブジェクトは責任の集合
仕様：オブジェクトはその他のオブジェクトや自ら起動することができるメソッドの集合
実装：オブジェクトはコードとデータそして、それら相互の演算処理

抽象クラスによって、もの度後を概念的に決定する方法を定義。
そこから派生したものを用いることで、通信を行うための仕様を定義
その定義を用いることで、必要となる実装を導き出す。

## 応用
Q1. プログラマはソースコードを分割する際に「モジュール」というものを使うことがあります。これは要求の変更に取り組む効果的な方法でしょうか？答えとその理由を述べてください。
A1. モジュールにおける責任が明確であれば。有効と考えます。モジュールにできるということは、凝集度が高く結合度が低いというが言えます。この点では一般的に有効です。しかし、機能的観点から設計されている可能性があり、隠蔽化については、問題があると思われます。そのため、責任が明確であれば、モジュールも要求変更に対して効果的であると考えられます。(なお、責任の設計は結局オブジェクト指向に寄ります。)

Q2. 抽象クラスは実体化されないクラスであるというのは、あまりにも限定された定義です。この定義が限定されている理由は何でしょうか？抽象クラスに対するより優れた（または少なくとも代替となる）考え方はどのようなものでしょうか？
A2. 実体化されないクラスという定義は、実装面から見た定義であるため限定されたいます。概念レベルから見た場合は、概念が表現するものを具体化したクラスの実装を格納するための場所となります。これによって、関連のあるクラス群に愛永を割り当てる方法が与えられ、関連のあるクラス群を一つの概念として扱えるようになります。

Q3. 振る舞いをカプセル化することによって、要求の変更から引き起こされる影響をどのように制限できるのでしょうか？どのようにすれば、好ましくない副作用からプログラマを守ることができるのでしょうか？
A3. カプセル化によって、当該のオブジェクトの内部は他のオブジェクトから未知になるため、他のオブジェクトによって引き起こされる変更から保護される。


Q4. オブジェクトを他のオブジェクトの変更から保護するために、インターフェースをどのように役立てることができるでしょうか？
A4. より抽象的なレベルでカプセル化を行うことで、そのレイヤーで保護することができる。

Q5. セミナー会場となる教室の例を使って、システムにおけるオブジェクトを開設しました。概念の観点からこの教室を解説してください。
A5. 教室は、自らの位置を知っているオブジェクトです。そのため、指定された場合、位置を返すことで、学生に目的地を教えることができる。


# 第2章：UML-統一モデリング言語
## 基礎
Q1. is-a関係とhas-a関係の違いは何でしょうか？has-a関係を細分化するとどうなるのでしょうか？
A1. 
- is-a関係：あるクラスが他のクラスの１種である
- has-a関係：あるクラスが他のクラスを保持している。
- has-aの細分化
    - 保持されているのもが保持しレイルものの一部（自動車とそれを構成するエンジン等）
    - 独立して存在できる何かのコレクションがある場合(空港とそこに駐機されている飛行機等）

Q2. クラス図におけるクラスの表現は３つの部分に分かれています。これら３つの内容を説明してください。
A2. クラスの名称、クラスのデータメンバ、クラスのメソッド（機能）である。
クラスの名称は名称を記載する部分であり、最上部に記載される
クラスのデータメンバは、２段目に記載され、データの型(int, double, etc)と公開範囲(public=+, protected=#, private=-)が記載される。順番は、「(公開範囲) (データ名):(データ型)」であり、例えば「- length: double」となる。
データのメソッドは、最下段に記載され、メソッド名と公開範囲が記載される。順番は、「(公開範囲) (メソッド名)()」であり、例えば「+ display()」となる。


Q3. カーディナリティを定義してください
A3. 集約関係またはコンポジション関係にあるオブジェクト間でのオブジェクト数の制約のこと。保持する側も保持される側も制約がある。


Q4. シーケンス図の目的とは何でしょうか？
A4. オブジェクト間のやり取りを表現すること。

## 応用
Q1. is-a関係およびhas-a関係における２つの関係の例をあげてください。次に、その例を用いて以下の設問に答えてください。
1. クラス図を作成してください。
2. そのクラス図にカーディナリティを記入してください。
A1. 
is-aの例：形を描画するためのクラスにpoint, line, squareとこれらをまとめる抽象クラスShape
has-aの例：空港とそこに駐機する飛行機
クラス図＋カーディナリティ
is-a

has-a

Q2. 図2.8のシーケンス図には、いくつの手順が記述されているでしょうか？オブジェクトの数はいくつあるか、そしてそれらは何でしょうか？
A2. 
手順数：１３
オブジェクト数：６つ
main
ShapeDB:インターフェース
Collection: 抽象クラス
Square: 具象クラス
Circle: 具象クラス
Display: インターフェース


Q3. オブジェクトが互いに通信する際、「処理を起動する」と表現するよりも「メッセージを送信する」と表現した方が適切であるのは何故でしょうか？
A3. 「メッセージを送信」と捉えることで、返り値をそのまま次の処理として使用する（中身に依存しない）という意識が明確化されるため。
参考：http://brbranch.jp/blog/201511/%E9%9B%91%E8%A8%98/oop/