コンポジションとは
日本語で「混合物」を意味したもので、あるクラスの機能を持つクラス
のことを指しています。
特定クラスの機能を、自分が作るクラスにも持たせたい場合に、継承を使わずにフィールドとしてそのクラスを持ち、そのクラスのメソッドを呼び出すメソッドを持たせることで、クラスに他のクラスの機能を組み込むことができる。
メリット
- 「機能の継承」はクラスの関連図をイメージする際の分かりにくさを回避できる
- メソッドをワンクッション置くことで融通を効かせられる
- コンポジションの対象となるクラスは、そのサブクラスも使用できる
デメリット
- 同じメソッドを作らなければならない
- コンポジションの対象となるクラスに変更があった場合には同じように変更しなければならない。
継承とコンポジションの使い分け
厳密なオブジェクト指向では、継承は「機能の継承」を目的とせず「スーパークラスはサブクラスの一種である」
といういわゆる「is-aの関係」を持たなければならないため、単に機能を持たせたい場合には、継承ではなくコンポジションとすることが推奨
される。
使い分けるために、一般的な物の考え方の一つに「分類」と「分割」がある。
分類とは、「is-aの関係」のことでありAはBである
ということです。
例えば、「犬は動物である」「人間は動物である」・・・など、これらは分類で表現することが出来る。
is-aの関係で表せるものは、継承で表現する
のが都合がいい。
分割とは、「has-aの関係」のことでありAはBを含んでいる
ということです。
例えば、「学校は先生を含んでいる」「自転車はサドルを含んでいる」・・・など、これらは分割で表現することが出来る。
has-aの関係で表せるものは、コンポジションで表現する
のが都合がいい。
まとめ
-
再利用には継承よりもコンポジションを使うべき
- 継承は「それを継承したオブジェクトは同じものとして扱える」ことを保証するためであり、コンポジションは「合成したものは部品に分解できる」ことを保証するものなので、部品のほうが再利用しやすい。
-
なるべくコンポジションを使ったほうが良さそう
- 部品が単純かつ不変な値オブジェクト(文字列や数など)は「属性」にまとめたほうがスッキリする。