GRASP(汎用的責任性割り当てパターン)とは
GRASPは、オブジェクト指向設計のために作られた指針とも言える9つの基本的な原則の集まりです。これは1997年に計算機科学者クレーグ・ラーマンが著した『実践UMLパターン - Applying UML and Patterns -』で初めて紹介されました。ラーマンは、ソフトウェア開発において重要なのは、設計の原則に基づいた「メンタルツール」であると強調し、UMLや様々な技術そのものではないと主張しました。GRASPは、オブジェクト指向開発の実践を助けるための思考ツールと位置付けられます。
GRASPの9つのパターン
GRASPの中に含まれる9つのパターンは、それぞれ独自の質問と回答を持ち、ソフトウェアの設計における責務の明確化や管理の向上を図ります。
1. 情報エキスパート - Information Expert
質問:オブジェクトに責務を割り当てる原則は?
回答:その責務に必要な情報を持つクラスに責務を割り当てるべきです。
この原則は、情報を集中させ、不要な結合を防ぐことを目的としています。情報を適切に持つクラスに責務を割り当てることで、理解の容易さや拡張性が向上します。
2. 高凝集 - High Cohesion
質問:クラスはどのようなプロパティとメソッドで構成されるべきか?
回答:一つの責務を全うするために必要なプロパティとメソッドだけを持つべきです。
高凝集性は、関連する機能がひとつのクラスに集中していることを意味し、システムの構造を理解しやすくします。
3. 疎結合 - Low Coupling
質問:クラス間の関連性と依存性をどうするべきか?
回答:可能な限り小さく保つべきです。
これは、各クラスの公開メンバを少なくし、依存性を減らすことにより、各要素間の独立性を保つことを目指します。
4. クリエイター - Creator
質問:誰がオブジェクトAを生成するべきか?
回答:Aを使用する者や情報を持つ者などです。
このパターンは、オブジェクトの生成に責任を持つクラスを明確にし、システムの疎結合性や効率を高めます。
5. コントローラ - Controller
質問:誰が入力イベントを扱うべきか?
回答:システムのコントローラが全ての入力を管理するべきです。
これにより、システムの操作を一元管理でき、異なる
ユースケース間の整合性を保つことができます。
6. 間接化 - Indirection
質問:どのようにオブジェクトの密結合を避けるか?
回答:中間オブジェクトを用いて直接の結びつきを避けるべきです。
この原則は、オブジェクト間の依存性を解消し、疎結合な設計を実現します。
7. 多態性 - Polymorphism
質問:型のすげ替え部分はどう扱うか?
回答:ポリモーフィックな型を使用し、異なる動作を結合します。
これにより、型に応じた柔軟な挙動を提供することが可能になります。
8. 保護的変容 - Protected Variations
質問:他者への影響を回避するためにどう設計すべきか?
回答:不変構成のインターフェースを用意するべきです。
これにより、システムの柔軟性を保ちながら、変化が起きやすい部分を隠蔽できます。
9. 純粋造形 - Pure Fabrication
質問:専門領域とは退いたクラスは作れるか?
回答:特定機能のために疎結合を実現するインターフェースを設けるべきです。
これは、問題領域の概念とは直接関係のないクラスを設計することです。
まとめ
GRASPは、ソフトウェアシステムをより理解しやすく、保守可能なものにするための原則です。それぞれのパターンは、責務の割り当ての最適化や、柔軟な設計を促進します。これにより、ソフトウェアの持続可能な発展が可能になるのです。