読者です 読者をやめる 読者になる 読者になる

orangain flavor

じっくりコトコト煮込んだみかん2。知らないことを知りたい。

Rubyによるデザインパターンを読んだ

恥ずかしながら10年以上プログラミングをやっていて、今までちゃんとデザインパターンを勉強したことがありませんでした。

それぞれのパターンはなんとなく知っているけど、ちゃんと理解できてはいないという状態でした。

デザインパターンを勉強しようとしたことは何度かありました。しかしJavaC++で解説した書籍・Webサイトでは、いちいち本質的ではない基底クラスやインターフェイスを作っているように見えて、理解が進みませんでした。

そこで読んだのが「Rubyによるデザインパターン」です。

Rubyによるデザインパターン

Rubyによるデザインパターン

この本の良いところ

この本が良いと思ったのは以下の点です。

  1. Rubyの動的な性質を活かしている
  2. パターンが厳選されており、説明の順序もわかりやすい
  3. 解決したい問題とそれを解決するコードがある

1. Rubyの動的な性質を活かしている

本書では、Rubyの動的な性質を活かすことで、無駄な基底クラスやインターフェイスなしにパターンを実現しています。

最初は Java に近いクラス設計をした上で、Rubyのパワーでリファクタリングしていき、簡潔なコードでデザインパターンを表現していきます。

ちなみに第2章にRuby自体の解説もあるので、Rubyに詳しくない人でも読めると思います。

2. パターンが厳選されており、説明の順序もわかりやすい

本書では、GoFの23パターンのうちの14パターン+Rubyオリジナルの3パターンを解説しています。

一度に多くのパターンを学んでも理解が追いつかなくなるので、よく使うものに絞られていて良かったです。

説明する順番も、パターン同士の結びつきが考慮されており、理解しやすいです。最初に Template Method というわかりやすいものを取り上げ、次に継承ではなく委譲で実現するために Strategy を使うといった具合です。

ABC順にAbstract Factoryから解説されると辛いです。

3. 解決したい問題とそれを解決するコードがある

それぞれのパターンについてまず問題があり、それを解決するよう設計を改善していくという流れで説明されているのでわかりやすいです。

なぜ他のやり方ではダメで、そのやり方を選んだのかがわかるので、理解が深まります。

Webサイトによっては、UMLやコードがほとんどで、背景が簡単にしか書かれていないことがありますが、そういうサイトは一度ちゃんと理解した人が見返すためのものなんだと気づきました。

さらに知るために

本書で、解説しているのはGoFの23パターンのうちの14パターン+Rubyオリジナルの3パターン(DSLメタプログラミング、Convention over Configuration)です。

GoFのパターンのうち、解説されていないのは以下の9パターンです。

  • Prototype
  • Bridge
  • Facade
  • Flyweight
  • Chain of Responsibility
  • Mediator
  • Memento
  • State
  • Visitor

これらを含めて、今後改めてGoF本を読んで勉強したいと思います。

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

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

まとめ

パターンによって、あるあるだなーとか、こんなやり方があるんだとか、感想はいろいろでした。ただ、全体を通して名前がついていることの重要性、そして「パターン」という言葉の意味を理解できました。

名前をつけて他人と共有できる「パターン」は、デザインパターンだけではないので今後も勉強していきたいと思います。

ここまで書いておいて非常にアレですが、本書は現時点で入手が困難です。実は、何年も前に良さげだなーと思って買った後、そのまま積んであったのです。 

新品の紙の本は売ってないし、電子書籍にもなっていないのが残念です。良書なので、ぜひ電子書籍で発売してほしいです。

ちなみに原著は電子書籍でも販売されていますが、読んだことないのでなんとも言えません。Amazon.co.jpのレビューには平易で読みやすいと書かれていますが、Amazon.comにはKindle版のフォーマットが非常に読みにくいというレビューもあります。

Design Patterns in Ruby (Addison-Wesley Professional Ruby Series)

Design Patterns in Ruby (Addison-Wesley Professional Ruby Series)