デザインパターンは、設計ノウハウに名前をつけて、再利用できるようにカタログ化したものです。ここでは、「パターンを身につけるメリット」や「身につけ方」について考えてみます。
身につけるメリット
次のようなメリットがあると言われてます。
- ソフトウェア開発で頻繁に出くわす課題に対して、パターンを持って解決することで生産性を高められる
- 設計方法に名前をつけることで、開発者同士の共有ボキャブラリとなり、設計意図を即座に理解できる
デザインパターンを身につけることで、
「技術の移り変わりに依存しない」
「言語に依存しない」
エンジニアとしての基盤スキルを高めることができるかと思います。
参考書
Design Patterns: Elements of Reusable Object-Oriented Software
デザインパターンはいくつかあるのですが、GoFデザインパターンが最も有名ではないでしょうか。1994年、GoFと呼ばれる4人の共著者が、下記書籍で23個のデザインパターンを取り上げました。
翻訳もされてますね。ただし、名著ではあるが「もっとわかりやすい情報がある」「翻訳が良くない」などのレビューがあがっています。私自身、読んだことはないです。
Head Firstデザインパターン
個人的には、「Head Firstデザインパターン」という書籍を読み、理解が深まりました。いろいろなアプローチでデザインパターンについて解説されており、読者に理解させようという気持ちがこもった良本です。
Head Firstデザインパターンで学ぶ
利用頻度の高いパターンを身につける
「Head Firstデザインパターン」では、23個あるGoFパターンを以下のように取り扱い、解説してます。
- 頻繁に利用されるパターンは章立てして解説
- その他のパターンは付録として解説
1994年に考えられたパターンとだけあって、現代では特に使う機会やメリットのないパターンも多いようです。なので、「頻繁に利用されるパターンだけ理解しとく」でも良いかなと思ってます。
パターンのカテゴリ化
また、パターンは以下のようにカテゴリ化されて紹介されることがあります。
「Head Firstデザインパターン」でもパターンのカテゴリ化について紹介してます。(p.520)
目的でカテゴリ化
目的 | 概要 |
---|---|
作成パターン | クライアントが直接インスタンスを作成せずに、インスタンス作成を依頼するパターン。 直接作成せず依頼することにより、インスタンスを品質制御できる。 |
構造パターン | プログラムの構造に関するパターン |
振舞いパターン | オブジェクトの振舞いに関するパターン |
パターンで利用している関係でカテゴリ化
関係 | 概要 |
---|---|
クラスパターン 「is-a」(~である) |
継承を利用したパターン。 静的に関係が決まる。 |
オブジェクトパターン 「has-a」(〜を持つ) |
適切なオブジェクトを持たせる。 コンポジション(composition:構成)を利用したパターン。 動的に関係を決定できる。 |
パターン一覧
上記踏まえて、パターン一覧を整理します。
Head First以外の参考情報として、wikiとDesignPatternsPHPへのリンクも貼っておきます。
パターン | 利用している関係 | Head Firstでの取り扱い | link |
---|---|---|---|
Factory Method | クラス | 4章 | Wiki DesignPatternsPHP |
Abstract Factory | 4章 | Wiki DesignPatternsPHP | |
Singleton | 5章 | Wiki DesignPatternsPHP | |
Builder | 付録(p.546) | Wiki DesignPatternsPHP | |
Prototype | 付録(p.558) | Wiki DesignPatternsPHP |
パターン | 利用している関係 | Head Firstでの取り扱い | link |
---|---|---|---|
Decorator | オブジェクト | 3章 | Wiki DesignPatternsPHP |
Adapter | クラス | 7章 | Wiki DesignPatternsPHP |
Facade | オブジェクト | 7章 | Wiki DesignPatternsPHP |
Composite | オブジェクト | 9章 | Wiki DesignPatternsPHP |
Proxy | オブジェクト | 付録(p.542) | Wiki DesignPatternsPHP |
Bridge | オブジェクト | 付録(p.544) | Wiki DesignPatternsPHP |
Flyweight | 付録(p.550) | Wiki DesignPatternsPHP |
パターン | 利用している関係 | Head Firstでの取り扱い | link |
---|---|---|---|
Strategy | オブジェクト | 1章 | Wiki DesignPatternsPHP |
Observer | オブジェクト | 2章 | Wiki DesignPatternsPHP |
Command | オブジェクト | 6章 | Wiki DesignPatternsPHP |
Template Method | クラス | 8章 | Wiki DesignPatternsPHP |
Iterator | オブジェクト | 9章 | Wiki DesignPatternsPHP |
State | 10章 | Wiki DesignPatternsPHP | |
Chain of Responsibility | オブジェクト | 付録(p.548) | Wiki DesignPatternsPHP |
Interpreter | クラス | 付録(p.552) | Wiki |
Mediator | オブジェクト | 付録(p.554) | Wiki DesignPatternsPHP |
Memento | オブジェクト | 付録(p.556) | Wiki DesignPatternsPHP |
Visitor | オブジェクト | 付録(p.560) | Wiki DesignPatternsPHP |
UMLの見方
「Head Firstデザインパターン」では、擬似UMLを利用してます。has-aの関係だけ、OMG(Object Management Group)のUMLと表記が異なるので注意します。
has-a
Head FirstのUML表記 | 一般的なUML表記 |
---|---|
集約 コンポジション (部分だけで存在できない。強い集約。) |
is-a (extends)
implements
参考)
- https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%B9%E5%9B%B3
- http://www.itsenka.com/contents/development/uml/class.html
原則を重視
「Head Firstデザイン」では、パターンの利点について述べながらも、パターンは道具でしかないことについて述べている点も良かったです。パターンを追加することで、逆にシステムが複雑になったりすることもあるので、設計原則からはじめることを推奨しています。
本書を読むことで以下のような設計原則についても理解を深められます。
- 変化する部分を特定しカプセル化して、不変な部分と分離する。
- 継承よりコンポジションを好む。
- クラスは、変更される理由を1つだけ持つべきである。