📗

オブジェクト指向のこころ 第7章の振り返り

2024/03/17に公開

はじめに

みなさんこんにちは、やすのりです。

『オブジェクト指向のこころ』の第7章を読み終わりましたので、
自身の理解度や考えをまとめるためにまとめ問題の回答を残しておこうと思います。
※『それは違うよ!』ということがあれば遠慮なくご指摘いただければ幸いです🙇

第7章 Adapterパターン

基礎問題

Q1. Adapterを定義してください

A:既存のオブジェクトをクライアント側が、他オブジェクトのインタフェースとして使用できるようにしたもの。

Q2. Adapterパターンの目的は何か?

A:修正できない既存オブジェクトを修正せずに特定インタフェースに適合させる。

Q3. Adapterパターンの因果関係とは?例を挙げてください。

A:既存オブジェクトを新規インタフェースとして再設計し、別のクラス構造に組み込めるようになる。
  • 『XXCircleオブジェクト』という希望とは別設計の既存オブジェクトがある場合に、
    そのオブジェクトを内包した希望設計のクラスを作成し、
    新規クラスのメソッド内部で既存オブジェクトのメソッドを呼び出す。

Q4. ShapeとPoint, Line, Squareの間の関係を定義するために使用されているオブジェクト指向の概念とは?

A:継承。

Q5. Adapterパターンの最も一般的な使用方法とは?

A:既存オブジェクトを別のインタフェースに変換する。

Q6. Adapterパターンを採用することによって、どういったことを意識しなくても良いようになるか?

A:クライアント(呼び出し)側は内部の実装がどうなっているのかを把握しておかなくてもよくなる。

Q7. Adapterパターンは2種類に分類できますが、それは何?

A:下記2種類
  • Object-Adapter:オブジェクトアダプター
    • 既存オブジェクトを適合させたいインタフェースに内包(保持)させる。
  • Class-Adapter:クラスアダプター
    • 適合させたいインタフェースに既存オブジェクトを多重継承させる。

応用問題

Q1. GoFはAdapterパターンの目的を『あるクラスのインタフェースを、クライアントが望むインタフェースに変換する』ものであると述べています。

  • この意味を説明してください。
  • 例を挙げてください。
A:
  • 意味:既存クラスのインタフェース構造がクライアントが使用したい設計と違っていても、
    クライアントが使用したい設計のインタフェースへ変換する。
  • 例:機能実現はできるが希望のインタフェースになっていない『XXCircleオブジェクト』を、『Circleオブジェクト』というインタフェースに再設計する。

Q2. 『CircleオブジェクトはXXCircleオブジェクトのラッパです』という表現は、どういう意味ですか?

A:『Circleオブジェクト』は『XXCiecleオブジェクト』を内包しており、『Circleオブジェクト』内で『XXCircleオブジェクト』のメソッドなどを使用できる。

Q3. FacadeパターンとAdapterパターンは、一見するとよく似ています。これら2つの本質的な違いは?

A:Facadeパターンは『簡潔(簡素)なインタフェースを提供する』のに対し、Adapterパターンは『既存のインタフェースを別のインタフェースへ変換する』という性質がある。

あなたの意見

Q1. AdapterパターンよりもFacadeパターンを使った方が適切となるのは、どういった場合ですか?また、FacadeパターンよりもAdapterパターンが適切となるのは、どういった場合ですか?

A:AdapterパターンよりもFacadeパターンが適切なのは『多態性が不要で簡潔なインタフェースが必要』な場合である。

そのため希望機能を実現するために複雑な単一クラスや複数のクラスを組み合わせ、1つの簡潔なインタフェースを提供する。

逆にFacadeパターンよりもAdapterパターンが適切なのは『希望機能を実現するために既存オブジェクトを使用したいが、既存オブジェクトの修正が必要』な場合である。
これはFacadeパターンとは違い、多態性を持ったクラス群を作成することもあるし、適合できていればインタフェース自体を簡素化する必要もない。


Q2. GoFがこのパターンをAdapterと読んだのは何故だと思いますか?

A:このパターンは既存オブジェクトを別のインタフェースに『適合させるもの』だから。
  • 『適合させる』というのは英語で『Adapt』となり、『適合させるもの(パターン)』という意味で『Adapter』と呼んでいるのだと思われる。
GitHubで編集を提案

Discussion