Open1

委譲とモジュール

ikeponikepon

委譲

オブジェクトが別のオブジェクトを内部で保持し、そのオブジェクトに特定の処理を任せる設計手法
以下が委譲の特徴:

  • 明示的な構造:
    • 動作を保持するオブジェクトをオブジェクト内部で明確に管理します。
    • クラスの内部に、保持するオブジェクトがはっきりと存在します(例: @behaviorなど)。
  • 柔軟性:
    • 保持するオブジェクトを動的に変更可能です。
    • 複数のオブジェクトを組み合わせたり、削除したりすることも容易です。

モジュール

クラスやオブジェクトに特定の機能を追加する仕組み
以下の特徴を持つ:

  • 静的な注入:
    • モジュールをincludeやextendで注入すると、そのクラスやインスタンスに直接メソッドが追加されます。
    • 動的に切り替えたり、削除するのが難しい。
  • 明示的な構造がない:
    • モジュール内のメソッドが直接クラスに混ぜ込まれるため、クラスがそれを「持っている」という感覚が薄れます。

モジュールが委譲に近いと言える部分

  • コードの再利用:
    モジュールを使えば、動作を異なるクラス間で簡単に共有できる
    これは委譲と同じ目的(再利用性の向上)を達成します。
  • 動作の分離:
    モジュールを使うことで、異なるメソッドを独立した形で定義できる
    これも委譲の特徴に近い部分

委譲とモジュールの違い

特徴 モジュール 委譲(composition)
動作の管理方法 動作を直接注入 別オブジェクトを内部で管理
構造の明示性 混ぜ込まれるため不明確 内部で保持するため明確
柔軟性 動作を増やしたり変更するのは難しい 複数の動作を簡単に組み合わせ可能
目的 機能の共有(メソッドを直接追加) 機能の委譲(保持オブジェクトに処理を任せる)

委譲とモジュール、どちらを使う?

ケース 選ぶべき手法 理由
動作を実行時に変更したい場合 委譲(composition) 動作をオブジェクトとして分離し、動的に切り替える柔軟性を持てるため。
動作がすべてのインスタンスで共通している場合 モジュール 機能をシンプルに再利用し、固定的な動作を簡単に追加できるため。
基本機能は共通で一部の振る舞いを変更したい場合 モジュール + 委譲(組み合わせ) 基本機能をモジュールで共有しつつ、柔軟な振る舞いの変更を委譲で実現することで、柔軟性と再利用性を両立できるため。