GRASPデザインパターン

他のパターン説明を読んでください



GRASP (General Responsibility Assignment Software Patterns)-責任をクラスおよびオブジェクトに割り当てるための一般的なタスクを解決するために使用される設計パターン。



9つのGRAPSパターンが知られており、もともとはCraig Larmanの著書「Using UML and Design Patterns」で説明されています。 Gang of Fourの読者になじみのあるパターンとは異なり、GRAPSパターンには明確な構造、明確な範囲、解決すべき特定の問題はありませんが、システム設計の設計に使用される一般的なアプローチ/推奨事項/原則のみを表しています。



メインGRASPテンプレートの特性を考慮してください。



サブジェクトエリア



GRASPテンプレートの読者によるより詳細な理解のために、海上貨物の主題領域からのそれらの使用例が説明されます。



航海士+海運会社は、海上貨物サービスの最大のプロバイダーです。 会社の本社は、カスタマーサービス部門、フライト派遣部門、およびフライトピッキング部門の3つの部門で構成されています。 カスタマーサービス部門のマネージャーは、ポイントAからポイントBへの商品の配送に関する契約を作成します。フライトディスパッチ部門のディスパッチャーは、船舶の位置を監視します。 フライトピッキング部門の管理者は、顧客との合意に基づいて貨物便を形成します。



情報エキスパート



情報エキスパートテンプレートは基本であると同時に、9つの中で最も明白なテンプレートです。 情報エキスパートは、クラスとオブジェクトに責任を割り当てるための基本原則を説明します。 説明によれば、情報エキスパート(何らかの責任を与えられたオブジェクト)は、割り当てられた義務を果たすために必要な最大の情報を持つオブジェクトです。



例として、特定のフライトでの貨物の総量とその価値の計算を検討し、会社のすべてのフライトについて要約することができます。





テンプレートを使用して、情報エキスパートはモジュールの接続性を向上させ、カプセル化プロパティと矛盾しません。



低結合および高凝集



おそらく、オブジェクト指向設計に関する文献には、これら2つの概念があります。 設計されたシステムは、モジュールの低接続性と高メッシュ化の原則を満たす必要があると考えられています。 これらのテンプレートに準拠すると、プログラムコードの変更と保守が簡単になり、再利用の度合いも高まります。



モジュールの接続性の尺度とモジュールのリンクの尺度の概念を検討してください。 モジュールの接続性の尺度は、あるモジュールが別のモジュールの性質に関して持っている情報の量によって決まります。 同様に、モジュールの関与度は、その責任に焦点を当てる度合いによって決まります。



特定のケースについて、接続性とエンゲージメントの尺度を1から10のスケールで評価できる方法論があることに注意してください。 ただし、この記事のフレームワークでは考慮されていません。



優れたシステム設計の例は、GNU Binutils Utility Suite for Linuxです。 ここで、各ユーティリティ(モジュールとして見た場合)は最小限の任務(高い関与)のみを実行し、他のユーティリティの性質についてほとんど何も知らない(接続性が低い)ため、ユースケースによっては簡単にアナログに置き換えることができます。



変更に対する耐性(保護されたバリエーション)



システムを変更する問題は、動的に変化する要件の条件に最も関連しています。 多くの場合、いわゆる ほとんどの場合、変更/修正の対象となるシステムの不安定ポイント。 次に、変更に耐えるテンプレートの本質は、不安定ポイントをインターフェイスとして定義し、さまざまな動作を実装することで不安定ポイントを排除することです。



たとえば、ナビゲーター+サービスの表現を展開する状況を考えてみましょう。 海運会社が旅客輸送に従事し始めたと仮定します。 これを行うために、システムの安定点であるトランスポートされたエンティティ(Entity)を実装します。





コントローラー



コントローラーは、入力システムイベントの処理を担当し、その処理の責任を有能なクラスに委任します。 一般に、コントローラーは1つ以上のユースケースを実装します



システム全体を表す外部コントローラー(フロントコントローラー)の概念が知られています(システムのすべての機能を1つのクラスに集約します)。



コントローラーの例としては、管理者クラスがあります。これは、フライト構成部門の管理者によるシステムの使用を実装します。





コントローラを使用すると、ロジックをプレゼンテーションから分離できるため、コードを再利用する機能が向上します。



ポリモーフィズム(多態性)



ポリモーフィズムパターンにより、タイプに基づいた代替動作を処理できます。 この場合、代替実装は一般化されたインターフェースに削減されます。



貨物輸送の関税計算の外部コンポーネントとシステムの統合を検討してください。 LocalTarificatorおよびWorldWideTarificatorクラスは、対応する外部コンポーネントへのアダプターです。





ポリモーフィズムテンプレートを使用すると、将来システムを簡単に変更できます。



純加工



サブジェクト領域のプログラミングモデルの概念があり、サブジェクト領域の各エンティティは、ソフトウェア環境の1つ以上のクラスに対応します。 同時に、エンティティの相互作用の責任は、原則として自分自身に課されます。 このアプローチには、システムモジュールの高い接続性という明らかな欠点があります。 純粋な発明テンプレートを使用すると、プログラムクラスに追加のクラスを導入し(サブジェクトエリアの実際の性質を反映せず)、必要な責任を提供することにより、この問題を解決できます。



たとえば、配送会社の顧客情報を格納する責任を架空のClientsSaverクラスに割り当てることができます。





ネット発明テンプレートを使用すると、システム設計が低接続性と高エンゲージメントの原則に準拠することができます。



リダイレクト(インダイレクション)



リダイレクションパターンは、相互作用の責任を追加オブジェクト(中間体)に割り当てることにより、クラス間の低い接続性を実装します。



このテンプレートの例は、ClientsSaverクラス(純粋な発明を参照)です。これは、クライアントエンティティとそれらが格納されるストレージとの間の中間層です。 さらに、MVCトライアドからのコントローラーは、データとそのプレゼンテーションの仲介です。



All Articles