「Design Patterns: Elements of Reusable Object-Oriented Software」の私的レビュー

今更ながら、有名な「Design Patterns: Elements of Reusable Object-Oriented Software」をひと通り読んだのでレビューを書いてみます。

いいところ

デザインパターンの位置づけについて記述されている

第一章では、そもそもデザインパターンとはどういう世界観の中で、どういった位置づけで使われるものなのかを解説しており、ここが後半のデザインパターンと同じくらい重要で非常にためになった。また、自分が今まで頭の中に思い描いていた世界観とは違う使い方が主に想定されているようで、カルチャーショックを受けた(うわ、そうだったのかよ、的な)自分のOOPに対する理解が根本的に足りないことを実感・・・。

簡潔で読みやすい

非常に簡潔で、さらさら読める。特に後半のカタログは、全てのパターンで同じフォーマットで、簡単な概要が説明してから詳細に入っていくという書き方なので読みやすく、頭に入りやすい。

各パターンの解説が非常に実用的

各パターンの解説が、ソースコードベースで具体的に説明されており、実用性が高く、すぐに使える。

パターン間の関連の解説がとてもわかりやすく実用的

Creational, Structural, Behavioralの各パターンカテゴリの最後に書いてある、パターンの総まとめ的な解説がとてもわかりやすく、実用的で大変ためになった。個人的には、「オブジェクトの設計」や「レイヤ化」といったところにダイレクトに関わってくるStructural Patternの中の人達の総まとめは読み応えがあってよかった。

パターンのボキャブラリーが豊富かつ、汎用的

パターンのボキャブラリーが豊富かつ、非常に汎用的なので、知っていて損をするパターンは無いと言い切れるレベル。もちろん、使用頻度に違いはあるが、この本に登場するパターンはあらゆるところで頻繁に目にすると思われる。また、パターンの粒度もそこまで細かすぎず、アーキテクチャパターンまでスコープが広く無いが、小技で終わらない、そこそこ粒度が大きいパターンもある。(Bridge, Facade, Flyweightなど)

わるいところ

一章の説明があまりにも簡潔すぎ

一章のデザインパターンを適用する領域についての話は、とても重要なのに、さらさら書き過ぎていて相当読み込まないと何を言いたいのか、どういった世界観なのかわからない。読者がOOPのコンセプトやオブジェクト抽出のポイント、OOADなどをある程度知っていることを
前提に書いてるとしか思えません。

そのため、「デザインパターンとは、オブジェクト指向分析設計だけでは抽出できない、プログラムを機能させるための抽象的なオブジェクトの抽出の指針となり、かつ、オブジェクト指向プログラミングという、手続き型とはパラダイムが異なるプログラミングモデルで最も難しい、オブジェクトの粒度や関連などを決めて抽出するという作業の指針になるパターンカタログである」点の重要度がぼけている気がします。

この「パラダイムが異なる」という点がわかりづらいためか、この本を元にしているらしい、他の本では色々前提知識がなくても理解しやすい「特定の問題を解決する」というところにばかり焦点が当てられていて、まるで手続き型プログラムの山のごく一部をデザインパターンで置き換えるために使う的な風に思われている気がします。

デザインパターンの例が適切でない気がする

OOPでオブジェクトを抽出する上で、よくあるパターンのカタログ集」のはずなのに、何故かデザインパターンの例があまりにも具体的かつ、GUIプログラミングに寄っていて、抽象的で再利用可能なデザインパターンの例に見えない。Flyweightとか、Bridgeとか、非常に良くある設計パターンのはずのに、例のせいでむしろわかりづらくなっている気がする。どうせ書くなら、同じパターンを領域の異なるプログラミングに適用できることを例で示すべきだった。

POSAのデザインパターンと比べた場合、汎用的なところに寄り過ぎ

汎用的でどこでも使えそうなパターン達が紹介されている一方で、POSAにあるような特定の領域での問題を解決するパターンはほぼない(Interpreterだけ浮いてる気がする)

まとめ

この本からいきなり入っても理解するのが難しいので、事前にOOPオブジェクト指向設計についてある程度知識をつけた上で読むことが前提ではあるものの、記述が簡潔でわかりやすく、マストバイな本です。特にJavaや.NETなどのライブラリではこの本に書かれたパターンがありとあらゆるところで頻出するし、本格的なプログラムを作るときには、この本のパターンたちが(意識せずとも、似たようなことを考えるはずなので)大活躍すると思われます。

個人的には、この本を読む前に「The Art and Science of Smalltalk」を一読して、オブジェクト指向プログラミングのなんたるかをしっかり頭に入れて、「Head First Object-Oriented Analysis and Design」などのオブジェクト指向分析設計をかる〜く扱った本で、オブジェクト指向プログラミングがどれだけ難しいのかを「体感」してからこの本に進むべきかなと思います。(「Head First Object-Oriented Analysis and Design」の後半の練習問題とか、デザインパターンのような体系だった考え方が身についてないとまともに解けないのでは・・・)