2. モデル・図の作成 |
2.4 関係の設計 |
![]() |
今度は、クラス間の関係について、見直し、設計していこう。C++には関係という概念がないから、一番難しいところなんだよ。 | |||
|
||||
![]() |
ここでは設計レベルで関係を詳細化していく必要があるよ。今までは、クラスとクラスとの間になんらかのメッセージのやりとりがある場合、関連という関係の線を引いていたよね。分析段階では、関連は双方向であるという説明をしたが、設計段階では、方向性を単方向に限定することができるんだよ。そして、この方向性のことを誘導可能性と言うんだ。 | |||
![]() |
誘導可能性が単方向の場合だと、一方のクラスからもう一方のクラスにメッセージを送ることができても、その逆はできないのですか? | |||
![]() |
そうだよ。例えば、「注文登録コントローラ」クラスと「注文」クラスとの関連の誘導可能性は単方向であることが分かるかな?(図2.4.1) | |||
図2.4.1 関連の誘導可能性 |
||||
![]() |
はい。誘導可能性が単方向であることを示すには、関連に「矢印」を付ければいいのですね? | |||
![]() |
そうだよ。それに、C++では関連名をサポートしていないから、参照可能なクラス側の関連についてはロール名と可視性を付けることも忘れないように。誘導可能性はユースケースやシナリオ、相互作用図によって明らかにされるから、設計の段階で、関連に本当に双方向の誘導可能性が必要なのかどうかを検討するんだよ。 | |||
![]() |
誘導可能性が単方向か双方向かで、実装の仕方は大きく変わってくるのですか? | |||
![]() |
双方向の関連は、単方向の関連より、実装するのが難しくコストもかかるんだ。 | |||
![]() |
分かりました。集約の場合はどうなるのでしょうか? | |||
![]() |
集約の場合も、表記上は集約の線に「矢印」を付けることで単方向を示すんだよ。集約の誘導可視性は、通常、全体を表すクラスから部分を表すクラスへの単方向になるよ。 | |||
![]() |
分かりました。 | |||
![]() |
||||
![]() |
また、分析の段階では、関係として関連と集約を中心に考えていたけど、設計段階では、依存関係についても考える必要があるんだよ。 | |||
![]() |
依存関係は、関連とどう違うのですか? | |||
![]() |
依存関係とは、関連のあるクラス同士の中で、あるクラスが他のクラスに何らかの形で依存していることを意味するんだよ。例えば、オブジェクトを生成したり、メッセージを送ったりする関係に使うんだ。メッセージの引数として扱ったり、戻り値として扱ったりする場合もあるよ。関連がクラスの構造と見なせるのに対して、依存関係はクラスの構造としては含まれないんだよ。 | |||
![]() |
では、今まで関連だと考えていたものが、設計段階で依存関係になることもあるのですね? | |||
![]() |
そうだよ。では、作成したシーケンス図を見て、「注文商品」クラスと「配送センター」クラスとの関係を考えてみよう。「注文商品」がどこの「配送センター」で扱われているかはすでに決まっているから、依存関係になることが分かるかな?表記上は、矢印のついた点線で表すんだよ。(図2.4.2) | |||
|
||||
![]() |
はい、確かにそうですね。 | |||
![]() |
また、関連や依存関係は、オブジェクト間のコミュニケーションの道筋を提供するから、オブジェクト同士がどのように見えているかについても合わせて考えないといけないんだよ。 | |||
![]() |
オブジェクトの見え方によって、関係の設計も決まってくるのですね? | |||
![]() |
そのとおり。見え方には、グローバル(global)、パラメータ(parameter)、ローカル(local)、フィールド(field)の4種類があるんだよ。 | |||
![]() |
フィールドの場合、オブジェクトは構造の一部になるので、関連か集約で表現されることになりますよね。それ以外の3種類の場合は、依存関係として表現されると考えてよいですか? | |||
![]() |
そうだね。Chen君が言ったように、関連を4種類の可視性に分けて考えれば、依存関係を見つけやすいかもしれないね。 | |||
![]() |
はい。 | |||
|
||||
Prev. | Next | Home | Top |