Open2
コンポジション
クラスのロジックや属性を再利用する際に使われるテクニックについてメモ
コンポジションと集約
コンポジション
- あるクラスが、あるクラスの一部として動作する
- あるクラスが存在する限り、それに関連するクラスも存在するが、あるクラスが終了すれば、関連するクラスも終了する
Example
- 体の部位と人間の関係: 人間のクラスと手や足のクラスとの関係はコンポジションの良い例です。人間が存在しない場合、その手や足も存在しないため、人間のオブジェクトが消滅すると、その手や足のオブジェクトも自動的に消滅します。
- 車とエンジンの関係: 車のクラスとエンジンのクラスの関係もコンポジションに該当します。車がなければ、そのエンジンも存在しないので、車のオブジェクトが破棄されると、エンジンのオブジェクトも破棄されます。
- ユーザーインターフェースとウィジェット: GUIアプリケーションでのウィンドウやパネルと、それに含まれるボタンやテキストボックスの関係は、コンポジションの例となります。親ウィジェットが破棄されると、子ウィジェットも破棄されます。
メリット
- ライフサイクルが明確
- 関連するオブジェクトが強固に関連し、不正な状態になりにくい
デメリット?
- 柔軟性:一部として動作するクラスは独立して存在できない
集約(Aggregation)
- 同様にあるクラスがあるクラスを所有するが、それぞれが独立して存在できる
- あるクラスが消滅しても、もう一方のクラスは存在することができる
Example
学校と生徒の関係: 学校のクラスと生徒のクラスの関係は集約の良い例です。学校が閉鎖されても、生徒は存在し続けます。
図書館と本の関係: 図書館のクラスと本のクラスの関係も集約に該当します。図書館がなくなっても、本は他の場所で存在し続けることができます。
チームとプレイヤー: スポーツのチームとプレイヤーの関係は、集約の例となります。チームが解散しても、プレイヤーは他のチームに移籍するなどして、独立して存在し続けることができます。
メリット
- 柔軟性:関連が弱くなり、それぞれ変更や拡張が他方に影響を与えず容易に行える。
- 再利用性:他のオブジェクトとして独立して再利用可能
デメリット
- ライフサイクルを個別に管理しないといけない
それぞれの違い
関連するオブジェクトのライフサイクルの管理方法。
関連するオブジェクトが独立して存在することができる場合は集約を、一方のオブジェクトが存在しないと他方も存在できない場合はコンポジションを使用
コンポジション | 集約 |
---|---|
一方のオブジェクトが破棄されると関連オブジェクトも破棄される | 一方のオブジェクトが破棄されてももう一方のオブジェクトは独立して存在し続ける |
継承
コンポジションとの違い
クラス同士の関係の (has-a, is-a) の違い
コンポジション | 継承 |
---|---|
has-a 車がエンジンを持っている |
is-a 犬は動物である |