UMLクラス図の表記法:関連付け、集約、構成の違い


39

UMLクラス図の表記法のいくつかについて混乱しています。

ここに画像の説明を入力してください

協会が何を意味するのか、私はよく知っています。2つのクラスのインスタンス間の関係(1つのクラスのインスタンスが作業を実行するために2番目のクラスのインスタンスを知る必要がある場合)は、関連関係です。関連とは、クラスAがクラスBのインスタンスへの参照(フィールド)を持っていることを意味することがよくあります。

しかし、集計構成の矢印の意味を理解するのに苦労しています。私の混乱の一部は、これらの表記法の異なる定義に遭遇したことが原因でした。

集計表記法の2つの定義:

定義1: 2つのクラス間の集約表記は、クラスA のインスタンスがクラスBのインスタンスのコレクション(リスト、配列など)を保持する場合に適しています。

定義2:クラスAのインスタンスがクラスBのインスタンスへの参照を保持し、BインスタンスがAインスタンスのライフサイクルに依存している場合、2つのクラス間の集約リンクが適しています。意味:クラスAのインスタンスが削除されると、クラスBのインスタンスも削除されます。クラスBのインスタンスは、クラスAのインスタンスに完全に含まれます。クラスB(通常のAssociation)。

構成表記の意味と、それが集約表記とどのように異なるかについては、わかりません。

定義を明確にして、理解してください。具体的な例を歓迎します。


定義2は、集約ではなく構成の定義に似ています。定義1は非常に適切に聞こえます。
jbx

回答:


32

Association、Aggregation、Compositionの3つのリンクは、2つのクラスがどの程度密接に関連しているかについての一種の尺度を形成します。

スケールの一方の端には、2つのクラスのオブジェクトが互いを知ることができるが、互いのライフタイムに影響を与えない関連付けがあります。オブジェクトは独立して存在でき、どのクラスAオブジェクトはどのクラスBオブジェクトが時間とともに変化するかを知っています。

スケールの反対側には、構成があります。構成は、クラスBがクラスAの不可欠な部分であるような関係-全体の関係を表します。この関係は、クラスAのオブジェクトがクラスBオブジェクトを持たずに論理的に存在できない場合に通常使用されます。

集約関係はそれらの両端のどこかにありますが、どこに正確に同意する人もいないようです。そのため、集約が意味するものについて普遍的に合意された定義もありません。その意味で、見つけた定義は両方とも正しいものであり、10人に尋ねると、11の異なる定義を取得するリスクがあります。


1
ご回答有難うございます。これが私が物事を理解する方法です。これが合理的な定義であるかどうかを言ってください。1-関連付けは、Aオブジェクトがその機能を実行するためにBオブジェクトについて知る必要があるときです。2-集約と構成の両方が「所有権」関係を定義します-クラスAのインスタンスは概念的にクラスBのインスタンスを所有します。しかし、Bインスタンスの有効期間はAインスタンスの有効期間とは無関係です。たとえば、従業員のいる部門。部門は従業員インスタンスを「所有」しますが、部門なしで生き続けます。組成物は、集計のようなものですが、
テルアビブコーン

1
Bインスタンスの有効期間は、Aインスタンスの有効期間に依存します。より強い「所有権」関係。例:車とホイール。車にはホイールが「完全に含まれています」。Wheelインスタンスは、Carインスタンスに含まれていないと存続しません。これは合理的な差別化ですか?
アビブコーン14

@Prog:はい、それは合理的な定義です。他の人はその定義を共有していない可能性があり、集約の使用を説明する必要があるかもしれないことを覚えておいてください。
バートヴァンインゲンシェナウ14

集計表記の最も一般的な定義は何ですか?私が使用している定義は?「のコレクションを持っている」定義?他に何か?
アビブコーン14

以下のOMG標準への参照は有益です。関連付けと構成はかなり簡単です。集約はぐらぐらするものです。実際には、「一部」のテストはうまく機能していることがわかります(「所有権」はそれを考えるのに最適な方法ではありません)。人はクラブの一員になることができるため、クラブは人々を集約します(所有していません)。クラブが破壊されても、人々は存在し続けます。
Huliax

10

とき組成はobject A含まれていobject Bobject Aも作成する必要がありますobject B

構成関係

クラスBが使用するクラスAがあります。

final class A
{
}

コンポジションの外観には複数のオプションがあります。

直接初期化構成:

final class B
{
    private $a = new A();
}

コンストラクター初期化構成

final class B
{
    private $a;

    public function __construct()
    {
        $this->a = new A();
    }
}

遅延初期化構成

final class B
{
    private $a = null;

