2010-10-31 52 views
2

我有以下關係:多對多關係可以成爲聚合嗎? [簡單的問題]


路線* ------ * RouteLeg


我想使這是一個聚集,因爲路由是由由多個RouteLegs。

但是,如果我刪除一個路由,它的RouteLegs也不一定會被刪除(儘管大多數情況下它們會),因爲它們可能用於其他路由。

將此關係顯示爲聚合是否合適?

像這樣:


路線* <> ---- * RouteLeg


我有這樣的疑問,由於事實,吉姆·阿洛在其「UML 2和統一過程:實用面向對象分析與設計「書中,沒有看到多對多的關係作爲一個聚合,但它對我來說很有意義...

任何人都有證據表明可能有多對多的聚合? 非常感謝。

回答

3

Arlow不說,一個多一對多的關係不能是聚合,畢竟。事實上,他給出了這樣一個例子:


產品* <> ---- *產品


奇怪我怎麼沒注意到它的第一次...謝謝答覆。

問題解決。

0

這是一個關聯,因爲對於多對多關係來說聚合確實沒有意義。在一個聚合中,通常一方有零個或多個另一方,而另一方只屬於一個聚合。除了RouteLeg可能屬於至少一條路線之外,您有多對多的關係,雙方都不能真正控制其他關係。但是,由於RouteLeg可能會被多條路線共享,因此它可能不屬於任何單條路線,也可能不受任何單條路線的控制。我想說你應該堅持一個關聯,因爲它是指定的兩種類型之間的正確「連接」。

2

正如Arlow所說,多對多不太適合聚合。聚合表示部分 - 整體關係。它由一個「有一個」動詞來表達。因此,將多對多關係建模爲聚合引入了錯誤的設計。

解決方案取決於您的設計決策。我認爲Route-RouteLeg關係更像是一對多的關係。一條路線「有」一條(或多條)RouteLegs,但RouteLeg似乎不適合多條路線,我的意思是設計明智,而不是明智的編程。

〔路線(1)<> ----(1 .. *)[RouteLeg]

否則,可以選擇去耦它只是一個關聯

〔路線](0 .. *)----(1 .. *)[RouteLeg]

0

聚合關係比關聯關係強,但弱於構圖。在構圖中,整體和零件對象的使用期限是相關聯的(如果刪除整體,您也應該刪除這些零件),但聚合中不一定是這種情況。

因此,理論上你可以使用一個聚集來表示您的方案

+0

這就是我所想的。但是,爲什麼人們認爲多對多永遠不應該是一個聚合......肯定有一個原因...... – 2010-11-01 11:39:29

+0

這個問題一直圍繞着「更強」的意思。你如何定義它?聚合直接關聯的唯一具體屬性是它們不允許循環圖。例如:採用遞歸關係的'Part',允許每個'Part'由許多其他組成。聚集可以防止一部分直接或間接地包含其本身。我玩過的唯一其他用途是表示聚合根(在域驅動設計意義上)。仍然未定;否則我不使用Aggregate,只是直接關聯和組合。 – sfinnie 2010-11-01 13:21:53

+0

您的「零件由零件組成」示例正是Arlow給出的示例。我沒有第一次注意到它。 – 2010-11-01 19:33:19