私はこれらについて多くの情報をレビューしましたが、それらの違いは何であるか理解できませんか? FowlerのUMLで、DistilledはAggreagationは厳密には無意味であるため、図で使用しないことを推奨しています。説明してください。それぞれをいつ使用する必要があるか、またJavaコードにどのように影響するかを説明してください。
これは非常に議論の余地のある質問です。マーティン 回答で説明 のように、注文は製品を集約します。そしてこれは本当であると考えることができます。 Grady Boochの彼の「オブジェクト指向分析とデザイン」では、関連付けの類似の例が紹介されています-販売はその販売の製品に関連付けられ、その逆も同様です。また、セールは製品を集計しません。したがって、すべての例はドメイン固有である必要があります。別の観点からは、関連付けがより具体的になる可能性があるためです。別の例は、段落を使用したドキュメントの構成です。
したがって、この分野のすべてはコンテキストに強く依存します。これがOOPです。
設計する予定の特定のプロジェクトに知識を適用してみることができます。まだ読んでいない場合は、Grady Boochの本を読むことをお勧めします。それ以来たくさんの本が書かれていますが、それでもOO *の聖書です。
クラスの関係には4種類あります
Man
はクラスPen
を使用します(人が死んでもペンはそこにあります)Man
にはクラスCar
があります(人が死んでも車はまだあります)Man
はクラスHeart
を所有しています(人間が死ぬとき、心臓が死ぬ)Man
is a Class Human
(Man is a Human)オブジェクトのクラス間の関係
継承>構成>集約>関連付け
関連付けとは、2つのクラスに何らかの関係があることを意味します。
合成と集約は2種類の関連付けです。それらを区別する最も簡単な方法は、関係が「どれほど難しい」かを考えることです。所有者オブジェクトを削除するとどうなるか考えてみてください。
集約、集約されたオブジェクトは存続します。 (注文<->製品を考えてください、製品は存続します)。
合成、集約されたオブジェクトは所有者と共に死にます。 (パラグラフ<->のドキュメントを考えてください。パラグラフはドキュメントとともに消えます)。
塗りつぶされていない矢印(関連付け)で線を描画することと、塗りつぶされていないひし形(集計)で線を描画することにはほとんど違いがないため、集計は無意味であると主張できます。関係は非常に似ています。ただし、塗りつぶされたダイヤモンド(組成)の線は非常に異なります。
UMLの構成、集約、プレーンアソシエーションはセマンティックコンセプトであり、プログラミングコンセプトではない 。それらの意味は次のように理解できます。
(コンポジションとアグリゲーションは特別なタイプのアソシエーションです。)
Javaでは、これらすべてを同じ方法で実装できます。それは概念的な違いです。
関連付けとは、あるクラスのインスタンスが別のクラスのインスタンスへのフィールド参照を持つクラス間の関係です。
構成は「より強い」関係です。つまり、あるインスタンス(親)が別のインスタンス(親)を「所有」します。
アソシエーションであること以外に追加のセマンティクスがないのは集約です。
詳細はこちら: http://martinfowler.com/bliki/AggregationAndComposition.html
編集:「一度に最大1つの親が所有することはできますが、親を変更するか、孤立する可能性があります」などの特別なセマンティクスを集計記号に追加できます。しかし、そのような拡張はあなた自身のものであり、私が知る限り、UMLで定義されていません。
どのWordがどれであるかについては、いくつかの議論があるようです。
オブジェクト間の親子関係と、親を削除したときに子に何が起きるかに関係しています。
あるシナリオでは、子供には親の外に生命はないため、親が削除されたときに削除する必要があります。外部キーとリレーショナルデータベースで「DELETE CASCADE」を考えてください。
他のシナリオでは、子供は親を超えて存続する必要があるため、親が削除されたときに子を削除しないでください。
どのWordがそれぞれの状況を説明するかについては、他の人に任せます。