2009年4月16日木曜日

クラスの設計について

 隊長のブログで過猶不及也と出ていたので、設計について書いてみます。
 自分は、保守的です。C++ が出た時も、class なんているのかいな?と懐疑的でした。template が出た頃には、なんじゃこれ?どこの世界の言語やねん…と思ってました。自分の中の設計に対する考え方にも変遷があります。
 一時期は、オブジェクト至上主義的な考えに染まっていました。その時は純粋仮想継承と多重継承を使いまくりで、いかにオブジェクト中に共通部分があり抽象化できるか?に命題を見出していたように思います。その頃のブームは、「プログラムデザインのためのパターン言語」だったでしょうか?この頃は型による条件分岐にも入れ込んでいました。多重継承を駆使し、is-a の関係から処理を行うのです。擬似コードは、こんな感じです。

foo* pFoo = dynamic_cast<foo*>(pBar);
if( pFoo ) {
hoge( pFoo );
}

しかし、これは良い設計ではありません。それに、多重継承で、いろいろと武装していくと、後の設計変更に弱いのです。まぁ、パターンに溺れていたように思います。パターンなんて、たいして重要ではないのです。
 今は、オブジェクトよりも関数単位のメタな指向がいいなぁと感じています。一番好きなパートは、「Exceptional C++ Style」の37. 一枚岩 string の崩壊「過度にモノリシックな設計を避けよう」の節です。何でもクラスの中に隠蔽してしまうのは設計変更に弱く、メンテナンス性も低いし、再利用しずらいです。
 では、どうすれば良いか?実は、私も未だ旅の途中…。今は、クラス間の疎結合を目指す感じで書く事が多いです。そのためなら、ダック・タイピングも厭わない。コール・バック関数を使う局面も、昔よりは増えてきたような気がします。

0 件のコメント: