継承よりコンポジション
2020/10/15 15:32
継承とコンポジションの使い分けや考えるべきポイントです。継承でできる事の多くはコンポジションでも実現可能で、迷った際にはコンポジションを利用する方が大抵の場合に問題が起きにくい事など確認しています(継承で起きるちょっと怖いことも実演しています)。StrategyとTemplateMethodの類似性や違いなどもこの話が根源でしょう。20分弱の動画です。
継承を選ぶべきか、コンポジションを選ぶべきか
継承( Inheritance )とコンポジション( Composition )は似たような事が実現できる場合が多く、その適用に悩む事があります。
- 構造のシンプルさでは継承
- 柔軟性ではコンポジション
- 影響範囲の考えやすさではコンポジション
- クラスの数の少なさでは継承
についてそれぞれ優位性があるでしょう。
特に継承は、拡張する際に親クラスについての知識が深く必要になるシーンがあり、注意が必要な場合があります。
迷ったときはコンポジション
これは名著Effective Javaにも書いてある事ですが、親クラスについての知識が必要で時に親クラスの世界を壊してしまう可能性のある継承よりも、コンポジションで考える方がよりふさわしいという事が示唆されています。話者も(この書籍の影響を受けていることもあり)同様の考え方をしていますが、柔軟性を高める方を好む趣味とも合致しています。
Is-A 関係が明瞭な時には継承の方がより適切であることはあると思いますので、作っているモノによってこの辺りの判断は変わってくるでしょう。
利用したコード
https://github.com/CircleAround/pgonline/blob/master/src/20200810extendsand_composition.ts