UML聚合与关联

UML聚合与关联,uml,associations,aggregation,Uml,Associations,Aggregation,我在这里,还有一个关于聚合和关联的问题。我想学习一些UML的基础知识,所以我开始阅读Martin Fowler的“UML蒸馏”。我读了两章关于类的内容,我认为有一件事我不能完全理解,那就是聚合与关联。书中有这样一句话: 在UML之前的日子里,人们通常对什么是聚合以及什么是聚合相当模糊 协会。不管含糊不清与否,他们总是与其他人不一致。因此, 许多建模者认为聚合很重要,尽管原因不同。所以UML 包含聚合(图5.3),但几乎没有任何语义。正如吉姆·伦堡所说,“想想看 作为建模安慰剂“[Rumbaugh

我在这里,还有一个关于聚合和关联的问题。我想学习一些UML的基础知识,所以我开始阅读Martin Fowler的“UML蒸馏”。我读了两章关于类的内容,我认为有一件事我不能完全理解,那就是聚合与关联。书中有这样一句话:

在UML之前的日子里,人们通常对什么是聚合以及什么是聚合相当模糊 协会。不管含糊不清与否,他们总是与其他人不一致。因此, 许多建模者认为聚合很重要,尽管原因不同。所以UML 包含聚合(图5.3),但几乎没有任何语义。正如吉姆·伦堡所说,“想想看 作为建模安慰剂“[Rumbaugh,UML参考]

根据我在Stack Overflow上读到的这段引文和主题的理解,我使用这两个关系中的哪一个并不重要,它们的意思基本相同,或者是否存在使用聚合而不是关联的合理情况和/或我无法在不更改“含义”的情况下将一个更改为另一个类图的定义


我问这个问题,因为这本书是2003年出版的,在这几年里有些事情可能已经改变了。

也许这可以帮助你,但我认为你不会找到完美的解释:

区别在于它的含意。聚合表示全部/部分 关系,而联想则不然。然而,没有 这两种关系可能有很大的不同 执行。也就是说,查看代码将非常困难 并确定某一特定关系是否应该 聚合或联合。出于这个原因,使用它是相当安全的 完全忽略聚合关系
[Robert C.Martin | UML]

以及每种情况的示例:

a) 关联是一种关系,其中所有对象都有自己的关联 生命周期,并且没有所有者。让我们以教师和学生为例 学生。多个学生可以与一位教师和 一个学生可以与多个老师交往,但没有 对象之间的所有权以及两者都有自己的生命周期。二者都 可以独立创建和删除

b) 聚合是一种特殊的关联形式,其中所有对象都有自己的生命周期,但有所有权和子对象 对象不能属于另一个父对象。让我们举个例子 系主任和老师。一个老师不可能属于任何一个人 多个部门,但如果删除该部门,教师对象 不会被摧毁。我们可以考虑“has-a”关系。
[Maesh|GeeksWithBlogs]


伦堡的陈述是最有说服力的,也是鲍勃叔叔的好建议。正如我所说,聚合在语义上非常弱,无法提供任何实际有益的东西。它只有一个有效的角落案例(递归关系的非循环性),但是很少有人知道和理解这一点。所以你最终不得不在评论中指出

我就是不用它。从未感到任何损失。坚持简单的二进制关联,关注真正重要的事情——获得基数和正确的命名。你将从中得到比试图决定不可判定的关联与聚合更多的东西


hth.

在UML聚合中定义不足,因为它们没有任何明确定义的语义。 聚合的一个有效用例是封装几个类,如Eric Evans在“域驱动设计”中所述

汽车有四个轮子。 您可能需要计算每辆车每个车轮驱动的总米数。 这个计算是由汽车实体完成的,因为它知道它有哪些车轮,而不关心哪些车轮属于哪辆汽车

汽车是其所有部件(如车轮)的聚合根,您不能从聚合外部访问汽车部件,只能访问根


因此,聚合基本上封装了一组相互属于的类。

我倾向于使用聚合来显示与组合相同的关系,但有一个很大的区别:包含的类不负责包含对象的生命周期。通常,指向要包含的对象的(非null)指针或引用会传递给包含类的构造函数。包含对象在其生命周期内取决于所包含的对象的存在。没有包含的对象,包含的对象无法(完全)执行其工作。这是我对聚合所隐含的“部分/整体”关系的解释。

它们的意思不一样!我可以这样说:

关联关系:一个类引用另一个类。实际上,它表明一个类与另一个类相关,但它们 不一定具有显示此关系的属性。。。例如 “教师”和“学生”班,尽管“教师”班没有 指学生的属性,但我们知道在现实中 老师确实有学生。。。“学校”班也有“老师”和“老师” “学生”属性使这两个类相互关联 其他的

聚合关系:一个类包含另一个类。但是,如果容器(教室)被破坏,则所包含的(椅子)不会被破坏。 实际上,教室拥有这把椅子。聚合是一种更强大的方法 关系比联想关系好

这里还有一个关于它和整个UML2.0的教程,它简单明了地解释了一切,您可能会发现它很有用:


提示:还让我提一下,因为大多数时候类之间都存在关联关系,所以我们有时不绘制关联关系以防止不必要的复杂性。

从实现角度看,没有太大的差异,但在概念上有很大的差异