継承以外の解決策

これはなに Link to this heading

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

継承すべきとき Link to this heading

  • is-aの関係が明確で、かつその振る舞いも共通化できるとき

継承以外の解決策 Link to this heading

新しく別のクラス/関数を作る Link to this heading

  • 思想: 似ているだけで別物なら、別で作るべき
    • 「似ている」と「同じ」は違う
  • cons : 重複コードが出る
    • 管理が大変になる

合成する(コンポジション) Link to this heading

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

共通化 Link to this heading

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

再設計: 最小カプセル化 Link to this heading

  • 思想: 必要な値とロジックだけを抽出して、新しいクラス/関数を作る
    • 値とロジックを1つにカプセル化できるため、もっとも理想的な解決策
  • cons: 抽出が難しいため、実装が難しい
    • たいてい再設計が必要になってしまうため、工数がかかる
Licensed under CC BY-NC-SA 4.0
最終更新 12月 06, 2025
Hugo で構築されています。
テーマ StackJimmy によって設計されています。