アグリゲーションとコンポジション
On 2月 12, 2021 by adminOOPのコンポジションは理解できますが、アグリゲーションとは何かを明確に理解することはできません。誰かが説明できますか?
回答
簡単なルール:
- A「所有」B =構成:Bは、Aなしではシステム内で意味や目的を持ちません
- AはBを「使用」します=集約:BはAから独立して(概念的に)存在します
例1:
会社は人の集合体です。会社はアカウントの構成です。会社がビジネスをやめると、アカウントは存在しなくなりますが、従業員は存在し続けます。
例2 :(非常に単純化)
テキストエディタはバッファ(構成)を所有します。テキストエディタはファイル(集約)を使用します。テキストエディタを閉じると、バッファは破棄されますが、ファイル自体は破棄されません。
コメント
- 自動車は骨材またはパーツの構成?
- そして、集約は2種類のエンティティ間の他の関係とどのように異なりますか?
- @reinierpost 現実では、車はパーツの集合体、およびパーツは単に分子の集合体です…ただし、モデルでは、すべて要件によって異なります。車から独立してその寿命を追跡できるように、エンジンを別個のエンティティとして扱うことは重要ですか?まったく同じエンジンを別の車で再利用できますか?もしそうなら、あなたはおそらく集約が必要です。それ以外の場合は、車の一部ではない'エンジンを気にせず、エンジンの再利用も気にしないため、コンポジションが必要です。' 。
- 完全に理解するための実装例が欠けています…
- 会社が事業をやめたときの従業員はどうですか?従業員と人は別の存在ですよね?では、会社は従業員の構成であると言えますか?
回答
http://en.wikipedia.org/wiki/Object_composition
集計は、意味しないという点で通常の構成とは異なります。所有。構成では、所有するオブジェクトが破壊されると、含まれるオブジェクトも破壊されます。総じて、これは必ずしも真実ではありません。たとえば、大学にはさまざまな学部(化学など)があり、各学部には多数の教授がいます。大学が閉鎖されると、学部は存在しなくなりますが、それらの学部の教授は存続します。したがって、大学は学部の構成と見なすことができますが、学部には教授の集合体があります。さらに、教授は複数の学部で働くことができますが、学部が複数の大学の一部になることはできません。
つまり、所有者が-集合体(および含まれるオブジェクト)が独立して存在できる場合、所有オブジェクトの構成との所有関係も破棄されます。
–
更新:お詫び-この回答後から考えると単純すぎます。
@Curtis Battは、彼の答えに優れた定義を提供しています。集計と構成
コメント
- 引用する例では、構成は1対多であり、集計にも1対多の関係が含まれていますが、ここでも可能です。集約のための多対多の関係である(教師が複数の部門で教えることができる可能性があると考えられる)。一方、学部は複数の大学の一部になることはできません。構成は所有権を意味しますが、集約は関係を超えません。引用は正しいですが、コメントは正しくありません。
- 破壊とは何の関係もありません! UMLはガベージコレクションシステムを定義していません。
- ウィキペディアのリンクは反射的な賛成を得ていると思いますが、これはひどい定義です-@ boldが指摘したように、これらの関係はGCとは関係ありません。これは、オブジェクトが2つの義肢を結合するボールジョイント内のボールなど、他の2つのオブジェクトのコンポーネントである場合にも崩壊します。コンポーネントの関係は機能依存性に関するものです。
- 私の答えがひどく欠けていることに同意しますが、WikiPediaの記事もそうです…
- 構成と集約の違いは明らかです。集計の問題は、'が通常の関連付けとどのように異なるかが不明確なことです。
回答
-
構成は関連付けです
-
集約は関連付けです
-
構成は強力な関連付けです(含まれているオブジェクトの寿命が完全にコンテナオブジェクトに依存している場合、強い関連付けと呼ばれます)
-
集約は弱い関連付けです(含まれているオブジェクトの寿命がコンテナオブジェクトに依存しない場合、それは呼び出されます弱い関連付け)
例:
class Contained { public void disp() { System.out.println("disp() of Contained A"); } } public class Container { private Contained c; //Composition Container() { c = new Contained(); } //Association public Contained getC() { return c; } public void setC(Contained c) { this.c = c; } public static void main(String[] args) { Container container = new Container(); Contained contained = new Contained(); container.setC(contained); } }
コメント
- 構成でも集約でもない集約と関連付けの違いは何ですか?
回答
単一の説明はありません。著者が異なれば、集計によって意味も異なります。ほとんどの場合、具体的な意味はありません。
コメント
- これ正解です。 ' 2冊の本で読んだことがあります。そのうちの1つは、Martin Fowler ' s UML Distilled です。
- martinfowler.com/bliki/AggregationAndComposition.html
回答
構成(混合)は、単純なオブジェクトまたはデータタイプを組み合わせる方法ですより複雑なものに。構成は、多くの基本的なデータ構造の重要な構成要素です
集約(コレクション)は、通常の構成とは異なります所有権を意味するものではありません。構成では、所有するオブジェクトが破壊されると、含まれるオブジェクトも破壊されます。集計では、これは必ずしも正しいとは限りません
╔═══════════╦═════════════════════════╦═══════════════════════╗ ║ ║ Aggregation ║ Composition ║ ╠═══════════╬═════════════════════════╬═══════════════════════╣ ║ Life time ║ Have their own lifetime ║ Owner"s life time ║ ║ Relation ║ Has ║ part-of ║ ║ Example ║ Car has driver ║ Engine is part of Car ║ ╚═══════════╩═════════════════════════╩═══════════════════════╝
Composition :エンジンはCarの一部であるため、それらの間の関係はCompositionです。 Javaクラス間での実装方法は次のとおりです。
public class Car { //final will make sure engine is initialized private final Engine engine; public Car(){ engine = new Engine(); } } class Engine { private String type; }
集約:組織には従業員として人がいるため、それらの間の関係は集約です。 Javaクラスに関しては次のようになります
public class Organization { private List employees; } public class Person { private String name; }
コメント
- これは'前の12の回答で作成され、説明された点を超える実質的なものを提供していないようです
- 本はライブラリなしで存在できることは間違いありません。悪い例です!
- ここでは、従業員のリストは組織オブジェクトの一部です。これはどのように集約になりますか?
- 関連付けは集約とどのように異なりますか?
- この回答が大好きです。最後に、集約と構成の違いが何であるかを適切に説明しました。
回答
集約は単純です。ビー玉の袋のようなコレクション
構成は、ボックスのヒンジのような内部/機能の依存関係を意味します
車は乗客を集約します。車の機能を損なうことなく出入りします
タイヤはコンポーネントです。タイヤを取り外すと、車は正しく機能しなくなります
[注:スペアタイヤは骨材です! ]
回答
私は常に構図を「必要」と見なします。つまり、車は必要ですエンジン、そして私は集約を「目的に関連するもの」と見なします。したがって、車のアナロジーにとどまると、私の集約は、車と乗客を一緒にすることを含む可能性のある旅を表すことになるかもしれません。旅は車を所有していないか、乗客、私は特定のシナリオに関連するデータを集約しています。旅が完了すると、車と乗客は進みます。車が終了すると、通常、車とそのエンジンは一緒に破壊されます。
回答
この簡単な例はどうですか:
オブジェクトの配列はコンポジションです。オブジェクトへのポインタの配列は集合体です。
最初のオブジェクトを削除すると、その内容も一緒に消えます。2番目のオブジェクトは一方、ポインタが削除されるときに各オブジェクトを削除する特定のメソッドがない限り、メンバーの存在に影響を与えることなく消滅する可能性があります。
コメント
- これは'前の11の回答で述べられ、説明された点に実質的な何かを追加するようには見えません
- 敬意を表して同意しません、@ gnat。これはどのように2つを実装することができます。人々は例を使ってよりよく学びます。(私はここに来て、ポインターメンバーが集合体であり、オブジェクトメンバーが構成である可能性が高いことを理解しました。これが直接対処する唯一の答えです。)
回答
意味的には、すべてのセットはサブセットで構成されていますよね? したがって、次のようになります。
-
集約とは、これらのサブセットが親セットとは独立して存在する場合です。 モニターをコンピューターから取り外して別のモニターに接続できるため。
-
構成は、これらのサブセットが親セットの存在に依存する場合です。 葉は木の一部であるか、肝臓は体の一部であるため。
これらの概念は、2つのオブジェクトまたはクラス間の依存関係の種類について概念的に説明しています。 プログラムで直接、集約で、親オブジェクトが破棄されるとき、集約オブジェクトも破棄する必要があります。 コンポジションの同じシナリオでは、複合息子オブジェクトが存続し、その後、父オブジェクトがディスペンスされます。
コメントを残す