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

bn_rel2.gif (1222 バイト)

 
2. モデル・図の作成
2.4 関係の設計
 
jun では次に、関連の多重度についての設計を考えてみよう。分析段階で考えていた多重度を、設計段階では更新、洗練し、すべての関連および集約について多重度を決定しなければいけないんだよ。
chen 多重度によって、関連の設計の仕方が違うのですか?
jun 「1」や「0..1」の多重度の関連を実装する場合、C++ではポインタを使用することが多いんだ。その際、ロール名が実装に役立つんだよ。例えば、「注文商品」クラスと「商品クラス」の場合で考えると、(図2.4.3)のようになるよ。
 

図2.4.3 多重度が「1」や「0..1」の場合の設計
 
relsample3 wd_ta2_2

  

chen なるほど。ひとつの注文商品に対応する商品が必ずひとつであれば、「注文商品」オブジェクトは、対応する「商品」オブジェクトへの単純なポインタを持つことで実現できるのですね。
jun そうだよ。
chen では、多重度が複数の場合はどのように関連を設計すればいいのですか?
jun 多重度が複数の場合は、通常、コンテナクラスを用いて設計するんだよ。
chen コンテナクラス?
jun コンテナクラスとは、そのインスタンスが他のオブジェクトの集まり(コレクション)であるようなクラスのことなんだ。一般的なコンテナクラスには、Set、List、Dictionaryなどがあるよ。では、「注文」クラスと「注文商品」クラスとの関連を例にして考えてみよう。C++の場合は、コンテナクラスとしてパラメタライズドクラスをテンプレートにマッピングして使うことが多いよ。(図2.4.4)
 

図2.4.4 多重度が複数の場合の設計(1)
 
wd_ta1 wd_ta1_2

 

  

chen コンテナクラスをクラス図に表示すると、クラス図がかなり複雑になりそうですね。
jun そうなんだ。だから、コンテナクラスは必ずしもクラス図に描く必要はないんだよ。コンテナクラスの型が情報として必要な場合には、ノートを使って図2.4.5のように描いておけばいいよ。
 

図2.4.5 多重度が複数の場合の設計(2)

 
relsample5
 
2_1_1r
chen 分かりました。ところでJun先輩、今回のモデルでは関連クラスを定義していますが、関連クラスについてはどのように設計すればいいのでしょうか?
jun 関連クラスが保持している情報は、オブジェクト間のリンクに属する情報だと考えたから、どちらか一方のオブジェクトの情報にすることはできなかったよね。そこで、設計段階では、関連クラスを普通のクラスとして作成し直す必要があるんだよ。C++では、関連クラスを直接サポートしていないからね。
chen 分かりました。関連クラスは、リンクで結ばれていた元の2つのクラスとは当然関係しているので、関連クラスから2つのクラスに関連を引けばいいのですね?
jun そうだよ。そのときに、多重度や参照可能性も忘れずに設定しよう。今回のモデルの「在庫」クラスで考えてみると、図2.4.6のようになるよ。
 
 
図2.4.6 関連クラスの設計
relsample61 ya_blk relsample62
 
 
chen なるほど。
jun ではChen君、関係についての情報を詳細化して、クラス図を作成してみよう。この段階では、すべての関連について参照可能性、多重度を考えなければいけないよ。
 

19_tit_3

 
 
 

図2.4.7 Chen君が作成したクラス図:注文商品が別の配送センターで扱われている場合
 
rel1

 
 
chen 関連については、誘導可能性と可視性を考えてロール名を付けました。また、コンテナクラスについては、簡略化したものを使用しています。関連以外の関係としては、「注文商品」クラスと「配送センター」クラスとの間に依存関係を引きました。
jun よくできたね。
 
 
Prev. Next Home Top