作成日 2008/3/21
最終更新日 2008/4/6
[ Japanese | English ]

オブジェクト指向設計とGRASPパターン

 このページではオブジェクトを設計するときの責務の割り当てのパターンであるGRASPパターン(※1)を紹介します(※2)。

 あ、その前に、モジュールの凝集度と結合度について知らない方は、先に「オブジェクト指向とモジュールの凝集度、モジュールの結合度 - だるまのエクセルVBA 」を読んで下さい。

-----
※1:GRASPパターンはUMTP L3の試験範囲です。受験を考えている人は勉強しておいた方がよいです。
※2:実は、だるまもGRASPパターンについてはあまり知らないです。(なので紹介するくらいしか出来ないです。)申し訳ございません。勉強します…。

1.GRASPパターンとは
2.参考文献など


1.GRASPパターンとは

 GRASP(General Responsibility Assignment Software Patterns)とはオブジェクトを設計するときの責務の割り当てのパターンです。

 GRASPパターンには以下のパターン(表1)があります。

表1 GRASPパターンの詳細(※1)
1.Information Expert(情報エキスパート)
■問題:オブジェクトへの責任割り当てにおける一般原則は何か?
■解決策:責任の遂行に必要な情報を持っているクラス、すなわち「情報エキスパート」に責任を割り当てます。
■利点:情報がカプセル化されます。クラス間の結合度が下がります。情報が複数のクラスに分散され、理解しやすく、凝集度 の高いクラスが定義されます。
■関係のあるパターン:疎結合パターン、高凝集性パターン
2.Creator(生産者)
■問題:ある新しいインスタンスを生成する責任は何が持つべきか?
■解決策:以下の項目に多く当てはまるクラスに別のクラスのインスタンスを生成させる。
・インスタンス生成したいクラスを集約している。
・インスタンス生成したいクラスを記録する。
・インスタンス生成したいクラスを使用する。
・インスタンス生成したいクラスの初期化データ(例えばコンストラクタの引数に渡すデータ)を持っている。
■利点:クラス間の結合度 が下がります。
■関係のあるパターン:疎結合性
3.Controller(コントローラ)
■問題:UIレイヤからシステム操作を最初に受け取り調整するオブジェクトは何か?
■解決策:以下のどれかに該当するクラスに責任を割り当てます。
・主要なサブシステムを表すクラス
・システムイベントが起きるユースケースシナリオ表すクラス
■利点:再利用性が向上します。ユースケースの状態を判断する機会が得られます。
4.Low Coupling(疎結合)
■問題:クラス間の依存性を弱め、変更による影響を小さくし、再利用性を高めるにはどうすればよいか?
■解決策:結合度が低くなるように責任を割り当てます。複数の選択肢を評価する場合にもこの原則を用います。
■利点:クラスが他のクラスの修正に影響されなくなります。クラスが理解しやすくなります。クラスが再利用しやすくなります。
■関係のあるパターン:バリエーション防護壁パターン
5.High Cohesion(高凝集性)
■問題:オブジェクトの焦点を明確にし、わかりやすく、管理しやすく、さらにクラス間の結合度を下げるにはどうすればよいか?
■解決策:凝集度 が高くなるように責任を割り当てます。
■利点:設計の明確さと理解しやすさが高まります。保守と拡張が容易になります。クラス間の結合度 が下がります。
6.Polymorphism(多態性)
■問題:クラスによって変化する選択肢をどのように処理すればよいか?
■解決策:異なるクラスに同じ名前の操作を作成し、振る舞いを変化させるクラスにその振る舞いに責任を割り当てます。
■利点:新しくバリエーション(選択肢)が増えたとき、拡張が容易に行えます。
■関係のあるパターン:バリエーション保護壁パターン。GoFのデザインパターン に関連するパターンがたくさんあります。
7.Pure Fabrication(人工品)
■問題:凝集度を高く、結合度を下げるにはどうすればよいか(他のパターンでは駄目なとき)
■解決策:問題領域の概念をいっさい表現しない便宜上のクラスを作成します
■利点:クラスの凝集度 が上がります。クラスの再利用が高まります。
■関係のあるパターン:疎結合性パターン、高凝集性パターン
8.Indirection(間接化)
■問題:クラス間が直接的に結合しないようにするには何に責任を持たせるべきか?
■解決策:他のクラス間に介在する媒介オブジェクトに責任を割り当て、クラス間が直接的に結合しないようにします。
■利点:結合度が下がります。
■関係のあるパターン:バリエーション保護壁パターン、疎結合性パターン、人工品パターン。GoFのデザインパターン に関連するパターンがたくさんあります。
9.Protected Variations(バリエーション防護壁)
■問題:オブジェクト、サブシステム、システムの要素におけるバリエーションや不安定性が、他のクラスに影響しないようにするにはどうすればよいか?
■解決策:予測されるバリエーション、不安定性との接点を識別して、その周囲に安定したインタフェースを作成する
■利点:新しくバリエーションが増えたとき、拡張が容易に行えます。結合度 を下げられます。
■関係のあるパターン:GoFのデザインパターン に関連するパターンがたくさんあります。
※クレーグ・ラーマン著、依田 光江訳 『実践UML 第3版 オブジェクト指向分析設計と反復型開発入門』 ISBN:978-4-89471-682-7より

 自分で言うのもなんですが、表1はわかりにくいので参考文献(2、3番が良いと思います)を見た方がよいです。
 GRASパターンを知らなくても、自然とやっているものばかりです(※2)。
 上記の中で一番重要なものは「疎結合」と「高凝集性」です。これについては「オブジェクト指向とモジュールの凝集度、モジュールの結合度 - だるまのエクセルVBA 」を参照してください。
 詳細は参考文献 (2、3番が良いと思います)をあたってください。

-----
※1:
 パターンの和訳がサイトによって違うことがあります。どうも途中から和訳を変えたのが原因のようです。
※2:
 じゃあ意味がないかというとそんなことはないです。名前が付いていることにも意味があると思います。設計書をレビューしたり、後輩に指導したりするとき、他の人とコミュニケーションをとるときに、名前がないと苦労します。 それと、かっこいい名前が付いているだけで、なぜだか、説得力が変わってきたりする。
このページのトップへ

2.参考文献など

 このページを作成するのに参考にしたページです。

番号

リンク先の名称

リンク先の説明

リンクした日

1 【中級】基礎からのオブジェクト指向 第5部 「GRASPパターン」を理解する(前編):ITpro GRASPパターンについての説明と、凝集度、結合度についての説明があります。 2008/3/21
2 634 - GRASPパターン 9つあるGRASPパターンの詳細が載っています。 2008/3/21
3 @IT:連載:.NETで始めるデザインパターン 第2回 うまくデザインパターンを使うための心得 GRASPパターンについての説明と、凝集度、結合度についての説明があります。 2008/3/21
4 設計におけるオブジェクトの責務分配に有効なものさし -凝集度と結合度- GRASPパターンについての説明と、凝集度、結合度についての説明があります。 2008/3/21
5 GRASP (Object Oriented Design) - Wikipedia, the free encyclopedia GRASPパターンについて説明していると思われるページ。英語なのでよくわからない。 2008/3/21

番号

著者名

書籍名

ISBN

1 クレーグ・ラーマン著、依田 光江訳 実践UML 第3版 オブジェクト指向分析設計と反復型開発入門 978-4-89471-682-7


Prev Up Next  Top
このページのトップへ

このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS 、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
UMTP は特定非営利活動法人UML モデリング推進協議会の登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。