このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

目次

コンポジション(コンポジション集約)

  • コンポジションは制限が加えられた特別な集約である。
  • コンポジションの関連では、全体側がその部分側を強く所有する。
    • 全体側オブジェクトがコピーされたり削除されたりすると、その部分側も一緒にコピーされるか削除される。
  • 利用したい機能を持つクラスを内部に取り込むこと。
    • 利用したい機能を持つクラス型のフィールドを定義すればよい。こうすればこのフィールドに格納されるオブジェクトを使って、目的のクラスの持つメソッドなどを利用することができる。
  • 「has-a」の関係になる。
  • コンポジションを表すときには、通常の集約と区別するために黒く塗りつぶされた菱形を使う。
  • あるオブジェクトが別のオブジェクトを集約し、そのオブジェクトのライフサイクルを制御する場合である。
  • 1つのクラスだけがオブジェクトを構成できることを暗示する。他のクラスがそれを使用することはできるが、使用者は1つのクラスだけである。
    • 実際には構成オブジェクトが共有されることはほとんどないが、privateアクセスを使って隔離される。
      • HashMapに対するEntryは、HashMap自身しか生成することはできない。
  • コンポジションの関連では、全体側の多重度は「1」あるいは「0..1」でなければならない。
    • つまり、コンポジションでは1つの部分が複数の全体の一部であってはならない。
  • コンポジションの関係にあるオブジェクトがすでに不要でなったら、そのオブジェクトを消去することが重要である。JavaやSmalltalkのようにガベージコレクションがあればよいが、そうでない場合にメモリリークを引き起こしてしまう。

例:コンピュータにはCPUが1つ組み込まれているという関係

[コンピュータ]◆------------>[CPU]

例:○×ゲームの升目について

        1           9
[ボード]◆------------>[マス]

例:HashMapクラスはEntryという内部クラスを使用して格納のための入れ物を実装する。これらのEntryオブジェクトは、HashMapが存在する状況でしか存在することはできない。つまり、Entryオブジェクトは自分自身では存在し得ないのである。

[HashMap]◆------------>[HashMap $Entry]

参考文献

  • 『オブジェクト指向とコンポーネントによるソフトウェア工学』