かまずにまるのみ。

文鳥とかビールとか

デザインパターン - Strategy

オブジェクト指向のこころ」読書記録。
GoFデザインパターンにある Strategy パターンについて。

Strategy?

Strategy(すとらてじ)を辞書で調べると以下のように書かれている。

strategy
1. 【不可算名詞】 戦略
2. 【不可算名詞】 [具体的には 【可算名詞】] (目的達成のための)計略,策略; 計画,方策,方法,手順

http://ejje.weblio.jp/content/strategy

 

ざっくり

Strategy パターンは状況に応じて使用するアルゴリズムを切り替える
選択されるアルゴリズムは同じインタフェースで異なる実装を持つ。

f:id:tdakak:20130629152904p:plain:w350


イメージ

どの方法を選択するのか

たとえば子どもにお買い物を頼むとする。

f:id:tdakak:20130629152933p:plain:w250

お買い物を頼める子どもは複数いる。
子どもたちはみんな「お買い物行ってきて」と頼んでメモを渡せば、ちゃんと指定した品物を買ってくることができる。
ただお店までどう行くかは子どもによって違うらしく、ある子はお店まで徒歩で、ある子はお店まで自転車に乗って行く。

f:id:tdakak:20130629152941p:plain:w300

親としてはどの子に頼んでも同じ結果を得られる。
どの子に頼むかは、状況に応じて決定すればよい。

f:id:tdakak:20130606152955p:plain:w300

アルゴリズムのファミリ

これらを Strategy パターンに置き換えると、子どもたちは共通の概念を持つクラス群(ファミリ)と定義できる。親は子どもを集約している。


まとめ

  • Strategy パターンはアルゴリズムのファミリを定義する
    • これらのアルゴリズムは概念的にすべて同じことを行う
      • インタフェースは同じ
      • 実装は異なる
  • Strategy パターンのメリット
    • 依存関係逆転の原則(DIP)に準拠する
    • 繰り返し現れる switch や if などの条件分岐をなくす
    • ユニットテストを作成しやすくなる
  • Strategy パターンのデメリット
    • 多少複雑になりがち(その分コストも増える)

f:id:tdakak:20130629214115p:plain:w300


デザインパターン - Adapter

オブジェクト指向のこころ」読書記録。
GoFデザインパターンにある Adapter パターンについて。

Adapter?

adapt を辞書で調べると以下のように書かれている。

adapt
1. a 〈言行・風習などを〉〔…に〕(修正改変して)適合させる
 b [adapt oneself で] 〔新しい環境などに〕順応する,慣れる
2. a 〈建物・機械などを〉〔用途に合わせて〕改造する
 b 〈小説・劇を〉〔…向きに〕改作する,脚色する

http://ejje.weblio.jp/content/adapt

 

ざっくり

Adapter(あだぷた)パターンは適合させるパターン。
既存クラスに別のインタフェースを持たせることで、特定のインタフェースに適合させる。ラッパ的な何か。

f:id:tdakak:20130625123013p:plain:w350


イメージ

ポリモーフィズム

オブジェクト指向パラダイムにおけるキーワードのひとつにポリモーフィズム(polymorphism)がある。
日本語に訳すと「多くの形態」「多態」「多様性」。
同じ参照方法で、さまざまなクラスに定義されているそれぞれの振る舞いを引き出すこと。

ポリモーフィズムを利用した設計

特定のインタフェースを持つ抽象クラスから派生した、いくつかの具象クラスがあるとする。派生先ではクラスごとに振る舞いを実装している。
このような設計により、クライアントはどのオブジェクトに対しても同じ方法で参照することができる。
クライアント側で意識しなければならないことが減るっていいですね。

f:id:tdakak:20130625132914p:plain:w400

異なるインタフェースを持つクラス

たとえばここで上記のクラス群に、インタフェースの異なる既存クラスを追加する必要が出てきた場合どうしたらよいか。
既存クラスはすでにどこかで使われているためインタフェース変更はできない。

このとき、以下のようなラッパクラスを作成することで問題を回避できる。
かもしれない。

  • クラス群と同じ抽象クラスを継承
  • 既存クラスを保持する(あるいは既存クラスに委譲する)

f:id:tdakak:20130625151105p:plain:w400

拡張性を保つ

アジャイルソフトウェア開発の奥義」には Adapter パターンを用いることにより、以下の原則が満たされると書かれている。

 

まとめ

  • 既存クラスを特定のインタフェースに適合させるのが Adapter パターン
  • Adapter パターンを用いることにより、Adaptee(既存クラス)を修正することなく、別のインタフェースに適合させることができる
  • Adapter クラスは必要なインタフェースを保持したラッパ
  • Adapter クラスによりクライアントは、 Adaptee を Adapter クラスの派生元と同じように使用することができる(ポリモーフィズム