「具体例で説明するデザインパターン」は、よく使われている JavaScript のデザインパターンについて分りやすく説明しています。
そもそも、僕がこのブログを始めた理由は、JavaScript のデザインパターンを議論したいからでした。(今では、全然違う内容になっていますが。^^;) そして、その議論を止めたのは、動的型付言語では、デザインパターンはそんなに重要でないと気付いたからです。
きっかけは、「ハッカーと画家」です。この本の 201ページには、以下のような脚注があります。
ピーター・ノーヴィッグは『デザインパターン』に挙げられた23のパターンのうち16はLispでは「全く見えないか、あるいはより簡潔である」ことを見出した。
これは、「Design Patterns in Dynamic Programming」というスライドのことです。
Java でデザインパターンがもてはやされるのは、静的型付言語だからだと思います。2つのクラスがやりとりする場合、拡張性を考えて、それぞれに上位の型を定義します。たとえば、三角形や四角形を汎化するために、図形という抽象クラスを定義する訳です。
こうなると、登場するクラスは 4 つになって複雑になるため、デザインパターンというカタログが必要になるのでしょう。
Douglas Crockford 先生は、「JavaScriptにおける古典的継承」で、Java のような複雑さは、JavaScript には無縁だと雄弁に語っています。
そもそも、私たちはなぜ継承を気にするのでしょうか?それには主に2つの理由があります。一つ目の理由は、型に関する利便性のためです。私達は言語システムに対して、類似するクラスの参照へ自動的にキャストしてもらうことを望みます。オブジェクト参照のキャストに、定型的で明示的な記述が必要な型システムからは型の安全性をほとんど得ることができないためです。これは強い型付け言語ではとても重要なのですが、JavaScriptのような弱い型付け言語ではオブジェクト参照はキャストの必要がないため大した意味を持ちません。
結局、「デザインパターン」に書いてあるように、言語によって何をデザインパターンだと思うかは違う訳です。
プログラミング言語の選択は重要である。なぜなら、どの言語を使うかによってどのような観点でデザインパターンをまとめるかが違ってくるからである。
もちろん共通理解として、23 個のデザインパターンを覚えておくのはよいことだと思います。