【チュートリアル】 - 設計編

bn_rel.gif (758 バイト)

 
2. モデル・図の作成
2.4 関係の設計
 
jun 今度は、クラス間の関係について、見直し、設計していこう。C++には関係という概念がないから、一番難しいところなんだよ。
 
★関係の種類★

◆関係の設計

     
  • 関連の誘導可能性を決定する。
  • 関連や集約を見直し、関係を洗練する。依存関係や汎化についても考える。
  • オブジェクトの可視性を考える。
  • 多重度を見直し、多重度に応じた設計をする。
  • 関連クラスを設計する。
jun ここでは設計レベルで関係を詳細化していく必要があるよ。今までは、クラスとクラスとの間になんらかのメッセージのやりとりがある場合、関連という関係の線を引いていたよね。分析段階では、関連は双方向であるという説明をしたが、設計段階では、方向性を単方向に限定することができるんだよ。そして、この方向性のことを誘導可能性と言うんだ。
chen 誘導可能性が単方向の場合だと、一方のクラスからもう一方のクラスにメッセージを送ることができても、その逆はできないのですか?
jun そうだよ。例えば、「注文登録コントローラ」クラスと「注文」クラスとの関連の誘導可能性は単方向であることが分かるかな?(図2.4.1)
 図2.4.1 関連の誘導可能性
 
relsample1.gif (751 バイト) wd_rel.gif (6692 バイト)
 
chen はい。誘導可能性が単方向であることを示すには、関連に「矢印」を付ければいいのですね?
jun そうだよ。それに、C++では関連名をサポートしていないから、参照可能なクラス側の関連についてはロール名と可視性を付けることも忘れないように。誘導可能性はユースケースやシナリオ、相互作用図によって明らかにされるから、設計の段階で、関連に本当に双方向の誘導可能性が必要なのかどうかを検討するんだよ。
chen 誘導可能性が単方向か双方向かで、実装の仕方は大きく変わってくるのですか?
jun 双方向の関連は、単方向の関連より、実装するのが難しくコストもかかるんだ。
chen 分かりました。集約の場合はどうなるのでしょうか?
jun 集約の場合も、表記上は集約の線に「矢印」を付けることで単方向を示すんだよ。集約の誘導可視性は、通常、全体を表すクラスから部分を表すクラスへの単方向になるよ。
chen 分かりました。
2_4_8
jun また、分析の段階では、関係として関連と集約を中心に考えていたけど、設計段階では、依存関係についても考える必要があるんだよ。
chen 依存関係は、関連とどう違うのですか?
jun 依存関係とは、関連のあるクラス同士の中で、あるクラスが他のクラスに何らかの形で依存していることを意味するんだよ。例えば、オブジェクトを生成したり、メッセージを送ったりする関係に使うんだ。メッセージの引数として扱ったり、戻り値として扱ったりする場合もあるよ。関連がクラスの構造と見なせるのに対して、依存関係はクラスの構造としては含まれないんだよ。
chen では、今まで関連だと考えていたものが、設計段階で依存関係になることもあるのですね?
jun そうだよ。では、作成したシーケンス図を見て、「注文商品」クラスと「配送センター」クラスとの関係を考えてみよう。「注文商品」がどこの「配送センター」で扱われているかはすでに決まっているから、依存関係になることが分かるかな?表記上は、矢印のついた点線で表すんだよ。(図2.4.2)
 
 

図2.4.2 依存関係

 
wd_rel2.gif (1453 バイト)
 
chen はい、確かにそうですね。
jun また、関連や依存関係は、オブジェクト間のコミュニケーションの道筋を提供するから、オブジェクト同士がどのように見えているかについても合わせて考えないといけないんだよ。
chen オブジェクトの見え方によって、関係の設計も決まってくるのですね?
jun そのとおり。見え方には、グローバル(global)、パラメータ(parameter)、ローカル(local)、フィールド(field)の4種類があるんだよ。
chen フィールドの場合、オブジェクトは構造の一部になるので、関連か集約で表現されることになりますよね。それ以外の3種類の場合は、依存関係として表現されると考えてよいですか?
jun そうだね。Chen君が言ったように、関連を4種類の可視性に分けて考えれば、依存関係を見つけやすいかもしれないね。
chen はい。
2_4_9
 
 
Prev. Next Home Top