    public function useA()
    {
        if ($this->a === null) {
            $this->a = new A();
        }

        /* Use $this->a */
    }
}

これにより、クラスAとの間に緊密な関係が作成されますB。クラスはB単になしでは存在できませんA。これは、依存性注入の原則に対する大きな違反です。

依存関係は、使用できるオブジェクト(サービス)です。インジェクションとは、依存関係を使用する依存オブジェクト(クライアント)に依存関係を渡すことです。サービスはクライアントの状態の一部になります。クライアントがサービスを構築または検索できるようにするのではなく、クライアントにサービスを渡すことが、パターンの基本的な要件です。

構成はnew DateTime、phpまたはnew std::vector<int>C ++で呼び出すなど、意味をなす場合があります。しかし、多くの場合、コードの設計が間違っているという警告です。

class Aがキャッシュに使用される特別なオブジェクトである場合、はのclass B実装を使用して常にキャッシュされ、class A動的に変更するコントロールはありません。これは悪いことです。

また、遅延初期化構成を使用した場合object BuseA()メソッドと呼ばれる作業が行われ、作成object Aが失敗することになり、object B突然使用できなくなります。


一方、集約は関係の方法であり、DIの原則に従います。object B使用する必要があるがobject A、あなたはですでに作成されたインスタンスを渡す必要object Aobject B、との創設すべきであるobject Aフェイルは、何が最初の場所で渡さないであろう。

要するに、Aggregationは、依存性注入の原則(コンストラクター注入、セッター注入、またはパブリックプロパティ注入)のUML表現です

これらはすべて集約です

最もタイトなコンストラクター注入(object Bなしでは存在できませんobject A)。

final class B
{
    private $a;

    public function __construct(A $a)
    {
        $this->a = $a;
    }
}

Looser(object Ainsideを使用しても使用しなくてもかまいませんが、使用object Bする場合は、おそらく最初に設定する必要があります)。

セッター経由:

final class B
{
    private $a;

    public function setA(A $a)
    {
        $this->a = $a;
    }
}

パブリックプロパティ経由:

final class B
{
    public $a;
}

使用しているのがクラスの具体的な実装のみである場合、Aggregation over Compositionを使用する正当な理由はありませんが、インターフェイスの挿入を開始するか、C ++抽象クラスの場合、Aggregationが唯一の方法になります契約を履行します。


1
コード例を見ることは本当に役立ちます!コードなしの英語の説明はすべてとても曖昧で主観的なようです。
ニコベリック

1

さらに、現在のUML標準の抜粋:

11.5.4アソシエーション–セマンティクス–表記法

[...]バイナリアソシエーションは、集約= AggregationKind :: sharedまたは集約= AggregationKind :: compositeの一方の端を持つことができます。一端が集約=有する場合AggregationKind ::共有中空ダイヤモンド凝集= AggregationKind付いた端::共有反対関連線の端の端子装飾品として添加されます。ダイヤモンドは、協会のダイヤモンド表記よりも著しく小さいものとします。集約= AggregationKind :: compositeとの関連付けも同様に対応する端にダイヤモンドがありますが、ダイヤモンドが埋められている点が異なります。[…]

9.5.4分類-プロパティ-表記法

[…]プロパティを使用して、1つのインスタンスを使用して一連のインスタンスをグループ化する状況をモデル化することがあります。これは集約と呼ばれます。このような状況を表すために、プロパティにはAggregationKind型の集計プロパティがあります。グループ全体を表すインスタンスはプロパティの所有者によって分類され、グループ化された個人を表すインスタンスはプロパティのタイプによって分類されます。AggregationKindは、次のリテラル値を持つ列挙です。

  • none:プロパティに集計セマンティクスがないことを示します。
  • Shared:プロパティが集計セマンティクスを共有していることを示します。共有集約の正確なセマンティクスは、アプリケーション領域とモデラーによって異なります。
  • 複合:プロパティが複合的に集約されていることを示します。つまり、複合オブジェクトは、構成されたオブジェクトの存在と保存に責任を持ちます(11.2.3のパーツの定義を参照)。複合集計は、一度に1つの複合オブジェクトに含まれるパーツオブジェクトを必要とする強力な集計形式です。複合オブジェクトが削除されると、オブジェクトであるすべてのパーツインスタンスも一緒に削除されます。

[…]


0

Stackoverflowに既に回答を投稿しています

基本的に、集約は単純な関連付けよりも強力ですが、集約されたオブジェクトは、単純な関連付けの場合のように、お互いがなくても「生きている」ことができます。

集約されたクラスは他のクラスによって集約できないため、構成は集約よりもさらに強力です。その「寿命」はコンテナに依存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.