[読書メモ]オブジェクト思考のこころ

[オブジェクト思考のこころ](http://www.amazon.co.jp/gp/product/4621066048/ref=s9_wish_gw_d99_g14_i4?ie=UTF8&colid=1FDM2BQ7T9GGP&coliid=I4F1AAYW36Q1A&pf_rd_m=AN1VRQENFRJN5&pf_rd_s=desktop-1&pf_rd_r=1FFYBDF9MKDXEYT9QHBX&pf_rd_t=36701&pf_rd_p=207655209&pf_rd_i=desktop)

# 1部 オブジェクト指向ソフトウェア開発入門
## 1章 オブジェクト指向パラダイム
### 1.10 練習問題
#### 1. 機能分解の基本的なアプローチを説明してください。
A. 問題を小さな機能にブレークダウンすることで、その問題を構成する構成要素の洗い出しを行う
#### 2. 要求の変更を引き起こす3つの理由とは何でしょうか？
A. ユーザがソフトウェアの新たな可能性に気づく
   問題領域に対する理解が深まるに連れて、考え方が変わる
   ソフトウェア開発を取り巻く環境が変わる
#### 3. 機能に着目するよりも責任に着目する方が良いとされています。これはどういった意味を持つのでしょうか？例を挙げてみてください。
A. 
#### 4. 結合度と凝集度の定義を答えてください。結合度が高いとはどういうことでしょうか？
A. 結合度:2つのルーチン感の関連の強さ。
   凝集度:ルーチン内の演算がどれだけ密接に関係しているのか
   結合度が高い:クラスの変更が他のクラスに影響する。発見しにくいバグを埋め込みやすくなる
#### 5. オブジェクトにとってのインターフェースの目的は何でしょうか？
A. オブジェクトがどのような振る舞いを持っているかを伝える
#### 6. クラスのインスタンスの定義を答えてください。
A. クラスから生成された具体的な実体のこと
#### 7. クラスとは、オブジェクトの完全な振る舞いを定義したものです。オブジェクトが定義する3つの観点とは何でしょうか？
A. 保持するデータの情報、実行できるメソッド、データやメソッドにアクセスする方法（インターフェース）
#### 8. 抽象クラスとは何を行うものでしょうか？
A. 概念レベルで見た場合、それが表現している概念を具体化したものを表現したクラスであり、その実装を定義する場所
#### 9. オブジェクトが保持できるアクセスの可能性にはどのようなものがあるでしょうか？
A. public,protected,private
#### 10. カプセル化の定義を答えてください。また、振る舞いをカプセル化する例を挙げてください。
A. あらゆる種類の情報を隠蔽すること。データだけでなく、例えば型情報など。例として、先生が学生に対して次の授業の教室に向かうよう指示する際に、生徒が次に具体的にどの教室に向かえばいいかは教授が知らなくてもよい。
#### 11. ポリモーフィズムの定義を答えてください。また、ポリモーフィズムの例を挙げてください。
A. 同じインターフェースで複数の振る舞いをすること。例として、上司が複数の部下に仕事をするように指示するだけで、部下は各々の仕事をする。
#### 12. オブジェクトを考える際の3つの観点とは何でしょうか？
A. 概念:責任の集合。システムにおける高レベルの概念。
   仕様:メソッドの集合。ソフトウェアにおけるインターフェース。
   実装:コードとデータ、それらの演算処理。どのようにして自身の責任を全うするのか。
   
# デザインパターン
## 5章 デザインパターンの紹介
### 5.7 練習問題
#### 1. デザインパターンというアイディアを考えだした人はだれでしょうか？
A. エリック・ガンマ(Junitを作った人)
   リチャード・ヘルム
   ラルフ・ジョンソン
   ジョン・ブリシディース
#### 2. Alexanderは同様の問題を解決する構造を見ることで、何を見つけ出したのでしょうか？
A. 優れた設計には類似点があること
#### 3. パターンを定義してください。
A. 特定のコンテキストで発生する問題の解決策
#### 4. デザインパターンの解説で鍵となる要素は何でしょうか？
A. 名前:固有名
   目的:使用する目的
   問題:解決しようとしている問題
   解決策:コンテキスト内における解決方法
   構成要素と協調要素:このパターンに関係する実体
   因果関係:パターンを使用することによる因果関係(パターンを使用することで発生する影響、また問題が持つ制約によってパターンに与える影響)
   実装:実装方法
   一般的構造:クラス図
#### 5. デザインパターンを学習する3つの理由とは何でしょうか？
A. 解決策の再利用:既存の問題の解決策を再利用することができる。
   共通言語の確立:コミュニケーションを円滑化する用語を確立できるようになる
   個人のスキルの向上とチームの開発効率の向上

## 6章 Facadeパターン
### 6.7 練習問題
#### 1. Facadeを定義してください。
A. サブシステム内に存在している複数のインターフェースに対する、統一したインターフェースを提供するもの。
#### 2. Facadeパターンの目的は何でしょうか？
A. 既存のシステムの使用方法を簡素化するため。また、クライアントがやり取りする必要のあるオブジェクトの数を削減するため。
#### 3. Facadeパターンの因果関係とは何でしょうか？例を挙げてください。
A. Faadeは要求されたサブシステムの使用方法を簡略化して提供する。しかし、Facadeは全ての機能を提供するものではないため、ある種の機能はクライアントから利用できない可能	性がある。
#### 4. Facadeパターンにおいて、クライアントはどのようにサブシステムと協調するのでしょうか？
A. 簡潔なインターフェースを提供する。サブシステムと直接の依存関係はない。
#### 5. Facadeパターンを使った場合、通常はクライアントシステム全体にアクセスできるようになるのでしょうか？
A. クライアントの全ての機能を提供することを保証するものではない。必要なものだけ提供する。

## 7章 Adapterパターン
### 7.7 練習問題
#### 1. Adapterを定義してください
A. 別のものの要件に適合させるもの
#### 2. Adapterパターンの目的は何でしょうか？
A. 修正することのできない既存オブジェクトを、特定のインターフェースに適合させる
#### 3. Adapterパターンの因果関係とは何でしょうか？例を挙げてください。
A. Adapterパターンにより、既存オブジェクトをそのインターフェースに制限されることなく、新たなクラス構造に取り込むことが可能になる。
#### 4. ShapeオブジェクトとPoint、Line、Squareの間の関係を定義するために使用されているオブジェクト指向の概念とは何でしょうか？
A. 継承、ポリモーフィズム
#### 5. Adapterパターンの最も一般的な使用方法とは何でしょうか？
A. ポリモーフィズムの継続的な使用を可能にする。他のデザインパターンと組み合わせて使用される
#### 6. Adapterパターンを採用することによって、どういったことを意識しなくてもよいようになるのでしょうか？
A. 既存のオブジェクトに使用したい機能があるがインターフェースが適合しない場合、インターフェースの違いを意識する必要がなくなる
#### 7. Adapterパターンは2種類に分類できます。それらを答えてください。
A. Object Adapterパターン:別のオブジェクトに既存のオブジェクトを保持させる
   Class Adapterパターン:多重継承（既存クラスと抽象クラス）を使用して既存のオブジェクトの機能を隠蔽する

## 8章 視野を広げる
### 8.8 練習問題
#### 1. カプセル化についての正しい認識とはどういったものでしょうか？
A. あらゆるもの(データ、実装、派生クラス、設計の詳細、実体化の規則)を隠蔽すること。
#### 2. 問題領域を見る際の3つの観点とは何でしょうか？
A. 概念上の観点、仕様上の観点、実装上の観点

## 9章 Strategyパターン
### 9.8 練習問題
#### 1. 新たな要求を取り扱う方法として、どのような方法があるでしょうか？
A. コピペ、switchやifを用いて個別に対応、関数ポインタや委譲を使用、継承を使用、機能全体を新規オブジェクトに委譲する
#### 2. GoFが提案した、変更に取り組む際の基本原則を３つ挙げてください。
A. 実装を用いてプログラミングをするのではなく、インターフェースを用いてプログラミングする
   クラスの継承よりもオブジェクトの集約を多用する
   流動的要素をカプセル化する
#### 3. Strategyパターンの目的とは何でしょうか？
A. 様々な業務上の規則(ビジネスルール)やアルゴリズムを、それが発生するコンテキストに応じて切り替えられるようにする
#### 4. Strategyパターンの因果関係とは何でしょうか？
A. Strategyパターンは、アルゴリズムのファミリを定義するものである
   switchや条件分岐を無くすことができる
   全てのアルゴリズムは、同じ方法で起動しなければならない。

## 10章 Brigdeパターン
### 10.9 練習問題
#### 1. 切り出すという言葉と抽象的側面という言葉を定義してください。
A. 切り出す：物事が互いに独立して振る舞えるようにする、または少なくとも、それらの関係を明確に述べることを意味している。
   抽象的側面：様々な物事における概念的な特徴を指す。
#### 2. Brigdeパターンのコンテキストにおける実装という言葉を定義してください。
A. 抽象クラスとその派生物が自らを実装するために必要とするもの
#### 3. シーケンス図の基本要素は何でしょうか？
A. 箱：オブジェクトを表す。:で句切られた左側は変数名、右側はクラス名
   縦軸：時間軸
   矢印：オブジェクト間の相互作用。
   ノート：メモ。
#### 4. パターンの使用方法に関するAlexanderの観点とは何でしょうか？彼は、まず最初に解決策から考察することを提唱しているのでしょうか？それとも解決すべき問題から考察することを提唱するのでしょうか？
A. 各パターンとは、よく発生する問題を描写し、問題を解決する上での確信を描写すること。パターンを理解するには、まず解決すべき問題から考察すべきである。問題そのものを理解せずに、問題領域からパターンが適用できそうな部分を探しだそうとすると、何をするかは検討がつくが、いつ、なぜそれを使うのかがわからないままになってしまう。
#### 5. 共通性分析では何を洗い出そうとするのでしょうか？可変性分析では何を洗い出そうとしているのでしょうか？
A. 共通性分析ではどこが流動的要素になるのかを識別し、可変性分析ではそれらがどのように変化するのかを識別する
#### 6. Brigdeパターンが解決する問題とは、基本的にどういったものでしょうか？
A. クラス数の爆発を招くことなく、抽象クラスの派生物から複数の実装を使用する必要がある。
#### 7. 「１つの場所には１つの規則」という戦略を定義してください。
A. 何かを行うための規則がある場合、それを一度だけ実装するように心がける
#### 8. Bridgeパターンの因果関係とは何でしょうか？
オブジェクトが使用している実装を、そのオブジェクトから切り離すことによって、拡張性を高める。クライアントオブジェクトは、実装に関するあれこれを気にする必要がなくなる。

## 11章 Abstract Factoryパターン
### 11.8 練習問題
#### 1. switchは、処理の選択を行う際に使用できる機能ですが、この章で考察したデバイスドライバの例では問題が引き起こされます。どういった問題が引き起こされるのでしょうか？switchによってどういったニーズが示されているのでしょうか？
A. 本来関係の無い処理が２つの作業を行うことによる結合度の高さと、ルールに追加があった場合に複数の箇所を修正しなければならないことによる凝集度の低さが問題になる。また、抽象化の必要があることを示す。
#### 2. このパターンはどうして「Abstract Factory」と呼ばれているのでしょうか？
A. Abstract Factoriyが構築しようとしているもの自体が、抽象化によって定義されているため
#### 3. Abstract Factoryにおける３つの概念的手順とは何でしょうか？
A. 流動的要素を見つけ出し、それをカプセル化する
クラス継承よりもオブジェクトの集約を多用する
実装を用いて設計するのではなく、インターフェースを用いて設計を行う
#### 4. このパターンでは、2種類のファクトリが存在しています。Abstract Factoryとは何をするものなのでしょうか？ConcreateFactoryNとは何をするものなのでしょうか？
A. Abstract Factoryはオブジェクトの種類ごとにメソッドを定義することによって、インスタンス化できるオブジェクトを指定する・
ConcreateFactoryNはインスタンス化されるべきオブジェクトの生成を行う。
#### 5. Abstract Factory パターンの因果関係とは何でしょうか？
このパターンにより、どのオブジェクトを使用するのかという規則と、それらのオブジェクトの使用方法に関するロジックを分離できる。

# 全てをまとめる：パターンを使って考える
## 12章 エキスパートはどのように設計するのか？
### 12.4 練習問題
#### 1. Alexanderは、優れた設計を特徴づけるため、「活き活きとした」という言葉を使用しています。ソフトウェアの場合、どういった用語を使用するのがよいでしょうか？
A. 堅牢で柔軟なシステム
#### 2. 優れた設計を行うには、何を念頭においておく必要があるでしょうか？
A. 心に全体像を描いておく必要がある
#### 3. Alexanderは、設計を行うための最善のアプローチには「複雑化」があると示唆しています。これはどういった意味でしょうか？
A. まず最も簡潔な用語（概念レベル）によって問題を捉え、その後、追加機能を付加（区別）し、情報の追加によって設計をより複雑化していくという考え方。
#### 4. Alexanderにとって、パターンは何の関係を定義するものなのでしょうか？ A. 問題領域における実態間の関連を定義するもの。
#### 5. Alexanderの設計手順を述べてください。
A. パターンを洗い出す。
次に、他のパターンのためのコンテキストを作るパターンの洗い出しを行う。
次に、それ以外のパターンと、発見していない他のパターンが無いか確認する。
次に、設計を洗練させる。
最後に、実装してパターンによって決定づけられる詳細を組み込む。
## 13章 CAD/CAMの問題をパターンによって解決する
### 13.4 練習問題
#### 1. この章で解説したパターンを用いたソフトウェア設計の３つの手順を答えてください。
A. パターンの洗い出し：問題領域に存在するパターンを見つけ出す
   パターンの分析、適用：パターンの並び替え、パターンの選択と設計の拡張、追加のパターンの洗い出し、以上の繰り返し
   詳細の追加：必要に応じて設計に詳細を追加する。メソッドやクラスの定義の拡張も行う。	
#### 2. コンテキストを定義してください。
A. 何らかのものをその中に存在させる、または発生させる、互いに関連しあう条件のこと。すなわち環境や設定のこと
#### 3. 最年長のパターンを定義してください。
A. システム内に存在し、他のパターンのためのコンテキストを構築する、１つまたは２つのパターンのこと。
#### 4. ２つのパターンのうち、どちらが年長であるかを調べるための２つの規則を教えて下さい。
A. あるパターンが他のパターンの振る舞い方を定義しているか？
   ２つのパターンが互いに影響を与え合っているか？
#### 5. パターンの一般的構造を定義してください。それはいつ使用するのでしょうか？
A. パターンの一般的構造は、標準化、単純化である。これはGof本や、デザインパターンの説明にそれぞれ記載されているものが一般的である。パターンは、問題領域について考える際のスタート地点で使用すべきであり、そうすることによって問題を大枠から見ることができるようになる。

# 新たな設計パラダイムに向けて
## 第14章 デザインパターンの還俗と戦略
### 14.2 開放／閉鎖原則
#### 開放／閉鎖原則
* モジュール・メソッド、クラスは拡張性という観点から見た場合、見通しの利くよう（開放的）になっており、変更という観点から見た場合、閉鎖的になっているべきである。

新たな機能を個別に、すばわちモジュール化された形で追加していけるようにすることで、結合コストを最小化したソフトウェア設計にするということ。

### 14.3 コンテキストからの設計原則
#### 依存性の逆転原則
* 高次のモジュールは、低次のモジュールに依存してはならない。高次のモジュールと低次のモジュールは、いずれも抽象的側面に依存すべきである。
* 抽象的側面は詳細に依存してはならない。詳細が抽象的側面に依存すべきである。

インターフェースを用いて設計を行う
#### リスコフの置換原則
* 基底クラスから派生するクラスは、その基底クラスの振る舞いを全てサポートしなければならない。

#### 型のカプセル化
使用するオブジェクトから派生型の存在を隠す。つまり、基底クラス（インターフェース）への参照を用いることで、それを使っているオブジェクトから派生クラス（すなわち実装）の存在を隠す。これにより、派生クラスを交換することが可能になる。また、このことは、基底クラスが公開しているインターフェース以外のメソッドを、派生クラスに追加できないことをも意味している。

### 14.5 抽象クラス VS インターフェース
表層的な違い：共通する状態と振る舞いを保持できる
クライアントオブジェクトを中心に考えることで、使用される側のオブジェクトをより小さく、より凝集度の高い部品へとできる。
#### どちらが優れているというわけではない
* 実装時の冗長性を低下させるため、抽象クラスを定義することはある
* インターフェースの洗い出しを行ったあと、そのインターフェースを実装した抽象クラスを定義することも考えられる
(Ex:List,AbstractList等)
* 抽象クラスには、デフォルトの振る舞いを定義することができるため、クラスの実装を簡潔にし、保守を容易にすることができる。(Java8ではデフォルトメソッドがあるため、これはあまり当てはまらないかも)

### 14.6 健全な猜疑心
**パターンは問題領域の中にあるものであり、外部から当てはめるものではない**

### 14.8 練習問題
#### 1. 設計の実装方法を選択する場合、どういったことを考えるべきでしょうか？
A. 実装ごとに、この実装がどういった状況において他の実装より優れているのかを考え、その後、自分自身の抱えている問題領域に近いのかを考える
#### 2. デザインパターンには５つの落とし穴があります。それらを挙げてください。
A. 
#### 表層的理解
詳細レベルの状況に関する表面的な理解に基づき、慌ててパターンを選択してしまう
#### 思い込み
パターンを信頼しすぎてしまい、パターンを使うことで全てを解釈しようとする。
#### 選択ミス
パターンが適切となるコンテキストや条件を理解していないため、誤ったパターンを選択してしまう
#### 誤審
パターンの全体的知見に不慣れであるため、無知から来る誤審が発生してしまう
#### 当てはめ
パターンの理論に適合しない部分を無視してしまい、本来あるべき姿よりも硬直化した形でモデル化してしまう

## 15章 共通性／可変性分析
### 15.2 共通性／可変性分析とアプリケーションの設計
#### 共通性
問題領域内に存在している概念
#### 可変性
具体的な実装
### 15.3 共通性／可変性分析を用いてCAD/CAMの問題を解決する
#### 手順
1. 最初に共通性を洗い出す
2. 共通性から抽象的側面を見つける
3. 共通性における流動的要素を用いて派生物を洗い出す
4. 共通性がどのように関連しているのかを見極める

### 15.5 練習問題
#### 1. 共通性と可変性を洗い出す、２つのアプローチを答えてください。
A. どのような概念があるか洗い出し、それらをできる限り凝集化した形で組織化する
   問題領域から２つの言葉を任意に選択し、「いずれかは、もう一方の流動的要素なのか？」、「これらはいずれも、何か他のものの流動的要素なのか？」の２つの質問をしてみる

## 16章 分析マトリクス
### 16.6 練習問題
#### 1. 分析マトリクスにおいて、左端の列は何を表しているのでしょうか？
A. 実装する必要がある機能が表現している概念
#### 2. 分析マトリクスにおいて、行は何を表しているのでしょうか？
A. 一般化された概念を実装する際における特定の方法
#### 3. 分析マトリクスにおいて、列は何を表しているのでしょうか？
A. その列が表現しているケースに対して使用することになる特定の実装
#### 4. 分析マトリクスには、本書で解説しているどのパターンが表現されることになるのでしょうか？
A. Strategy,Abstract Factory,Brigde,Composite,Chain of Responsibility,Command,Decorator,Iterator,Mediator,Observer,Proxy,Template Method,Visitor

# パターンの持つその他の価値
## 17章 Decoratorパターン
### 17.9 練習問題
#### 1. 各Decoratorオブジェクトは何を包み込むのでしょうか？
A. 後続のオブジェクト、つまり追加機能をラップする。
#### 2. デコレータの例を挙げてください。
A. ヘッダとフッタ、I/O関連のライブラリ

## 18章 Obserberパターン
### 18.8 練習問題
#### 1. GoFによる構造に関するパターンの責務とは何でしょうか？
A. 既存のオブジェクトをまとめる
#### 2. GoFが分類したパターンのカテゴリを答えてください。また、私が示唆している４つ目のカテゴリとは何でしょうか？
A. 生成：オブジェクトの生成や実体化
   構造：既存オブジェクトをまとめる
   振る舞い：柔軟な（変化する）振る舞いを実現する
   分割：オブジェクトの切り離し（振る舞いに関するパターンのサブカテゴリ）
#### 3. 要求の持つ絶対的な性質を答えてください。
A. 常に変化する
#### 4. Observerパターンの目的を答えてください。
A. オブジェクト間に1対多の依存関係を定義し、あるオブジェクトの状態が変化した際、それに依存する全てのオブジェクトに対して自動的に通知、更新が行われるようにする

## 19章 Temlate Methodパターン
### 19.8 練習問題
#### 1. Template Methodパターンによって、メソッド呼び出しが特殊な方法で行われるようになります。その方法を説明してください。
A. 一般的な手順によって呼び出されるが、個別に実装する必要がある処理については派生クラスのメソッドが呼び出される

#### 19.8.2.3 StrategyパターンとTemplate Methodパターンの違いを答えてください。
A. Strategyは委譲、Template Methodは継承をベースにしている。また、Strategyはアルゴリズム全体の交換、Template Methodはアルゴリズム内の一部を交換する。

# ファクトリ
## 20章 生成に関するパターンから得られる教訓
### 20.3 続・コンテキストを考慮する際の規則
#### 規則
生成方法を考える前に、システム中に保持する必要のあるものを考察すること。つまり、必要となるオブジェクトを決定した後に、ファクトリを定義することになるわけです。
### 20.10 練習問題
#### 1. 「ファクトリ」を定義してください。
A. 他のオブジェクトを実体化するために使用される、メソッド、オブジェクト、あるいはそれ以外のもの
#### 2. 以前の章で解説したファクトリパターンの名前を教えて下さい。この章で言及したファクトリパターンの名前を教えて下さい。
A. Abstract Factory, Singleton, Factory Method, Builder, Prototype
#### 3. オブジェクトの生成、管理が必要となった際に使用する一般規則を答えてください。
A. オブジェクトは、他のオブジェクトの生成及び/あるいは管理するか、他のオブジェクトを使用するかのどちらかのみを行い、双方を行ってはいけない

## 21章 SingletonパターンとDouble-checked Lockingパターン
### 21.8 練習問題
#### 1. Singletonパターンとは、どういったタイプのパターンなのでしょうか？パターンの分類では、どのカテゴリにぞくするのでしょうか？
A. ファクトリタイプのパターン。生成のパターンの一つ。
#### 2. Singletonパターンの目的を答えてください。
A. オブジェクトを1つだけほしいものの、そういったオブジェクトの実体化を制御するような大域的なオブジェクトが存在しない。また、このオブジェクトの同一インスタンスを、すべての実体間で参照を引き回すことなく使用させたい。
#### 3. Singletonパターンの責務は、いくつのオブジェクトを生成することなのでしょうか？
A. １つ
#### 4. Singletonは、オブジェクトを生成するための特殊なメソッドを使用します。このメソッドの特殊な点を解説してください。
A. このメソッドが呼び出された際、オブジェクトがすでに実体化されているかどうかをチェックします。実体化されている場合、このメソッドはそのまま該当オブジェクトの参照を返します。実体化されていない場合、このメソッドはそのオブジェクトの実体化を行い、そのインスタンスの参照を返します。
また、このメソッドを呼び出す以外の方法ではオブジェクトの実体化をできないようにするため、コンストラクタをprivateかprotectedで宣言する。
#### 5. SingletonパターンとDouble-checked Lockingパターンは、どのようにして使い分けるのでしょうか？
A. Singletonはシングルスレッドアプリの場合、Double-checked Lockingはマルチスレッドの場合。

## 22章 Object Poolパターン
### 22.6 練習問題
#### 1. 設計時に従うべき、一般的な３つの戦略とは何でしょうか？
A. コードに影響を及ぼさないようにする
   リスクの高い問題を早期に解決する
   自分の本能に注意を払う
#### 2. Object Poolパターンに組み込まれている2つのパターンとは何でしょうか？
A. Singleton, Factoryパターン
#### 3. Object Poolパターンの目的は何でしょうか？
A. オブジェクトの生成が高価なものであるか、生成可能なオブジェクト総数が制限されている際に、オブジェクトの再利用を管理する。

## 23章 Factory Methodパターン
### 23.7 練習問題
#### 1. ファクトリの責務とは何でしょうか？
A. オブジェクトを作成することと、作成したオブジェクトが使用可能であることを保証する
#### 2. Factory Methodパターンを使用する本質的な理由とは何でしょうか？
A. 実体化に関する決定を、サブクラスの実装時まで保留することができる
#### 3. Factory Methodパターンは、主要なオブジェクト指向言語でも使用されています。Java、C#、C++ではどのような形で使用されているのでしょうか？
A. Java:コレクションに対するiteratorメソッド

## 24章 ファクトリのサマリ
### 24.1 概要
#### オブジェクトを生成し、使用する上での必要な作業
1. 実現すべき責務に基づいてオブジェクトを洗い出します。共通性／可変性分析は極めて有効な手段になります。
2. オブジェクトの使用方法を決定します。ここでは、パターンの多くがそうであるように、主にオブジェクトの関連に着目します。
3. オブジェクトの管理方法を決定します。

### 24.2 ソフトウェア開発プロセスの手順
開放／閉鎖原則、依存性の逆転原則、リスコフの置換原則等に従うには、オブジェクトを使用する側のコードは、自らの使用しているオブジェクトが何であるかを感知してはいけない。
-> ファクトリが感知することになる 
### 24.4 システム規模にあったアプローチ
システム中にAとBという２つの実体がある場合、その関係はAがBを使用する、あるいは、AがBを生成／管理するのいずれかのみに留め、決して双方の関係を同時に成立させてはならない。

# まとめ、そして今後
## 25章 デザインパターンのおさらい：総括と今後
### 25.2 オブジェクト指向原則のサマリ
#### オブジェクトとは、適切な責務を伴うものである。
#### オブジェクトは、自らに対する責務を有している。
#### カプセル化とは、あらゆる種類の隠蔽を意味している。
* データの隠蔽
* 実装の隠蔽
* クラスの隠蔽（抽象クラスやインターフェースの背後への隠蔽）
* 設計の隠蔽
* 実体化の隠蔽

#### 振る舞いやデータに存在する流動的要素は、共通性／可変性分析によって抽象化する。
#### インターフェースを用いて設計する。
#### 継承は、既存オブジェクトを特殊化するためのものではなく、流動的要素を概念化するための手段として捉える。
#### クラス中に存在する流動的要素から、異質な流動的要素を切り出す。
#### 結合度を低くするよう務める。
#### 凝集度を高くするよう務める。
#### オブジェクトを使用するコードと、そのオブジェクトを生成するコードを分離する。
#### 「OAOO（一度だけ）」ルールを厳守する。
#### 「意図によるプログラミング」と意図を明確に表すネーミングルールを用いて、コードの可読性向上に努める。
#### コーディングを開始する前に、コードのテスト可能性を考慮する。

### 25.11 練習問題
#### 1. パターンには、実装を隠蔽するという性質を持ったものがあります。何から実装を隠蔽するのでしょうか？また、それは何と呼ばれるのでしょうか？例を挙げてください。
A. クライアントオブジェクトから実装の詳細を隠蔽する。これはカプセル化の一種である。
例えば、Strategyであれば、規則を使用するオブジェクトと規則自体に問題領域を分解できるようになる。
#### 2. パターンによって、責務の分解についての考察が深められる例を挙げてください。
A. Decoratorパターンでは、必要な責務と任意に発生する流動的な責務に問題領域を分解することが可能になる。
#### 3. パターンを学習する際に探すべき５つのフォースと概念を答えてください。
A.
* このパターンが隠蔽しているのはどのような実装か？
* このパターンにはどういった共通性が存在しているか？
* このパターンにおけるオブジェクトの責務は何か？
* これらのオブジェクト間にある関係は何か？
* パターン自体は、どのようにしてコンテキストに基づく設計を具体化しているか？