オブジェクト指向におけるデザインパターン

Last modified: 2014-01-17
ここでは Pree の著書の論旨に基づきつつ、他の文献からの引用をおりまぜて、 「デザインパターン」の意義と概略を整理してみたいと思います。

あくまでも私の解釈と経験に基づく理解なので、誤りや説明不足はご容赦ください。 オリジナルの文献を手に取るきっかけとなれば幸いです。


文献


■デザインパターンについて

■デザインパターンを明示することのメリット

■デザインパターンに関する既存の研究

■デザインパターンカタログ

Gammaらの「オブジェクト指向における再利用のためのデザインパターン」 は「即効性のある23のパターンカタログ集」です。
現実の問題に当てはめやすく、個々のパターンの実装における トレードオフのポイントなども解説されています。
忙しい人は Pree を読む前に Gamma らを読むとよいと思います。

また、 DDJ日本版1997/10 の特集は、C++ の最新の仕様(STL など)を用いていて実践的です。 Delphi のライブラリで使われている Windows GUI のためのデザインパターンも 解説されています。

いずれにせよ、レイトバインディングを使うことで、手続き指向に おける「分岐構文」を隠蔽する、というのが基本概念ですね。。

たとえば、State というパターンの例では、

class TCPState {
  virtual Open() = 0;
  virtual Close() = 0;  
  virtual Acknowledge() = 0;
} ;

class TCPEstablished : public TCPState {
  Open() ;
  Close();  
  Acknowledge();
} ;

class TCPListen : public TCPState {
  Open() ;
  Close();  
  Acknowledge();
} ;
みたいになっていて、

class TCPConnection {
  // これは TCPState に対する Context クラス
  TCPState *pState ; 
  Open();
} ;
のように現在の状態に応じたオブジェクトを入れておく。

TCPConnection::Open()
{
  pState->Open();
}
すれば、常に現在適切なメソッドが選ばれる。
「実行状態」をオブジェクトにすることにより、条件分岐をより構 造化できる、という感じです。

同じ考え方で正規表現のパーザーを表現したものもあり、 Interpreter パターンという名前がついています。

あと、MFC で CWinApp を継承することはどのデザインパターンに あてはまるかとか、ダイアログリソースごとに CMyDialog を実装 するとはどのパターンだとか、JDK1.0 から 1.1 になってイベント 処理のデザインパターンはどれにかわったとか、そういうことが、 なんとなくわかってきたような気がします。

さて、自分の仕事が Gamma のカタログでは解決しないと感じた場合は、 Pree のメタパターンを学んでみる価値があるでしょう。
乱暴にいえば、Pree の「メタパターン」は、仮想関数と継承を 使ってやれることを数学的に単純化したものであり、 Gamma らの「デザインパターン」は、それらの具体的な応用を示し たもの、という感じがします。

■メタパターン

Pree は、デザインパターンを「メタパターン」に抽象化。

よいフレームワークは適切な「ホットスポット」を持つ。
(ホットスポット:可変場所)

フレームワークの実装においては

として実装する。

フックメソッドは下の3つのどれかである。

テンプレートとフックの関係は相対的なものとなる。

■クラスとして実装されるテンプレートとフック

Pree はクラスの組合せ方として7つのメタパターンを提案。

Pree の本の後半では具体的な実装を元に上記のパターンを検証。

さきほどの State や Interpreter などの命名は E.Gamma らの仕事ですが、これらを W.Pree 流にまとめると 1:N 結合の例になります。

ということですね。

Pree の「デザインパターンプログラミング」には パターンの実装における具体的な判断の 基準が明記されていて気持ちよいです。 たとえば p.152 にはこうまとめられています。

たとえば Composite パターンをどちらで実装すればよいかまよったら、 自分が適応したいドメインにおいて、オーバライドする数を より少なくすませられる方を選べばよい、ということだと思います。

2014-01-17 文献リストのスペルミスを修正ました。

nishimoto [atmark] m.ieice.org / Takuya NISHIMOTO