概要
『オブジェクト指向における再利用のためのデザインパターン』を読んでいたら、「クラス継承よりもオブジェクトコンポジションを多用すること。」(P.31)とあった。
「コンポジション」についてあまり分かっていなかったので調べた。
コンポジション
前述の本には、コンポジションについて下記の記述がある。
オブジェクト指向システムにおいて、機能を再利用するためのよく知られた2つの技法に、クラス継承とオブジェクトコンポジションがある。(中略)
オブジェクトコンポジションはクラス継承の代替案である。こちらの場合は、オブジェクトをまとめる、あるいは合成することによって、より複雑な新しい機能を得ることができる。オブジェクトコンポジションは、合成の対象となるオブジェクトが的確に定義されたインタフェースを有することを必要とする。(P.30)
(コンポジションによって参照される)オブジェクトはインタフェースを通してのみアクセスされるので、カプセル化の概念を壊すことはないのだ。(中略)さらには、オブジェクトのインタフェースによってオブジェクトを実装できるので、実装依存度は低くなる。(P.31、()内引用者)
理解が正しいのかわからないのが、1つの巨大なクラスに機能を詰め込むよりも、小さな部品に分解してクラスとし、そのクラスをフィールドに持つほうが良い、という指針だと感じた。
1度巨大なクラスを作ってしまうと、その機能を再利用したいときには継承をするしかない。
だから、始めからそうならないように、分割してクラスを作っておく必要がある。
コンポジションと集約
コンポジション(composition)と集約(aggregation)は、いずれもクラス間の関連を表現する用語だが、区別がつかなくなるときがある。
『オブジェクト指向のこころ』にわかりやすい例が書いてあった。
コンポジション
保持されているものが保持しているものの一部である場合(自動車とそれを構成するエンジン等)。(P.29)
集約
独立して存在できる何かのコレクションがある場合(空港とそこに駐機されている飛行機等)(P.29)
参考文献
- エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース(1999)『オブジェクト指向における再利用のためのデザインパターン 改訂版』本位田 真一 / 吉田 和樹 監訳、ソフトバンククリエイティブ
- アラン・シャロウェイ、ジェームズ・R・トロット(2014)『デザインパターンととともに学ぶ オブジェクト指向のこころ』村上雅章訳、丸善出版