Skip to content

DNET_GRASP

nishi_74322014 edited this page Sep 11, 2026 · 1 revision

GRASP(General Responsibility Assignment Software Pattern)

概要

  • Craig Larmanが著書「実践UML」で示した。
  • オブジェクト指向設計において用いられる、
  • クラスやオブジェクトに責務を割り当てる方針を導くパターンや原則

詳細

情報エキスパート (Information Expert)

必要な情報を全て持っているクラスに責務を割り当てるべきとする。

生成者 (Creator)

  • A を密接に使用するクラス B がクラス A の作成に責任を持つべき。
  • Factoryオブジェクトを作ってオブジェクトの作成を行わせることで目的を達する。

コントローラ(Controller)

  • システム全体や、ユースケース・シナリオを表現する
    (、UIでない)、クラスにシステムイベントを扱う責務を割り当てる。

  • UI層以上にあって、システムに対する
    操作を受け取り調整する(制御する)最初のオブジェクト。

疎結合 (Low Coupling)

以下を実現するための責務の割り当て方法を決定付けるための尺度である。

  • クラス間の依存を小さくする
  • 他のクラスの変更の影響を小さくする
  • 再利用の可能性を高める

高凝集性 (High Cohesion)

オブジェクトが適切に責務を集中させ、管理・理解が可能な状態を保つための尺度。

  • 高凝集性とは、

    • ある要素の責務が強く関連しており、またその要素に集中していることを意味する。
    • モジュール設計自体はシステムの凝集性を高める活動の例と言える。
  • 低凝集性とは、

    • 関連のない責務を持ちすぎている場合である。
    • 理解が難しく、再利用・維持管理が困難で、変更も行いづらい。

多態性 (Polymorphism)

  • ポリモルフィックな操作を持たせることで実現できる。

  • ポリモルフィックな操作は以下で実現できる。

    • アドホック多相(Ad hoc polymorphism)

      ≒オーバーロード

    • パラメータ多相(Parametric polymorphism)

      ≒テンプレート・ライブラリや、ジェネリックなど。

    • 部分型付け(Subtyping)
      部分型多相(subtype polymorphism)
      包含多相(inclusion polymorphism)

      オブジェクト指向言語のポリモーフィズム。

純粋人工物 (Pure Fabrication)

  • 問題領域に登場する概念を表すクラスではなく、
    疎結合や、高凝集性、それらから得られる再利用可能性を
    実現するために作られるクラス(情報エキスパートで実現できない場合)。

  • ドメイン駆動設計ではサービスと呼ばれる。
    明確な定義が見つからなかったが以下のように書かれている。

    • リポジトリ → データ源の切り替え、
      ファクトリー → 処理の切り替え、
      サービス → その他諸々をぶち込む。

    • 完全に振る舞いそのものであり、
      無理やりオブジェクトにしたもの。

間接化 (Indirection)

  • 二つの要素の中間にオブジェクトを設け
    両者の仲介を行う責務を割り当てることで、
    二つの要素間の疎結合性(および再利用の可能性)を促進する。

  • Model View Controllerにおいて

    • コントローラが
    • データ(モデル)と
    • 表現(ビュー)の

    仲介を行うのはその一例。

変動からの保護 (Protected Variations)

  • 周辺の要素(オブジェクト、システム、サブシステム)の

    • 変動から注目する要素を保護するために、
    • 不安定な部分をインタフェースを用いて収束させ、
    • ポリモーフィズムを用いてインターフェイスを実装させる。

    ↓↓↓

    • 安定したインターフェースを作成して、
    • 結合オブジェクトの変動から保護する。
  • 要するに
    大幅な設計変更があっても、
    安定したインターフェース部分に
    変更が及ばないようにする。

参考

SOLID

マイクロソフト系技術情報 Wiki

正誤

  • 「大幅な設計変更が合っても、」→「大幅な設計変更があっても、」

移行メモ

  • 元 Wiki では見出しそのものが他ページへのリンクになっていた箇所 (「SOLID」「デザイン・パターン」「IoC」「DI」 「IoC、AOP → DI → 依存性反転原則」)は、GitHub Wiki では 見出しからアンカが生成されるため、見出しをプレーン・テキストとし、 リンクは直下の本文に置いた。
  • マイクロソフト系技術情報 Wiki(techinfoofmicrosofttech.osscons.jp)への URL リンクは、移行済みの デザイン・パターン / IoC / DI / IoC、AOP → DI → 依存性反転原則 に張り替えた。

Tags: 移行, GRASP, 実践UML, Craig Larman, 責務割り当て, 凝集度, 結合度, 多態性, オブジェクト指向

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally