デザインパターンとは

 GoFのデザインパターンからデザインパターンの定義を書いている最初の部分を見る。C・アレグザンダーの『デザイン・パターン』より引用があるが、ページが「x」となっている。不可思議に思って、当の『デザイン・パターン』を読むと、どうも引用のような記述は存在しないどころか、ちょっと曲解されている節がある。アレグザンダーの本では繰り返されるのは問題であって、解放ではない。GoFでは、繰り返される問題に対して解法が繰り返され、「最初から考えなくても済む」・・そんなことは書いてないではないか。

 もう一点、興味深いのが、GoFは抽象度を同じレベルに固定しているのに対し、アレグザンダーは緩いレベル分けをしてはいるものの、さまざまな抽象度のパタンを織り交ぜている。オブジェクト指向設計にとって、抽象度は問題の核心であるため、この点の違いは注目に値する。

デザインパターンとは

 Christopher Alexanderは次のように言っている。「それぞれのパターンは我々の身のまわりで何回も起きる問題、および、それぞれの問題に対する解放のポイントを記述している。そこで我々は、これらの解法を何万回でも使うことができる。同じ問題に対する同じ解法を何度も何度も最初から考え直さずに済むというわけだ」(AIS+77,page x)。これは建築物や街の設計におけるパターンについて論じたものだが、彼が言っていることはオブジェクト指向設計のパターンにもあてはまる。我々の解法は、壁やドアの代わりにオブジェクトやインターフェースによって記述されるが、いずれのパターンもそれぞれの問題に対する解法となっている点では同じである。
1.パターン名は、設計問題とその解法およびその結果を1、2語で記述した名称である。パターンに名前を付けることで、設計における用語の語彙を増やすことになる。それによって高い抽象レベルで設計することが可能になる。パターンに関する語彙が増えれば、同僚と議論したり、文書に記録したり、自分自身で考えを整理するのにも役立つ。設計に関して検討したり、設計上のトレードオフを人に伝えることも容易になる。良い名前を見つけることは、我々のカタログを開発するうえでのもっとも重要な作業の1つであった。

2.問題は、どのような場合にパターンを適用すべきかを記述したもので、問題とその文脈を説明する。オブジェクトとしてアルゴリズムをどのように表現するかというような具体的な設計問題を記述する場合もあれば、柔軟さに欠ける設計の徴候になるクラスやオブジェクト構造を記述する場合もある。また、パターンを適用する際に満たさなければならない条件のリストを含む場合もある。

3.解法は、設計の要素、それらの関連および責任、協調関係を記述する。解法は特定の具体的な設計や実装の記述はしない。なぜならば、パターンはさまざまな状況に適用できるテンプレートのようなものだからである。その代わり、パターンは設計問題を抽象的に記述し、クラスやオブジェクトなどの要素の配置によってどのようにそれらの問題を解決するかを示している。

4.結果は、パターンを適用する際の結果やトレードオフを記述する。我々が設計上の決定を記述する際、結果についてはあまり口にしないが、設計上の代替案の評価やパターンを適用する場合のコストや有効性を把握する際に、結果はきわめて重要である。
 ソフトウェアに対する結果は、しばしば容量や時間のトレードオフに関するものとなる。言語や実装に関する問題も扱う。また、オブジェクト指向設計においては再利用が重要な要因である場合が多いので、パターンの結果には、そのパターンがシステムの柔軟性、拡張性、移植性に与える影響も含まれる。これらの結果を明確にリストアップすれば、理解や評価もしやすいであろう。

 何がパターンで何がパターンでないかの解釈は、人それぞれである。ある人にとってのパターンが、他の人にとっては単なる基礎単位であったりする。本書では、ある抽象レベルでパターンをまとめた。本書のデザインパターンは、クラスの中でコード化され、そのまま再利用できるようなリンクリストやハッシュテーブルのような設計に関するものではない。あるいは、アプリケーションやサブシステムに関する分野に固有の複雑な設計でもない。本書で扱うデザインパターンとは、「種々の状況における設計上の一般的な問題の解決できるよう、オブジェクトやクラス間の通信を記述したもの」である。

(『オブジェクト指向における再利用のためのデザインパターン』
E.ガンマ他)

あるパタン・ランゲージ

 このランゲージの成分は、パタンと呼ばれる実体(エンティティ)であり、1つ1つが独立した存在である。各パタンが、私たちの環境にくり返し発生する問題を提起し、その問題にたいして、二度と同じ結果が生まれないよう、解答の要点だけを明示している。

 使い易さと分かり易さのため、どのパタンも同一の書式にまとめてある。最初に、そのパタンの原型を示す写真がある。写真の次にそのパタンの前後関係(コンテクスト)を規定する前文があり、より大きなパタンの完成にどのように寄与できるかがわかる。次の3つの印が、パタン本体の始まりを示す。つづく太字の見出し文は、問題の本質を短い文章に圧縮したものである。見出し文のあとに、その問題を論じる本文があり、最も長い部分になる。そのパタンの経験的背景、そのパタンの有効性の証拠、そのパタンの環境へのさまざまな現れ方などが、そこで論じられている。本文のあとの太字が、パタンの急所を示す解答であり、一定の状況下(コンテキスト)で、一定の問題の解決に必要な、物理的・社会的関係のおよぶ範囲について述べている。解答は、つねに命令形で表現されている−つまり、そのパタンの実現には何をなすべきかが、はっきり分かるようになっている。次に、解答を図化したダイアグラムがあり、解答の主成分を示す短い標語が記入されている。

 ダイアグラムのあとの3つの印が、パタン本体の終了を示す。そして最後の後文のよって、そのパタンの完成、肉付け、充実に不可欠な、すべての小さなパタンにつながるようになっている。

 このような書式を用いたのは、2つの重要な目的のためである。第1に、パタン相互に関連性をもたせ、253パタンの集合を1つの全体、つまり1つの言語(ランゲージ)として把握し、無数の組み合わせを可能にするためである。第2に、パタンの根底にある本質を見失わずに、読者自身が、各パタンの問題と解答を判定し、修正できるようにするためである。

(『パタン・ランゲージ』クリストファー・アレグザンダー)

こさぼのページ