我在这里,关于聚合和关联的另一个问题。我想学习一些UML的基础知识,所以我开始阅读Martin Fowler撰写的“UML精简版”。我阅读了关于课程的两章,有一件事我想不到,那就是聚合与关联。在这本书中有这样的引用:
在UML之前的日子里,人们通常对什么是聚合以及什么是相当模糊 协会。无论是否含糊,它们总是与其他人不一致。结果是, 尽管出于不同的原因,许多建模者认为聚合很重要。所以UML 包括聚合(图5.3),但几乎没有任何语义。正如Jim Rumbaugh所说,“想一想 作为建模安慰剂“ [Rumbaugh,UML参考]。
根据我在Stack Overflow上阅读的这个引用和主题我理解,我使用这两个关系中的哪一个并不重要,它们的意思基本相同,或者是否存在使用聚合而不是关联的情况在不改变类图的“含义”的情况下,我是否可以合理地和/或不能改变一个?
我问这个问题,因为这本书是从2003年开始的,有些事情可能会在这几年内发生变化。
答案 0 :(得分:29)
也许这可以帮助你,但我认为你不会找到完美的解释:
差异是暗示之一。聚合表示整体/部分 关系,而协会却没有。但是,没有 这两种关系的方式可能差别很大 实现。也就是说,查看代码非常困难 并确定是否应该有特定的关系 聚合或关联。出于这个原因,这是非常安全的 完全忽略聚合关系。
[罗伯特C.马丁| UML]
每种情况都有一个例子:
a)关联是一种所有对象都有自己的关系 生命周期并没有所有者。让我们举一个老师和教师的例子 学生。多名学生可以与一名教师联系 单身学生可以与多位教师联系,但没有 对象之间的所有权和两者都有自己的生命周期。都 可以独立创建和删除。
b)聚合是一种特殊的关联形式,其中所有对象都有自己的生命周期,但有所有权和子女 对象不能属于另一个父对象。我们来举个例子吧 部门和老师。一个老师不能属于 多个部门,但如果我们删除部门,教师对象 不会被破坏。我们可以考虑“有一个”的关系。
[Maesh | GeeksWithBlogs]
答案 1 :(得分:26)
我只是不使用它。并且从未感到任何损失。坚持简单的二元关联,专注于真正重要的事情 - 获得基数和命名权。你会从中获得更多,而不是试图决定不可判断的关联与聚合。
第h
答案 2 :(得分:3)
我倾向于使用聚合来显示与组合相同的关系,但有一个很大的区别:包含类不负责所包含对象的生命周期。通常,(非空)指针或对要包含的对象的引用将传递给包含类的构造函数。包含对象在其生命周期的持续时间内取决于所存在的包含对象。如果没有包含对象,则包含对象无法完全完成其工作。这是我对聚合所隐含的“部分/整体”关系的解释。
答案 3 :(得分:0)
在UML聚合中定义不明确,因为它们没有任何明确定义的语义。 聚合的有效用例是几个类的封装,如Eric Evans的“Domain Driven Design”中所述。
E.g。一辆车有四个轮子。 您可能想要为每辆车计算每个车轮驱动的总计米数。 这个计算是由汽车实体完成的,因为它知道它有哪些车轮而你不关心哪个车轮属于哪辆车。
汽车是所有部件的聚合根,如轮子,你不能从聚合外部,只是根部访问汽车的各个部分。
所以基本上聚合封装了一组彼此属于的类。
答案 4 :(得分:0)
实施方面没有太大区别,但从概念上讲,存在很大差异:聚合用于表达层次结构。使用组件层次结构时,您需要在根接口中具有某种类型的操作:
处理关联时,大多数操作都不需要。
答案 5 :(得分:0)
这个词常常会混淆。
聚合和组合是一些关联类型。有 几乎没有聚合和关联之间的差异 实现,许多人将完全跳过聚合关系 他们的图表与关联关系。
你可以从这个比喻中得到这个想法。
班级:A(人)和班级:B(汽车)具有关联关系,如果 类:A 具有 Class:B 声明,并且 Class:B(car)对象不是必需的创建类:A(人)对象。
类:A(汽车)和类:B(轮胎)具有聚合关系,如果 类:A 具有 Class:B 声明,并且 Class:B(轮胎)对象必需到创建类:A(汽车)对象。
干杯!
答案 6 :(得分:0)
要添加,我建议从OMG网站下载UML规范:最佳参考,请参阅第110页。
none表示该属性没有聚合语义。
shared表示该属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。
composite表示属性是复合聚合的,即复合对象有责任 组合对象的存在和存储(参见11.2.3中部分的定义)。
答案 7 :(得分:-1)
他们的意思并不相同!我可以这样说:
关联关系:一个类引用另一个类。实际上它表明一个类与另一个类相关但它们 没有必要具有显示这种关系的属性......例如 '教师'和#39;学生'课程,虽然'老师'上课没有 引用学生的属性,但我们知道实际上是一个 老师确实有学生......还有学校'班上有老师'和 '生'现在使这两个类与每个类相关的属性 其他
聚合关系:一个类包含另一个类。但是如果容器(ClassRoom)被销毁,则包含的(Chair)不是。 实际上ClassRoom拥有主席。聚合更强大 关系比关系关系。
这里还有一个关于它和整个UML2.0的教程,它解释了一切简单易用,你会发现它很有用:https://github.com/imalitavakoli/learn-uml2
提示:另外请允许我提一下,因为关联关系大部分时间都存在于类之间,我们有时不会绘制它以防止不必要的复杂性。