これはなに

プログラミングにおいて、継承を使わずいい感じに実装するための解決策のメモ。
継承すべきとき

- is-aの関係が明確で、かつその振る舞いも共通化できるとき
継承以外の解決策

新しく別のクラス/関数を作る

- 思想: 似ているだけで別物なら、別で作るべき
- 「似ている」と「同じ」は違う
- cons : 重複コードが出る
- 管理が大変になる
合成する(コンポジション)

- 思想: has-aの関係にする
- 機能を内部に取り込んで利用するイメージ
- cons: 一部だけ利用したい場合でも、すべてを合成してしまう
- なぜ合成したのか、意図が不明確になってしまう
- メソッドやプロパティが欲しいだけの場合は向かない
- 使うとき
- スーパータイプのすべてを利用したいとき
- e.g. 依存性注入
- 使うのは一部だが、スーパータイプの概念が欲しいとき
- スーパータイプのすべてを利用したいとき
共通化

- 思想: 共通のロジックを関数として抽出する
- いわゆるDRY原則の適用
- cons: ロジックが値と分離してしまうため、知る人ぞ知るコードが増えてしまう
- 使うとき
- 値のカプセル化が不要なとき
- 単純にロジックとして共通化できる場合はとくに有効
- ロジックが独立している場合に該当
- クラスに依存しない実装は、クラスに依存させないほうが望ましい
- 単純にロジックとして共通化できる場合はとくに有効
- 値のカプセル化が不要なとき
再設計: 最小カプセル化

- 思想: 必要な値とロジックだけを抽出して、新しいクラス/関数を作る
- 値とロジックを1つにカプセル化できるため、もっとも理想的な解決策
- cons: 抽出が難しいため、実装が難しい
- たいてい再設計が必要になってしまうため、工数がかかる