デザインパターンを学習しよう【0. デザインパターンの基本】


株式会社オズビジョンのユッコ (@terra_yucco) です。
このところ 1 日 1 記事を書いてみて思ったのですが、そんなに書けることがないし、結構大したことのない内容も多い。実務は知っていることの切り貼りでなんとでもなってしまっている感がありますが、もう少し基礎を固める必要を感じました。

前職が C 言語で、現職もなんとなくの PHPer なので、正直オブジェクト指向というものに自信がありません。そのためこの機会にオブジェクト指向を学びなおすとともに、デザインパターンをもう一度きちんと学びなおしてみようと思いました。

教材

他にも良書、良教材はあるでしょうが、以下のサイトをまずは使っていきます。

選んだ理由は以下の通り。

  • 23 あるデザインパターン全てが掲載されている
  • Java で書かれているので、PHP に置き換える段階でさらに理解が深まりそう

0. デザインパターンの基本

自分の学習メモとして、上記ページの要約を書いていきます。

0.1 はじめに

オブジェクト指向とは「事象とは、様々なオブジェクトの相互作用である」ととらえること。
実体を伴わない定義はクラス、実体を伴う状態になったものがオブジェクト。
例えば以下のような場合には、対応するクラスからそれぞれ記載のオブジェクトが生成されており、それらが相互作用することで事象が発生していることになる。

  • クラス「人」、オブジェクト「あなたの友達の太郎君」
  • クラス「自動販売機」、オブジェクト「3丁目の公園の自動販売機」

あなたの友達の太郎君が、3丁目の公園の自動販売機でジュースを買う

オブジェクト指向に基づいたプログラミングは、再利用しやすい形の設計を最初に十分に検討し実現することができれば、「生産性 (再利用性)」「信頼性」の向上という恩恵をもたらすことができる

0.2 デザインパターンとは

「デザインパターン」という言葉がしばしば指すのは「オブジェクト指向における再利用のためのデザインパターン」という本に記載されているもののこと。(通称 GoF 本)
「よく出会う問題とそれに対処する良い設計」を 23 パターン定義。

0.3 デザインパターンのメリット

  1. 先人の知恵が凝縮されたパターン (前述の 23 パターン) のため、その知恵を利用した「再利用性の高い柔軟な設計」ができるようになる
  2. デザインパターンを知っている技術者同士の意思疎通が簡単になる (パターンを知っていれば、詳細を説明しなくてもどのパターンで実装するかだけを共有すればよい)

デザインパターンを学べばその内容がそのまま日々の業務で使える、というわけではない。考え方を学ぶことで日々の業務が改善され、より再利用性の高い設計が行えるようになるというもの。

0.4 設計への利用について

推奨:実際に設計に行き詰まったとき「良いアイディアを与えてくれそうなもの」を探すためにカタログ (23 種の一覧表) を見ること
ただし「無理にパターンに当て嵌める」のはアンチパターン。
23 パターンしかないものがそのまま使えることはそうそうない。前述の通り、考え方を学び、設計のエッセンスを自分の設計に取り入れていくことが大事。

デザインパターンを思い出すべきシーン:

クラスの抽出

現実世界に存在するものをクラス化するのは難しくないが、概念をクラスに抽出するのは難しい。デザインパターンの中には「戦略」や「状態」を抽出するものがある。このようなパターンを知っておくと、概念の抽出をうまく行えるようになる。

  • Strategy パターン: 「戦略」
  • State パターン: 「状態」

実装とインタフェースの切り分け

変数の宣言時に具象クラスを使っていると、柔軟性が少し低下する。インターフェースや抽象クラスを使うことの素晴らしさが、デザインパターンの学びによって実感できるはず。

再利用性を高める

オブジェクト指向における再利用性とは大きく以下の 2 つ。

  • 継承
    • 親クラスの内容を子クラスに引き継ぐこと
  • オブジェクトコンポジション
    • 別のオブジェクトが持つ機能を組み合わせて利用すること

GoF のデザインパターンでは、オブジェクトコンポジション推奨。(必要な機能がオブジェクトの組み合わせで満たせるのが理想のため)
※デザインパターンでよく出てくる「委譲」も、オブジェクトコンポジションの一種

変更に強くする

あらかじめ起こりうる追加や変更を想定することで、仕様追加・仕様変更に柔軟に対応できる設計を実現する。そのための方法がデザインパターンには含まれている。

Conclusion

デザインパターンの基本の部分をまずは見ていきました。この時点ではまだ具体的なパターンに踏み込んでいないので腹落ちしていない部分も多々あります。

Next Action

まずは順番に 1. Iteratorパターン から見ていこうと思います。