読者です 読者をやめる 読者になる 読者になる

オブジェクトへの責務割り当てに関する基本原則 GRASPパターン


GRASPパターン(General Responsibility Assignment Software Patterns)は、オブジェクトへの責務割り当てに関する基本原則をパターンの形式で記述したもの

パターン 説明
Expertパターン 必要な情報を保持しているクラスに責務を割り当てる
Creatorパターン インスタンス生成の責務を割り当てる
High Cohesion 高凝縮性パターン。意味的に関係の深い機能を一つのオブジェクトに凝縮させるように責務を割り当てる
Low Coupling 疎結合性パターン。オブジェクト同士の結合度が低くなるように責務を割り当てる
Controllerパターン イベント発生時の責務を割り当てる
Indirection 間接化パターン。クラス同士を直接結びつけずに、間接クラスを定義する
Polymorphism 多態性パターン。異なる振る舞いを行う同じ操作を定義する
Pure Fabrication 純粋架空物パターン。人工的なクラスを生成し、責務を割り当てる
Variation Protected バリエーション防御パターン。将来予想されるバリエーションの増加を予想しておく

Expertパターン

責務の遂行に必要な情報を持っているクラス、すなわち情報エキスパートに責務を割り当てる。

  • 合計金額を計算するのは、販売クラスの責務で、小計の計算は販売明細クラスが行う

つまり販売明細クラスが計算した小計を、販売クラスがまとめるようにする。オブジェクトがタスクの遂行のために自分自身の情報を使うため、カプセル化が維持される。これにより、頑健で保守しやすいシステムに繋がる疎結合性を支援する。


必要な情報を持っている複数のクラスに振る舞いが分散されるため、より凝集度が強く、「ライトウエィト」なクラス定義が促進する。このようなクラスは理解しやすく、保守も容易となり、高凝集性を支援する。

Creatorパターン

あるクラスの新しいインスタンスを生成する責務はどのオブジェクトが持つべきか? 以下のどれかの条件が真である場合に、クラスAのインスタンスを生成する責務をクラスBに割り当てる。

  • BがAオブジェクトを集約する
  • BがAオブジェクトを含む
  • BがAオブジェクトのインスタンスを記録する
  • BがAオブジェクトを密接に使用する
  • Aが生成されるときにAに渡される初期化データをBがもっている(したがってAの生成に関してBはエキスパートである)

Controllerパターン

システムイベントを処理する責務は何がもつべきか?以下のどれかを表すクラスへのシステムイベントメッセージを処理する責務を割り当てる

  • 「システム」全体を表すクラス(ファサードのコントローラ)
  • ビジネスまたは組織全体を表すクラス(ファサードのコントローラ)
  • タスクに関する可能性のある、現実世界でアクティブである何か(たとえば人の役割など)を表すクラス(役割のコントローラ)
  • 通常”<ユースケース名>Handler”の名前をもつ、ユースケースのすべてのシステムイベントの人工的なハンドラを表すクラス(ユースケースのコントローラ)