2. モデル・図の作成 |
2.4 関係の設計 |
![]() |
では次に、関連の多重度についての設計を考えてみよう。分析段階で考えていた多重度を、設計段階では更新、洗練し、すべての関連および集約について多重度を決定しなければいけないんだよ。 |
![]() |
多重度によって、関連の設計の仕方が違うのですか? |
![]() |
「1」や「0..1」の多重度の関連を実装する場合、C++ではポインタを使用することが多いんだ。その際、ロール名が実装に役立つんだよ。例えば、「注文商品」クラスと「商品クラス」の場合で考えると、(図2.4.3)のようになるよ。 |
図2.4.3 多重度が「1」や「0..1」の場合の設計
|
![]() |
なるほど。ひとつの注文商品に対応する商品が必ずひとつであれば、「注文商品」オブジェクトは、対応する「商品」オブジェクトへの単純なポインタを持つことで実現できるのですね。 |
![]() |
そうだよ。 |
![]() |
では、多重度が複数の場合はどのように関連を設計すればいいのですか? |
![]() |
多重度が複数の場合は、通常、コンテナクラスを用いて設計するんだよ。 |
![]() |
コンテナクラス? |
![]() |
コンテナクラスとは、そのインスタンスが他のオブジェクトの集まり(コレクション)であるようなクラスのことなんだ。一般的なコンテナクラスには、Set、List、Dictionaryなどがあるよ。では、「注文」クラスと「注文商品」クラスとの関連を例にして考えてみよう。C++の場合は、コンテナクラスとしてパラメタライズドクラスをテンプレートにマッピングして使うことが多いよ。(図2.4.4) |
図2.4.4 多重度が複数の場合の設計(1)
|
![]() |
コンテナクラスをクラス図に表示すると、クラス図がかなり複雑になりそうですね。 | |
![]() |
そうなんだ。だから、コンテナクラスは必ずしもクラス図に描く必要はないんだよ。コンテナクラスの型が情報として必要な場合には、ノートを使って図2.4.5のように描いておけばいいよ。 | |
|
||
![]() |
||
![]() |
分かりました。ところでJun先輩、今回のモデルでは関連クラスを定義していますが、関連クラスについてはどのように設計すればいいのでしょうか? | |
![]() |
関連クラスが保持している情報は、オブジェクト間のリンクに属する情報だと考えたから、どちらか一方のオブジェクトの情報にすることはできなかったよね。そこで、設計段階では、関連クラスを普通のクラスとして作成し直す必要があるんだよ。C++では、関連クラスを直接サポートしていないからね。 | |
![]() |
分かりました。関連クラスは、リンクで結ばれていた元の2つのクラスとは当然関係しているので、関連クラスから2つのクラスに関連を引けばいいのですね? | |
![]() |
そうだよ。そのときに、多重度や参照可能性も忘れずに設定しよう。今回のモデルの「在庫」クラスで考えてみると、図2.4.6のようになるよ。 |
図2.4.6 関連クラスの設計
|
![]() |
なるほど。 |
![]() |
ではChen君、関係についての情報を詳細化して、クラス図を作成してみよう。この段階では、すべての関連について参照可能性、多重度を考えなければいけないよ。 |
|
図2.4.7 Chen君が作成したクラス図:注文商品が別の配送センターで扱われている場合
|
![]() |
関連については、誘導可能性と可視性を考えてロール名を付けました。また、コンテナクラスについては、簡略化したものを使用しています。関連以外の関係としては、「注文商品」クラスと「配送センター」クラスとの間に依存関係を引きました。 |
![]() |
よくできたね。 |
Prev. | Next | Home | Top |