「デザインパターン走り書き」について
 
 このシリーズは「デザインパターン」についての簡単なメモです。ここだけ読んでもデザインパターンについて理解できたりはしないので、単なる助言程度に考えてください。
 
 「デザインパターン」とは
 
 C++やJavaが広まったことで、オブジェクト指向プログラミングは一般に浸透してきました。ですが、実際には「何をどう使ったらいいのか」ということを理解し実戦するのはなかなか難しいところがあります。
 そういった状況の中、「クラス構造の良くある形」を形式化し一般化することで「何をどうしたら」をなくそう、という考えが生まれました。これが「デザインパターン」です。
 
 Gamma本
 
 デザインパターンは「クラス構造」についてのパターンです。たとえば「このクラスはこのクラスから継承している」とか「このクラスはこのクラスをインスタンスに持つ」といったものを、パターン化して捉えようということです。
 でも、これは実際には結構単純な話で、確かにバリエーションは豊富ですが、基本的な仕組みはそれほど複雑ではありません。でも、逆に自由度が高すぎて、実用上どのパターンを使えばいいのか、難しいところがあります。
 
 そこで、Erich Gamma氏らによる著書「デザインパターン 〜オブジェクト指向における再利用のための〜 (ソフトバンク)」が出てきます。この本の中では、「豊富なバリエーション」の中から23個の実用上よく使うパターンを選び出し、名前を着けて例を挙げて解説しています。現在、「デザインパターン」と 言ったら「この本の中に上げられているパターン」のことを示すことが多いと思います。
 
 でも、僕には、この本はヒジョーに難しく感じます。確かに例になるコードが載っていますし解説も多いのですが、なんていうか、文が分かりにくいような……。
 というわけで、僕がこの本を読んで、僕なりに理解したものをこの「デザインパターン走り書き」では掲載していきます。そのため、実際には参考程度に思ってください。もちろん、前述の本を読んでいないと分からないと思います。
 
 必要な知識
 
 デザインパターンを理解するには、とりあえず次のようなC++の知識が必要になります。
 
継承:public継承について理解していれば大丈夫でしょう。あまりprivate継承は使用しません(インスタンスとして持つことが多いからです<オブジェクトコンポジションのこと)。
仮想関数:仮想関数は「関数ポインタをインスタンスが持つこと」です。newで関数ポインタを持たされれば、そのあとはアップキャストしようがダウンキャストしようがずっと持っています(多重継承は除く)。
抽象基底クラス:JavaやCOMでは「インターフェイス」と呼んでいるものです。(純粋)仮想関数を持って、派生クラスに「このメンバ関数はオーバーライドするんだよ」と指定するためのクラスです。
実装派生クラス:抽象基底クラスから派生したクラスです。抽象基底クラスが持つメンバ関数がちゃんと機能するように実装する必要があります。
オブジェクトコンポジション:他のインスタンスへのポインタをメンバ変数として持つことです。機能的にはprivate継承に近いものがあります。これらとpublic継承の違いについても理解してください。
 
 とりあえずこれらが分かっていないと話にならないと思います。もし要望が多ければ、ちゃんとした解説ページを作りますけど、どうしましょー。
 
 「走り書き」について
 
 この「デザインパターン走り書き」は、まさに走り書きです。前述のGamma本を読んでいないとかなり分からないと思いますし、逆に言えば、この本の副読書的な意味合いを持つものだということです。ですから、この連載だけでデザインパターンを理解しようとかは考えないでください。
(C)KAB-studio 1999 ALL RIGHTS RESERVED.