ソフトウエア設計に登場するパターンをまとめた「デザイン・パターン」について学びましょう。デザイン・パターンを使いこなせれば,複雑なプログラムを効率よく設計できます。今回は,既にあるものを使いまわすPrototype,抽象的にアルゴリズムを記述できるTemplate Method,強い依存性を断ち切るObserverの各パターンを紹介します。

 前回は「デザイン・パターンとは何か」を学びました。設計上繰り返し登場する形をデザイン・パターンと呼びます。ごく簡単な例としてはforループがあります。はっきりと分類されたものとしては書籍『オブジェクト指向における再利用のためのデザインパターン』(ソフトバンク パブリッシング)が参考になります。

前回に取り上げたSingleton,Proxy,Iteratorの各パターンに続いて,今回は別のデザイン・パターンを考えてみましょう。Prototype,Template Method,Observerの各パターンを順に取り上げます。

パターンと動的言語の関係

 前述の『デザインパターン』には23のデザイン・パターンが紹介されています。それらは大きく分けると「生成に関するパターン」(5個),「構造に関するパターン」(7個),「振る舞いに関するパターン」(11個)に分類できます。前回のパターンに当てはめると,Singletonパターンが生成に関するもの,Proxyパターンが構造に関するもの,Iteratorパターンが振る舞いに関するものです。

 デザイン・パターンは(オブジェクト指向)プログラミングにしばしば登場するプログラムの構造を抽象化したものですから,言語によらず適用可能です。『デザインパターン』の例題は主にC++で記述してありますが,Smalltalkを用いた例題もありますし,同じ原則はJavaにも適用可能です。もちろんRubyについても同じことです。

 しかし,RubyやSmalltalkのような動的言語とC++やJavaのような静的言語では,同じデザイン・パターンでも使われ方が少し違います。今回はその辺りに注目していくつかのデザイン・パターンを見てみましょう。

既にあるものを使いまわすPrototypeパターン

 『デザインパターン』の解説を引用すると,Prototypeパターンは「生成すべきオブジェクトの種類を原型となるインスタンスを使って明確にし,それをコピーすることで新たなオブジェクトを生成する」パターンです。

 書籍ではこのパターンの例題として,迷路を生成するMazeFactoryクラスを取り上げています。壁や部屋,ドアなど自らが生成するオブジェクトのプロトタイプを持つことにより,サブクラス化することなく,さまざまな迷路を生成できるという例です。しかし,正直なところあまりプロトタイプのありがたさを実感できるような例題ではありません。

 実はPrototypeパターンはもともとC++のような静的型言語にあまり向かないデザイン・パターンです。Prototypeパターンが真に力を発揮するのは動的言語においてなのです。

 通常のオブジェクト指向言語では,まずクラスというオブジェクトのひな型となる存在を用意し,そのクラスから実際のオブジェクトを作り出すのが「当り前」のやり方です。クラスはオブジェクト指向プログラミングにとって,極めて基本的な存在です。

 しかし,本当にクラスは必須なのでしょうか。Smalltalkの「亜種」であるSelfという言語を作り出した人々は,そうではないと考えました。Selfにはクラスは存在せず,基本となる操作はクラスからのオブジェクト生成ではなく,オブジェクトのコピーでした。

 基本的な考えはこうです。

 新たな種類のオブジェクトが必要になったときには,既存のオブジェクトをコピーして,そのコピーしたオブジェクトにメソッドやインスタンス変数などの機能を直接付け加えることで,最初の1個を作り上げます。そのオブジェクトが複数必要になれば,最初の1個をひな型にして必要なだけコピーします。最初の1個はひな型ではありますが,クラスという作り出されるオブジェクトとは異なった特別な存在ではなく,たまたまコピー元として使われているだけなのです。

 ひな型のことを英語でPrototypeと言います。そして,このようにクラスでなく,プロトタイプとコピーに基づいたプログラミングをプロトタイプ・ベース・プログラミングと呼びます。Prototypeパターンは実は単なるデザイン・パターンというよりも,1つのプログラミング・パラダイムと言った方がふさわしいものです。

 プロトタイプ・ベース・プログラミングは,対となるクラス・ベース・プログラミングよりも構成要素が少ないので,オブジェクト指向機能のデザインがシンプルに収まる傾向があります。そこで,最近では仕様が小さいプログラミング言語での採用が増えているようです。例えば,数多くのWebブラウザに組み込まれているJavaScriptのオブジェクト指向機能はプロトタイプ・ベースですし,最近,一部で注目を集めているIo言語*1もプロトタイプ・ベースです。