为啥关联、聚合和组合的使用方式与本例中的使用方式相同?
Posted
技术标签:
【中文标题】为啥关联、聚合和组合的使用方式与本例中的使用方式相同?【英文标题】:Why are association, aggregation and composition used the way they are used in this example?为什么关联、聚合和组合的使用方式与本例中的使用方式相同? 【发布时间】:2017-03-01 16:34:23 【问题描述】:我了解这三者之间的区别(或者至少我认为我了解)。我知道还有很多其他类似的问题,其定义类似于 one。
我正在寻找来自gliffy.com 的示例,并且我正在努力理解为什么使用它们的方式来使用某些关系。我想我真正苦苦挣扎的是了解何时使用关联。
我的一些问题是:
-
为什么 Customer-Order 和 Customer-Credit Card 是关联而不是像 Customer-Address 这样的聚合?
既然没有 Order 就不会存在 ItemOrder,为什么 Order-ItemOrder 不是组合?
为什么 ItemOrder-Item 不是聚合?
【问题讨论】:
【参考方案1】:为了回答这些问题,重要的是要知道为什么要绘制这个类图。只有作者知道,但也许这只是对gliffy能力的展示?否则,此模型中的类可能对应于源代码中的类,这些类是用 Java 或 C# 等面向对象语言编写的,并且该图旨在深入了解这些类之间的关系。
为什么 Customer-Order 和 Customer-Credit Card 是关联而不是像 Customer-Address 这样的聚合?
显然,作者并不认为这些关系是“一部分”关系。也许 Customer 在源代码中没有任何对 Orders 或 CreditCards 的引用。可能地址信息属于 Customer 类的职责,但 Order 和 Credit Card 信息不属于。
既然没有 Order 就不会存在 ItemOrder,为什么 Order-ItemOrder 不是组合?
也许作者只使用了 UML 的一个子集,并没有按照惯例使用组合。也许作者认为聚合和组合之间的区别对于这张图来说并不重要。
为什么 ItemOrder-Item 不是聚合?
显然,作者并不认为这种关系是关系的一部分。也许作者保留了关系的聚合类型来表示一种特定的编程语言结构,在这种情况下,源代码中没有使用这种结构。也许作者认为一个接口永远不能聚合到另一个类中。
顺便说一下,ItemOrder 和 ShoppingCart 之间的聚合显然是错误的。我认为钻石应该在关系的另一边。
【讨论】:
【参考方案2】:完全忘记共享/复合聚合。它确实具有低语义,并且只会导致徒劳的讨论是否需要它以及它在哪里使用正确或错误。只需使用(并解释)关联和多重性。
(几乎)唯一可以以有意义的方式使用聚合的地方是数据库外键(强制删除)和内存(释放未使用)管理。
【讨论】:
以上是关于为啥关联、聚合和组合的使用方式与本例中的使用方式相同?的主要内容,如果未能解决你的问题,请参考以下文章