2013年11月20日水曜日

UMLのアグリゲーション(集約)とコンポジション

どう使い分ければいいかいつも悩んでしまう。

自分はJavaなので、フィールドに持つか持たないかとかで分けるかな?なんて考えたりもしたが、そんな内部設計的なことで考えるのも違うだろうという気がするし。

で、わかりやすいひとつの基準として、いくつかのサイトの解説をもとにまとめておく。


早い話が、コンポジションはアグリゲーションの一種だが、その対象要素がそれぞれ独立しては存在し得ないほど結びつきが強いものがコンポジションだそうで。

パソコンをUMLで表現するとして、「デスクトップPCとモニタは集約、ノートパソコンとそのスクリーンはコンポジション」だそうです。

この場合、モニタが壊れたてもPCは使い続けられるが、ノートPCでスクリーンが割れたら捨てるしかないし、付け替えはできない。(※修理の話しを始めるややこしくなるので、修理などいっさい出来ないと仮定する)

・・・アグリゲーションの構成は可変だが、コンポジションは構成が変わらないというのはひとつ明確な基準かも知れない。

なお、引数などとして一時的に参照するだけならば「依存(dependancy)」、has-a関係ではないただの関連付けは「関連(association)」となり、集約ではない。

依存や関連で参照するクラスを、効率上の都合などから実装時のクラスがフィールドも持つこともあるだろうが、それは集約とはしない方がいいのだろうと思う。

あくまでも、本来の意味、構造的に包含関係がある場合に、集約を用いるべきなのだろう。



参考にしたサイト:

  • http://www.itmedia.co.jp/im/articles/0302/22/news001.html パソコンのたとえ話の出典
  • http://itref.fc2web.com/uml/#dependency 

0 件のコメント:

コメントを投稿