web-dev-qa-db-ja.com

関連付けと集計

私はこれらについて多くの情報をレビューしましたが、それらの違いは何であるか理解できませんか? FowlerのUMLで、DistilledはAggreagationは厳密には無意味であるため、図で使用しないことを推奨しています。説明してください。それぞれをいつ使用する必要があるか、またJavaコードにどのように影響するかを説明してください。

31
maks

これは非常に議論の余地のある質問です。マーティン 回答で説明 のように、注文は製品を集約します。そしてこれは本当であると考えることができます。 Grady Boochの彼の「オブジェクト指向分析とデザイン」では、関連付けの類似の例が紹介されています-販売はその販売の製品に関連付けられ、その逆も同様です。また、セールは製品を集計しません。したがって、すべての例はドメイン固有である必要があります。別の観点からは、関連付けがより具体的になる可能性があるためです。別の例は、段落を使用したドキュメントの構成です。

したがって、この分野のすべてはコンテキストに強く依存します。これがOOPです。

設計する予定の特定のプロジェクトに知識を適用してみることができます。まだ読んでいない場合は、Grady Boochの本を読むことをお勧めします。それ以来たくさんの本が書かれていますが、それでもOO *の聖書です。

10
khachik

クラスの関係には4種類あります

  1. 関連付け:aを使用
    例:クラスManはクラスPenを使用します(人が死んでもペンはそこにあります)
  2. 集計:ある
    例:クラスManにはクラスCarがあります(人が死んでも車はまだあります)
  3. 構成:所有者a
    例:クラスManはクラスHeartを所有しています(人間が死ぬとき、心臓が死ぬ)
  4. 継承:is a
    Ex:a Class Man is a Class Human(Man is a Human)

オブジェクトのクラス間の関係

継承>構成>集約>関連付け

148
pohchen

関連付けとは、2つのクラスに何らかの関係があることを意味します。

合成と集約は2種類の関連付けです。それらを区別する最も簡単な方法は、関係が「どれほど難しい」かを考えることです。所有者オブジェクトを削除するとどうなるか考えてみてください。

集約、集約されたオブジェクトは存続します。 (注文<->製品を考えてください、製品は存続します)。

合成、集約されたオブジェクトは所有者と共に死にます。 (パラグラフ<->のドキュメントを考えてください。パラグラフはドキュメントとともに消えます)。

塗りつぶされていない矢印(関連付け)で線を描画することと、塗りつぶされていないひし形(集計)で線を描画することにはほとんど違いがないため、集計は無意味であると主張できます。関係は非常に似ています。ただし、塗りつぶされたダイヤモンド(組成)の線は非常に異なります。

24
Martin Algesten

UMLの構成、集約、プレーンアソシエーションはセマンティックコンセプトであり、プログラミングコンセプトではない 。それらの意味は次のように理解できます。

  • 構成:AはBで構成されます。 BはAの一部であるため、Aなしでは存在できません
  • Aggregation:AはBを所有し、BはAに属します
  • 関連付け:AはBを使用し、Aは特定の方法でBに関連しています

(コンポジションとアグリゲーションは特別なタイプのアソシエーションです。)

Javaでは、これらすべてを同じ方法で実装できます。それは概念的な違いです。

3
Kos

関連付けとは、あるクラスのインスタンスが別のクラスのインスタンスへのフィールド参照を持つクラス間の関係です。

構成は「より強い」関係です。つまり、あるインスタンス(親)が別のインスタンス(親)を「所有」します。

アソシエーションであること以外に追加のセマンティクスがないのは集約です。

詳細はこちら: http://martinfowler.com/bliki/AggregationAndComposition.html

編集:「一度に最大1つの親が所有することはできますが、親を変更するか、孤立する可能性があります」などの特別なセマンティクスを集計記号に追加できます。しかし、そのような拡張はあなた自身のものであり、私が知る限り、UMLで定義されていません。

2
Goran Jovic

どのWordがどれであるかについては、いくつかの議論があるようです。

オブジェクト間の親子関係と、親を削除したときに子に何が起きるかに関係しています。

あるシナリオでは、子供には親の外に生命はないため、親が削除されたときに削除する必要があります。外部キーとリレーショナルデータベースで「DELETE CASCADE」を考えてください。

他のシナリオでは、子供は親を超えて存続する必要があるため、親が削除されたときに子を削除しないでください。

どのWordがそれぞれの状況を説明するかについては、他の人に任せます。

0
duffymo