自転車に乗る主夫エンジニアの日記

ソフトウェアエンジニア(Web)の日記です。

読書録: デザインパターン(GoF)

GoFデザインパターンを読んだので、振り返りがてら紹介する。

オブジェクト指向における再利用のためのデザインパターン

オブジェクト指向における再利用のためのデザインパターン

目次

総評

本書は設計力を身につけるために必要な知識を身につけるためのものである。手っ取り早く手元のコードを綺麗にするために何某かのデザインパターンを採用したいというのであれば、身近にいる熟練したエンジニアにレビューをもらうのが格段に早い。もちろん、すぐに実践で活かせるパターンも紹介されているが、ある程度知識が備わっていなければそれを選び出すことはできない。本書ではデザインパターン生成構造振る舞い、大きく3つに分類して紹介している。この枠組は、自身が問題に直面したとき、それを分析する手掛かりとなる。翻って、オブジェクト指向パラダイムに沿ってアプリケーションを構築するための足がかりとなるだろう。

評価

読みやすさ

  • 私は読み進めるのに苦労した。読み始めるにあたって私は手元にあるサーバーサイドプログラムでどのようにデザインパターンを活かそうかという視点が強く、著者の例示をうまく飲み込めなかったためだ。GUIアプリケーション(テキストエディタなど)を例にデザインパターンを説明することが多いとわかっていればもう少し読みやすかったのではないか。
  • また、例示されるアプリケーションが古くてイメージが湧きづらいので、例を読めば理解できると高をくくって読み進めると苦労するだろう。本書の大まかな構成は良いが、文章構成(文章の論理構造)が簡潔でなく、サラッと読み進めると理解できていなかったりする。

効能

  • オブジェクト指向言語に対する理解を深める助けになる。(この本が相応しいかはともかく)
  • 型に従ったプログラミングを意識するようになる。
  • 設計力の基礎を身につけることができる。

紹介されているデザインパターン

振る舞いに関するパターンのInterpreterパターンやIteratorパターンは読み飛ばして良いだろう。Interpreterパターンは用途が非常に限定的であるし、Iteratorパターンは今日のプログラミング言語が標準的に備えている機能で賄えるためである。それ以外はどれも一読の価値があるだろう。(日常的に使わないパターンもあるかもしれないが)

【生成】

  • Abstract Factory
  • Builder
  • Factory Method
  • Prototype
  • Singleton

【構造】

  • Adapter
  • Bridge
  • Composite
  • Decorator
  • Facade
  • Flyweight
  • Proxy

【振る舞い】

  • Chain of Responsibility
  • Command
  • Interpreter
  • Iterator
  • Mediator
  • Memento
  • Observer
  • State
  • Strategy
  • Template Method
  • Visitor

読み方

まずはパターンをすべて覚えることよりも、大きく3つの観点でパターンが別れていることにどのような意味があるのかを理解することが重要だろう。ただし、それを理解するには各パターンの概要をある程度押さえておく必要はあるだろう。

  • プログラミング初学者にはパターンを学ぶことを後回しにして、1章をじっくり読むか、他の本を読んでオブジェクト指向について理解を深めることをオススメする。
  • 駆け出しのエンジニア(Railsなどのフレームワークを使って開発ができるようになったレベル)には1、3〜6章を順に読むことをオススメする。

3〜5章では、それぞれ生成、構造、振る舞いに関する種々のパターンを以下の構成で紹介している。私は「実装」と「サンプルコード」の節は読み飛ばした。パターンの特徴(目的と長所、短所)を捉えることを目的としていたためである。1パターンあたり30分程度かかった。1ヶ月程度で一通り読み終わるはずだ。

  • 目的
  • 別名
  • 動機
  • 適用可能性
  • 構造
  • 構成要素
  • 協調関係
  • 結果
  • 実装
  • サンプルコード
  • 使用例
  • 関連するパターン

所感

  • 生成に関するパターンは、オブジェクトの生成をカプセル化することがテーマである。ゆえに、プロジェクトが型に従って開発が進むことを助ける働きがあるように思う。( new Hoge() のように特定のクラスをインスタンス化することを避ける)
  • 構造に関するパターンは、クラスをどのように協調させるかがテーマである。ゆえに、クラスの巨大化を防いだり、クラスの無駄な増殖を防いだり、クラスが歪な形に成長するのを防ぐのに使えるパターンが多かったように思う。
  • 振る舞いに関するパターンは、ロジックをカプセル化することがテーマである。ゆえに、実践ですぐに活かせそうなパターンが多かったように思う。