normcore.dev

GoFデザインパターンの再編成

GoF 本が出てきてから 15 年が経った。現代のプログラミングに置いてこれらのデザインパターンの位置づけがどのように変わったのか。

fukabori.fm の 49 話 で話されていたことをメモしました
Design Patterns 15 Years Later: An Interview with Erich Gamma, Richard Helm, and Ralph Johnson

カテゴリの再編

GoF のデザインパターンでのカテゴリ分け

大きく分けて、Creation(生成)と Structural(構造)と Behavioral(振る舞い)の3つ

(Wikipedia から)

  • Creation(生成)
    • Abstract factory: 関連する一連のインスタンスを状況に応じて、適切に生成する方法を提供する。
    • Builder: 複合化されたインスタンスの生成過程を隠蔽する。
    • Factory method: 実際に生成されるインスタンスに依存しない、インスタンスの生成方法を提供する。
    • Prototype: 同様のインスタンスを生成するために、原型のインスタンスを複製する。
    • Singleton: あるクラスについて、インスタンスが単一であることを保証する。
  • Structural(構造)
    • Adapter: 元々関連性のない 2 つのクラスを接続するクラスを作る。
    • Bridge: クラスなどの実装と、呼出し側の間の橋渡しをするクラスを用意し、実装を隠蔽する。
    • Composite: 再帰的な構造を表現する。
    • Decorator: あるインスタンスに対し、動的に付加機能を追加する。Filter とも呼ばれる。
    • Facade: 複数のサブシステムの窓口となる共通のインタフェースを提供する。
    • Flyweight: 多数のインスタンスを共有し、インスタンスの構築のための負荷を減らす。
    • Proxy: 共通のインタフェースを持つインスタンスを内包し、利用者からのアクセスを代理する。Wrapper とも呼ばれる。
  • Behavioral(振る舞い)
    • Chain of responsibility: イベントの送受信を行う複数のオブジェクトを鎖状につなぎ、それらの間をイベントが渡されてゆくようにする。
    • Command: 複数の異なる操作について、それぞれに対応するオブジェクトを用意し、オブジェクトを切り替えることで、操作の切替えを実現する。
    • Interpreter: 構文解析のために、文法規則を反映するクラス構造を作る。
    • Iterator: 複数の要素を内包するオブジェクトのすべての要素に対して、順番にアクセスする方法を提供する。反復子。
    • Mediator: オブジェクト間の相互作用を仲介するオブジェクトを定義し、オブジェクト間の結合度を低くする。
    • Memento: データ構造に対する一連の操作のそれぞれを記録しておき、以前の状態の復帰または操作の再現が行えるようにする。
    • Observer: インスタンスの変化を他のインスタンスから監視できるようにする。Listener とも呼ばれる。
    • State: オブジェクトの状態を変化させることで、処理内容を変えられるようにする。
    • Strategy: データ構造に対して適用する一連のアルゴリズムをカプセル化し、アルゴリズムの切替えを容易にする。
    • Template method: あるアルゴリズムの途中経過で必要な処理を抽象メソッドに委ね、その実装を変えることで処理が変えられるようにする。
    • Visitor: データ構造を保持するクラスと、それに対して処理を行うクラスを分離する。

再編してみると

再編成すると Core と Creation と Peripheral と Other に分けるみたい。

  • Core(コア): オブジェクト指向プログラミングをしていくうえだと日々よく出てくる。これだけでも覚えておくとリファクタリングが捗る。
    • Composite
    • Strategy
    • State
    • Command
    • Iterator
    • Proxy
    • Template Method
    • Facade
  • Creation(生成)
    • Factory
    • Prototype
    • Builder
    • Dependency Injection
  • Peripheral(プリフェラル(周辺のとか末梢のとか))
    • Abstract Factory
    • Visitor
    • Decorator
    • Mediator
    • Type Object
    • Null Object
    • Extension Object
  • Other(その他)
    • Flyweight
    • Interpreter

追加されたパターン(4)

  • Null Object: 無いものをあるものと同じようにある使う。null の時の振る舞いも定義する。オブジェクト参照が存在しないとエラーが実行時に起こる可能性があるけど、null の代わりに何もしない NullObject を使えば null によるエラーが起きる可能性を無くすパターン。Composite に似てる。null かそうじゃないかをポリモーフィックに解決するパターン。null-safe とは別と考えたほうが良い
  • Type Object
  • Dependency Injection
  • Extension Object: プラガブルな拡張のために使われるパターン (ex: Eclipse のなかで使われているような)

削除されたパターン(6)

  • Singleton
  • Adapter
  • Bridge
  • Chain of responsibility
  • Memento
  • Observer

学びのルート

デザインパターンを正面から学ぶより、リファクタリングからオブジェクト指向プログラミングとしてのデザインパターンに近づくほうがおすすめらしい。
デザインパターンの位置づけを変えたのがリファクタリングとテスト。それらを両輪にして良い設計をつなぐのが TDD なのでセットでマスターするとよりよいプログラミングができるようになる。

  • リファクタリング 既存のコードを安全に改善する(第 2 版)
  • テスト駆動開発