为啥关联、聚合和组合的使用方式与本例中的使用方式相同?

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】:

完全忘记共享/复合聚合。它确实具有低语义,并且只会导致徒劳的讨论是否需要它以及它在哪里使用正确或错误。只需使用(并解释)关联和多重性。

(几乎)唯一可以以有意义的方式使用聚合的地方是数据库外键(强制删除)和内存(释放未使用)管理。

【讨论】:

以上是关于为啥关联、聚合和组合的使用方式与本例中的使用方式相同?的主要内容,如果未能解决你的问题,请参考以下文章

OOP 中的 组合聚合和关联有什么区别?

UML类图关系(泛化、继承、实现、依赖、关联、聚合、组合)

UML-类图详解(依赖关联聚合组合泛化实现)

UML-类图详解(依赖关联聚合组合泛化实现)

如何使用字典对象从工作表中的重复标题中查找和组合数据

UML中的6大关系(关联依赖聚合组合泛化实现)