OOPの構成を理解していますが、集約とは明確に理解できません。誰かが説明できますか?
単純なルール:
例1:
会社は人の集まりです。会社はアカウントの構成です。会社が事業を停止すると、アカウントは存在しなくなりますが、従業員は存在し続けます。
例2:(非常に簡略化)
テキストエディタはバッファ(構成)を所有します。テキストエディターはファイル(集計)を使用します。テキストエディタを閉じると、バッファは破棄されますが、ファイル自体は破棄されません。
から http://en.wikipedia.org/wiki/Object_composition
集約は、所有権を意味しないという点で通常の構成とは異なります。合成では、所有するオブジェクトが破壊されると、含まれるオブジェクトも破壊されます。集計では、これは必ずしも本当ではありません。たとえば、大学にはさまざまな学部(化学など)があり、各学部には多数の教授がいます。大学が閉鎖されると、学部は存在しなくなりますが、それらの学部の教授は存続します。したがって、大学は学部の集まりと見なすことができますが、学部には教授の集合体があります。さらに、教授は複数の学部で働くことができましたが、学部は複数の大学の一部であることができませんでした。
つまり、コンポジションと所有権の関係がある場合、所有されたオブジェクトは所有者がいるときにも破棄されます。集約(および含まれるオブジェクト)は独立して存在できます。
-
更新:謝罪-この答えは、後から考えるとあまりにも単純化しすぎています。
@Curtis Battは彼の答えで優れた定義を提供しています: Aggregation vs Composition
単一の説明はありません。作者が異なれば、集計の意味も異なります。ほとんどの場合、それによって具体的に何も意味しません。
作曲は協会です
集約は関連です
構成はstrong関連付けです(含まれているオブジェクトの寿命がコンテナオブジェクトに完全に依存している場合、強い関連付けと呼ばれます)
集約はweak Associationです(含まれているオブジェクトの寿命がコンテナーオブジェクトに依存しない場合、弱い関連付けと呼ばれます)
例:
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);
}
}
Composition(mixture)は、単純なオブジェクトまたはデータ型をより複雑なものに組み合わせる方法です。構成は、多くの基本的なデータ構造の重要な構成要素です
Aggregation(collection)は、所有権を意味しないという点で通常の構成とは異なります。合成では、所有するオブジェクトが破壊されると、含まれるオブジェクトも破壊されます。まとめると、これは必ずしも本当ではありません
╔═══════════╦═════════════════════════╦═══════════════════════╗
║ ║ 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:エンジンは車の一部なので、それらの間の関係は構成です。 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;
}
Aggregation:組織には従業員として個人があるため、それらの間の関係は集約です。 Javaクラスの観点から、それらがどのように見えるかは次のとおりです
public class Organization {
private List employees;
}
public class Person {
private String name;
}
集約は、ビー玉の袋のような単純なコレクションです
構成は、ボックスのヒンジのような内部/機能の依存関係を意味します
車は乗客を集約します。彼らは車の機能性を壊すことなく出入りします
タイヤは部品です。 1つを削除すると、車は正しく機能しなくなります
【注:スペアタイヤは集合体です!】
私は常に構成を「必要」、つまり車必要エンジンと見なし、集計を「目的に関連するもの」と見なしています。車のアナロジーを維持するために、私の集計は、車と乗客を一緒にすることを含むかもしれない旅を表すことかもしれません。旅は車や乗客を所有していません。特定のシナリオに関連するデータを集計しています。旅が完了すると、車と乗客が移動します。車が終了すると、車とそのエンジンは通常一緒に破壊されます。
意味的に、すべてのセットはサブセットで構成されていますよね?したがって:
集計は、それらのサブセットが親セットとは独立して存在する場合です。モニターは別のコンピュータに接続するためにコンピュータから取り外すことができます。
構成は、それらのサブセットが親セットの存在に依存する場合です。葉は木の一部であるので、肝臓は体の一部です。
これらの概念は、概念的に2つのオブジェクトまたはクラス間の依存関係の種類について説明します。プログラムで直接、集約で、親オブジェクトが破棄されるとき、集約オブジェクトも破棄される必要があります。コンポジションの同じシナリオでは、合成の息子オブジェクトが存続し、その後、父親オブジェクトがディスペンスします。
この簡単な例はどうですか:
オブジェクトの配列はコンポジションです。オブジェクトへのポインタの配列は集約です。
最初のものを削除すると、その内容が消えます。一方、2番目のメソッドは、ポインターが削除されたときに各オブジェクトを削除する特定のメソッドがない限り、そのメンバーの存在に影響を与えずに消失する可能性があります。