頭が悪いのでデザインパターンを理解できないと思った話
第8回の原稿を書き始めた。今回は「複雑な構造の表現」がテーマなので、ツリーやネットワーク構造、動的属性などを解説する予定である。
当然、デザインパターンのComposite構造も登場させるわけだが、これを書いていたら、初めてGang of Fourの『オブジェクト指向における再利用のためのデザインパターン』を読んだ時のことを思い出した。
正直に言うと、最初はまったく理解できなかった。何しろあの本が出た1995年当時はメインフレームの仕事をしており、本格的なOO設計やOOプログラミングの仕事をやる前の時期だったため、“Abstract Factoryで複数のlook-and-feel規格を切り替える”なんて言われても全く実感が沸かなかった。
理解できないままパラパラと読み飛ばして見つけたのがCompositeだった。これが木構造を表現する仕組みであることはすぐに理解できた。ところがクラス図がどうも腹に落ちない。しかし当時は“オブジェクト指向は達人だけが理解できる秘伝の技術”みたいな雰囲気が漂っていたので、理解できないのは自分の頭が悪いせいなのだろうと思ったものだった。

Compositeパターンのクラス図
実際にはCompositeのクラス図が木構造の表現方法として十分条件ではないことに気づいたのは、しばらく経ってからのことである。すなわちCompositeパターンのクラス図は、次のような構造の表現を意図している。

Compositeパターンのオブジェクト図(その1)
しかしツリー構造だけでなく、次に示すような循環や再帰も表現できてしまう。なぜならクラス図では、「Compositeは複数のComponent(CompositeまたはLeaf)を配下に持つことができる」ことと、「あるComponent(CompositeまたはLeaf)の親はたかだか1つしかない」ことを指定しているだけだから*1。

Compositeパターンのオブジェクト図(その2)
最初は、このネタを連載記事で使おうと思った。しかし出題する問題は、システム開発の要求定義の話で統一したいので、組織構造、勘定科目、ファイルとディレクトリあたりから選ぶ予定である。
*1:さらに、もしComposite側の多重度を1にすると、誰も最上位になれなくなってしまう。