2011-08-25 5 views
6

私は知っている変換、アグリゲーションとコンポジションの変換のための反駁のさまざまな方法があります。しかし、それらをコード(Javaクラス)に変換するとき、それらはすべて同じように表されます。同様に、関連する教師によって教えられた生徒は、クラス教師のインスタンス変数を持つ生徒クラスで表されます。アソシエーション、アグリゲーション、およびコンポジションをJavaのコードに変換しますか?

部門には、クラス教授のインスタンス変数(配列)を持つDepartmentクラスで表すこともできます。

大学には構成科目もクラス部門のインスタンス変数(配列)を持つ大学クラスで表現されます。

したがって、すべての点で同じようにコードの表現が行われます。アソシエーション、アグリゲーション、コンポジションという用語がデベロッパーに提供するメリットは何ですか?

答えて

4

あなたは作文でストーリーの一部を欠いています。これは、余分な性質のカップルを義務付け:子供のための親の

  • 不変性(すなわち、子が親を切り替えることはできません)
  • ライフサイクル責任は親にあります。すなわち、親は子インスタンスの作成および削除を担当する。親が死亡した後、子供は生きていけません。

お子様の連絡先は、お子様&の親の参照/コレクションとしてそれぞれ明示されます。しかし、コードは、Compositionのセマンティクスが確実に実施されるようにするには、上記の規則を強制しなければなりません。

集計については:私はそれを使用しません。セマンティクスはあまりにも緩く、まっすぐな関連よりも利点がありません。

hth。

+0

申し訳ありませんsfinnie私は両方のポイントを逃した。 Point1: - 元の投稿の構成例を考えてみると、大学のクラスにはクラスdepartmentのインスタンス変数(配列)がfinalとしてあるはずですか?コードで表現する方法ではありません。 Point2:はい私はあなたの意見に同意しますが、umlダイアグラムを単純なインスタンス変数にするため、コーディングに変換するときに違いはありません。 –

+0

ポイント1:はい。ポイント2:それは参照だけではない。 UML複合セマンティクスでは、「コンポジットが削除された場合、そのパーツはすべて通常それとともに削除されます」(UMLスーパー2.3、40ページ)が必要です。 C++のような非GC言語では、これは、デストラクタコードが、親が削除される前にすべての子が削除されることを保証する必要があることを意味します。 GC環境では、これはあまり明白ではありません。しかし、Domain Driven Designによって普及している "Aggregate Root"アプローチのようなイディオムがあります。これは、子を作成(または削除)する唯一の方法は、親自体のメソッドを経由する方法です(ctd)。 – sfinnie

+0

...プロトタイプのOrder/OrderLineシナリオでは、OrderからOrderLineを追加する唯一の方法は、Order.AddOrderLine()(同様に削除用)を呼び出すことです。要約すると、コンポジットを表すコード内に直接的な、宣言的なアナログはありません。その代わりに手続き的にビヘイビアを構築する必要があります。コード内の複合物を特定するには、ある程度の量の「パターン認識」が必要です。参照が最終的で、子を作成/削除する唯一の方法が親のインターフェースを経由する場合、関係はCompositeの可能性が高いです。 hth。 – sfinnie

関連する問題