概要
「集約」と「コンポジション」の違いについて
-デザインパターンとともに学ぶ-オブジェクト指向のこころを読んでいて「集約」と「コンポジション」の違いについて書かれていたのが気になったので、自分なりに簡単にまとめてみました。
定義
この書籍には、「集約」と「コンポジション」の定義がGoFとUMLで違うということが記載されていました。その理由はGoFがUML制定以前に記されたものであること、採用されているモデリング言語が違うことのようです。この記事では、現在一般的に使われているUMLの定義に沿って記述しています。
また、両者をそれぞれ別のものに例えるのではなくて、出来る限り統一のものに例えてみました。
コンポジション
保持されているものが保持しているものの一部である場合
P.29
この書籍では「車とエンジン」で例えられています。
実装段階では、Aのインスタンスが生成されると同時にBが生成され、Aが破棄される時にBも破棄されます。このことから、「両者の関係に強い結びつきがある」と言われます。
これは社員と社員証の関係で考えると解りやすいかなと思いました。
社員が入社したと同時に社員証が発行され、退職したと同時に破棄されます。
社員証の寿命(生成から破棄)は独立しているとは言えません。
集約
独立して存在できる何かのコレクションがある場合
P.29
こちらは空港と飛行機で例えられています。
コンポジションのようなAとBの強い結びつきはありません。
Bインスタンスの寿命はAインスタンスに縛られることはありません。
これは会社と社員の関係と考えました。
ある日、会社がなくなったとしても社員は別の会社で社員になることが出来ます。
(労働市場における会社と従業員といった方が伝わり易いかもしれません)
まとめ
実際の業務で「集約」と「コンポジション」の選択はどの段階で起きるのかが気になり、調べたり考えたりした内容を記述させてもらいました。実装段階で選択することもあるかもしれませんが、例を考えてみた時に、概ね仕様により決まる印象を受けました。実装で意識してみるとまた、違った印象を得れるかもしれないので楽しみにしています。