今回はソフトウエア設計に登場するパターンをまとめたものである「デザイン・パターン」について学びましょう。ソフトウエア設計において適切なデザイン・パターンをカタログから選び出すことで,複雑なプログラムでも効率良く設計できるようになります。

 デザイン・パターンは設計上繰り返し登場するパターンを指すプログラミング用語です。元々は建築においてさまざまな建築物や街のデザインに共通して用いられる意匠や構成の組み合わせを意味するために使われていました。建築界においても,比較的近年になって使われ始めた言葉です。デザイン・パターンという考え方はChristopher Alexander氏が著書『The Timeless Way of Building』(Oxford University Press,1979)の中で初めて紹介したのだそうです。

 通常,建築物は一つひとつ設計が異なり,また用途や建築条件などの制約があるため,ある設計をそのまま別の建物に流用できません。その代わり,蓄積されたパターンを再利用することで設計にかかる時間を短縮しようとしたのです。

 さて,話をソフトウエアに転じると,建築よりも再利用については手法が確立されています。一般にライブラリという形で手続きやデータ構造,クラスなどをさまざまなソフトウエアで共有できます。実際,LinuxなどのOSではそれこそ数え切れないほどのライブラリが提供されています。

 しかし,ライブラリがあれば共有は十分かというとそうではありません。ソフトウエアの設計の中にはライブラリという形ではくくり出せないけれども,複数のソフトウエアに共通に登場する「何か」が存在しています。まさにイディオム,パターンと呼ぶしかないものです。

 例えば,最も簡単なパターンを見てみましょう。

for (int i=0; i<len; i++) {

}

 これは「forループ」と呼ばれるイディオムです。インデックス変数である「i」を0からlenまで変化させつつ処理を進めます。CやC++,Javaなどのプログラミング経験のある人は,同様のコードをそれこそ何百回となく見てきたことでしょう。しかし,この簡単な処理をライブラリ化できるかというとそうもいきません。ライブラリよりもパターンと呼ぶべきものです。

 ソフトウエア設計にはこのようなパターンが数多く登場します。ところが,パターンの存在に自ら気づくことは少なく,何度も経験を積むうちに,ほぼ無意識のうちにパターンを利用してソフトウエア開発を効率的に進められるようになるのです。

 Erick Gamma氏と仲間たち*1はソフトウエア設計,特にオブジェクト指向に基づくソフトウエア設計において繰り返し登場するパターンに注目し,それをAlexanderの提唱する建築上の概念になぞらえて「デザイン・パターン」と呼ぶことにしました。そして自分たちと周囲の経験からいくつかのパターンを抽出し,カタログ化した上で『オブジェクト指向における再利用のためのデザインパターン』(ソフトバンク パブリッシング)という著書にまとめました。『デザインパターン』では表1に挙げた23のパターンが紹介されています。

表1●『デザインパターン』で紹介されている23のデザイン・パターン
表1●『デザインパターン』で紹介されている23のデザイン・パターン
[画像のクリックで拡大表示]

デザイン・パターンの価値と意味

 Gammaたちは別に新しいパターンを発見したわけではありません。カタログ化された23のデザイン・パターンはいずれも古くからソフトウエア開発で繰り返し用いられてきており,Gammaらが生み出したといえるものはないだろうと思います。それにもかかわらずデザイン・パターンは注目を集めています。いったいなぜなのでしょう。

 まず,個々のパターンの効果とパターンを使いやすい状況を明確にし,名前を付けてカタログ化したことが大きいでしょう。名前がなければ,パターンを使っていても,プログラマの意識に上らないことが多いのです。使うべきパターンに気づかないため,最適な設計が見落とされることもありました。

 しかし,彼らの最大の功績はデザイン・パターンをカタログ化したことではなく,「カタログ化できるソフトウエアのデザイン・パターン」という存在を明確にしたことでしょう。これによって,紹介された23のパターンに限定されず,より多くのデザイン・パターンが定義されることにつながりました。

 名前があるということは,存在が認識できることでもあります。名前のないものを認識し,議論することはほとんど不可能です。このような言語化されていない知識を暗黙知といいます。ソフトウエアに繰り返し登場するパターンに,名称を与えることで,経験を積んだプログラマ以外には今まで認識できなかったソフトウエア設計上のパターンを簡単に認識,議論できるようになったのです。このような知識を形式知といいます。今まで「普通の人」には取り扱うことができなかった暗黙知を形式知化した功績は多大です。