実際、アマチュアUMLの質問をいくつか作成してください。いくつかのドメイン概念をモデル化するUMLダイアグラムを作成し、別の概念に関する情報を「保持」するドメイン概念に出くわした場合、そのエンティティへのスタンプ/参照を保持するか、モデル自体にエンティティ全体を保持する方がよいでしょうか。これは単純な高レベルモデルの作成に関連していることを覚えておいてください。実装段階では、状況が少し異なると確信しています。
たとえば、以下の2つのモデルのどちらが実際に正しいですか? 1つ目は構成関係にあり、FlightBookingがFlight全体を保持します。 2つ目では、FlightBookingにはFlightへの参照があります。
次に、ドメインの概念をモデル化する高レベルのUMLダイアグラムを作成する場合、実際にどの程度詳細に説明するつもりですか。たとえば、次の図では、フライトに出発地/目的地の詳細を文字列として保持したり、これらの概念の個別のクラスをモデル化して構成関係を作成したりできます。 2つのうちどちらがお勧めですか?
また、フライトが文字列ではなく別のクラスとして出発地/目的地を「保持」する上記をモデル化する場合、2つの方法のどちらがこれをモデル化する正しい方法ですか?いつ連想を示すのか、いつ構成を示すのか、私はかなり混乱しています。
アソシエーション:
これは、2つのクラスが何らかの関係を持っていることを意味し、実際には何でもかまいません。
例:AはBを使用し、Aは特定の方法でBに関連付けられています。
構成:
これは、「所有権」のモデル化に使用される特殊なタイプの関連付けでもあります。これは集約と非常に似ていますが、全体の関係を表し、「部分」エンティティには独自の独立した存在がないという唯一の違いがあります。
例:AはBで構成されます。 BはAの一部であるため、Aなしでは存在できません。
良い説明: MLクラス図:関連付け、集約、構成
これが少し長い場合は申し訳ありません...
ドメインの概念をモデル化しようとしている場合は、構成/集約を忘れて、単純な関連付けに固執することをお勧めします。どうして?構成/集約の決定が重要な質問の邪魔になるからです。彼らです:
関係の命名relの終わりに名前を付けることで(1)を達成します。役割名(最初の例の「フライト」など)では、なぜ関係が存在するかについては何もわかりません。それであなたの例1では:関係は何を表していますか?機内の指定席ですか?確認済みですか?のために支払われた?現状の図からはわかりません。動詞ベースの命名にはさまざまなアプローチがあります。たとえば、 この投稿 。なぜこれをするのですか?ドメインを理解していることを確認するように求められるためです。ドメインルールの大部分(私はそれを証明したことはありませんが、おそらく大多数)が関係に存在します。したがって、関係が存在する理由を理解することは、ドメインを理解するための基本です。
カーディナリティおそらく命名よりも明白です。両端(上部と下部の両方)で決定する必要があります。下端で重要なのは、それがオプションであるかどうか(つまり、0または1)です。上端では、1つまたは複数。繰り返しますが、これはドメインからの重要なルールを明らかにします。もう一度あなたの例に戻ります:フライト予約のフライト数は? 1つのフライトを複数の予約に含めることはできますか? (「in」が意味するものは何でも...)。
動作の作成/削除関係のインスタンスを作成するのは誰ですか?誰が削除しますか?一方の端が削除された場合、もう一方の端はどうなりますか?繰り返しますが、問題のドメインからのすべての重要なルール。
それらはうまくいけばあなたの2番目の質問にも答えます。人間関係を軽蔑しないでください。それらを理解するために時間をかけてください。それらはドメインを理解するための秘訣です。上記のすべての質問に答えることで、構成/集約/関連付けの中から決定しようとするよりもはるかに多くの洞察が得られます。
本当に構成と関連付けを表示したい場合でも、上記の質問に答えると機械的です。
それ以外の場合は、単純な関連付けを使用します。集計については無視してください。語彙からそれを削除します。それが価値があるより多くの混乱を引き起こします。集約で言えることはすべて、適切に定義された単純な関連付けを使用すると、はるかに明確かつ正確に言うことができます。
hth。
PS:構文のポイント:コンポジションは塗りつぶされたひし形を使用します。あなたが示したのは集約です。
composition
、shared
、さらにはnone
であるため、3つすべてが集計です。そう、 composition のサブセットです aggregation そして aggregation の機能です association
最初の例では、構成を含む最初の図が正しいです。 2番目のオプションであるflightIDをintとして参照すると、couldは機能しますが、不完全です。そのint自体では、Flightオブジェクトにアクセスする方法が提供されません。 Flightクラスは、番号で取得できるフライトオブジェクトのリストを魔法のように保存しないため、2番目のオプションではすべてのFlightオブジェクトを保存するために3番目のクラスが必要になります。
2番目の質問については、大まかに言えば、それは実際には個人的な好み(または教授の個人的な好み!)に依存します。最善の判断を下してみてください。