web-dev-qa-db-ja.com

集約vs構成vs関連付けvs直接関連付け

オブジェクト指向プログラミングの知識を確認しています。クラス間の関係のトピックの下で、私には少しあいまいな関係に遭遇しました。

依存関係「uses-a」と継承「is-a」は知っていますが、集計、構成、関連付け、直接関連付けには少し慣れていません。また、そのうちのどれが「has-a」関係です。いくつかは、アソシエーションと交換可能に集約を使用します。

直接関連付けとは何ですか?また、コンポジションとは何ですか? UMLダイアグラムでは、それらを表す矢印は異なります。あなたが私のためにこれらのことを片付けてくれたら本当にありがたいです。

43
steven0529

「関連付け」の定義にはさまざまな解釈があることに注意してください。以下の私の見解は、Oracle認定書および学習ガイドで読む内容に大きく基づいています。

一時的な関連付け

使用法メソッド内、その署名または戻り値として。実際には特定のオブジェクトへの参照ではありません。

例:車をガレージに駐車します

Temporary Association UML

作曲協会

いわゆる "STRONG関係":リンクされたオブジェクトのインスタンス化は、多くの場合、オブジェクトのコンストラクター内でハードコーディングされます。オブジェクトの外部から設定することはできません。 (構成できないは多対多の関係になります。)

例:家は石で構成されています。

Composition UML

直接関連付け

これは「WEAK関係」です。オブジェクトは独立して生きることができ、通常は依存オブジェクトを注入するセッターまたは他の方法があります。

例:車には乗客を乗せることができます。

Direct Association UML

集約の関連付け

直接関連付けに非常に似ています。また、独立したオブジェクトとの「WEAK関係」です。ただし、ここでは、関連付けられたオブジェクトは包含オブジェクトの重要な部分です。

例:車にはタイヤが必要です。

Aggregation UML

注:多くの場合、直接アソシエーションと集約アソシエーションは両方とも「アソシエーション」として一般化されます。違いはかなり微妙です

107
bvdb

OOPの全体的なポイントは、コードが実世界のオブジェクトを複製し、コードを読みやすく保守しやすくすることです。

1。関連付け

関連付け:クラスAはクラスBを使用します。

例:

  • 従業員は、輸送にバス/列車サービスを使用します。
  • コンピューターはキーボードを入力デバイスとして使用します

また、UML図では、関連付けは通常の矢印で示されます。

2。集計

クラスAにクラスBが含まれているか、クラスAにクラスBのインスタンスがあります。

オブジェクトの寿命がコンテナオブジェクトから独立している場合、集計が使用されます。しかし、依然としてコンテナオブジェクトが集約オブジェクトを所有しています。

したがって、クラスAを削除しても、クラスBも削除されるわけではありません。例えば。教師は1人または複数の学部に所属することはできません。

教師と学科の関係は集約です。

。構成

クラスAはクラスBを所有します。

例えば。体は腕、頭、足で構成されています。 BankAccountはBalanceとTransactionHistoryで構成されています。

クラスAが削除されると、クラスBも削除されます。

11
user 451

直接関連付けには、他の3つとの共通点はありません。これは、UMLにはまったく属していません。これは、 IBM要件モデリング用語 です。

その他については、

Association A-> Bは、Dependencyの子です。関連付けとは、A(またはそのインスタンス)がBのインスタンスに到達する簡単な方法を持っていることを意味します。たとえば、a.x.y.b。または、関数ごと、またはローカル変数ごと。または、直接参照またはポインター、または他のもの(世界には多くの言語があります)。ご覧のとおり、依存関係と関連付けの間に厳密な境界線はありません。

Associationの属性の1つはAggregationであり、None、shared(しばしば誤って集約と呼ばれる)、および構成の値を持つことができます。

A(またはインスタンス)がBのインスタンス(または1つ)を持っている場合、アソシエーションの破壊はBインスタンスの破壊を意味し、それは合成です。

あなたまたはツールの作成者が、構成が弱い関係を特別に示す必要があると判断した場合は、shared集計を使用できます。通常、AのBへの参照のコレクションです。

アソシエーションには、さらに興味深い属性がいくつかあります。興味があるなら here を見てください。

6
Gangnus

オブジェクトタイプ間の関連付けは、それらのタイプのオブジェクト間の関係を分類します。たとえば、タイプPersonのタイプPeterMiller、SusanSmith、SarahAndersonのオブジェクト間の関係を、変数Enterprise- isEmployedBy -Personは、PeterMiller-isEmployedBy-IBM、SusanSmith-isEmployedBy-IBM、SarahAnderson-isEmployedBy-Googleの関係を分類できます。 Enterprise。つまり、関連付けは、複数のオブジェクトタイプが関係している関係タイプです。 2つのオブジェクトタイプ間の関連付けは、バイナリと呼ばれます。バイナリの関連付けはより一般的ですが、nの関連付けも処理する必要があります。nは2より大きい自然数です。たとえば、Person- isTreatedIn -Hospital- for -Diseaseは3進数(「3進数」) )オブジェクトタイプPersonHospital、およびDisease間の関連付け。

「直接関連付け」とは、方向(または指示)関連付けを意味すると思います。これは、ドメインクラスの参照プロパティを表す(ドメインクラスと範囲クラスとの)関連付けです。このような方向の関連付けには、ターゲットの端に「所有権ドット」があります。

関連付けの詳細については、 この本の章 を参照してください。

集計と構成の説明については、 this SO question への私の答えを参照してください。

4
Gerd Wagner