UML表示法-聚合/组合vs“;香草;联想

UML表示法-聚合/组合vs“;香草;联想,uml,associations,aggregation,composition,Uml,Associations,Aggregation,Composition,我最近花了大量时间对我所写的各种软件组件进行详细的UML设计。回顾我最近完成的工作,并将其与我第一次学习UML时进行比较,我发现我现在几乎严格使用聚合和组合关系,实际上已经放弃了“普通的”非定向/定向关系。当然,我仍然使用概括和实现,但它们与上面的明显不同,不被认为是这个问题的一部分 在我看来,聚合/组合意味着“香草”关联的相同含义,等等。聚合和组合自然意味着一个方向,任何现代UML程序都允许您在聚合/组合关系上定义多样性,并对该关系应用动词。在这一点上,我认为香草协会没有什么意义 我知道有些人

我最近花了大量时间对我所写的各种软件组件进行详细的UML设计。回顾我最近完成的工作,并将其与我第一次学习UML时进行比较,我发现我现在几乎严格使用聚合和组合关系,实际上已经放弃了“普通的”非定向/定向关系。当然,我仍然使用概括和实现,但它们与上面的明显不同,不被认为是这个问题的一部分

在我看来,聚合/组合意味着“香草”关联的相同含义,等等。聚合和组合自然意味着一个方向,任何现代UML程序都允许您在聚合/组合关系上定义多样性,并对该关系应用动词。在这一点上,我认为香草协会没有什么意义

我知道有些人很难理解聚合和合成之间的区别。早些时候,我有点难以理解它们之间的区别,我相信困惑是我使用香草联想的部分原因。我现在几乎看不到或根本看不到普通关联的用处,实际上我不喜欢看到它们被使用,因为我相信它们会留下一些问题(特别是两个对象之间的强或弱生命周期关系)。我相信香草协会的唯一实际用途是当你对手头问题的理解还不足以确定聚合和组合之间的生命周期差异时。在这种情况下,最好至少表明这种关系是存在的,当你更好地理解手头的问题时,你可以回来适当地改变它


长话短说,我相信绝大多数时候人们使用香草联想,它们可以更准确地描述为一种聚合,有时是一种组合。我的信仰大错特错了吗?我错过什么了吗?让我听听

聚合和组合都意味着关系中的一个参与者“支配”了另一个参与者(在组合中,支配性更强),而正常的关联没有这种含义。因此,当两个参与者在关系中具有相同的重要性时,我使用正常关联。在类图上,您考虑的是类之间的静态关系。你可能真的不需要在类图上考虑这些关系的行为方面,它只是搅乱了局面,是过度分析的证据。(当然是这样)

你说:,“普通关联”的唯一实际用途是,当你对手头问题的理解还没有发展到足以确定生命周期差异并表明这种关系存在时,你可以在对手头问题有了更好的理解后回来适当地改变它


将聚合和组合定义为关联的扩展。关联可以被视为域对象之间未定义的关系,就像域对象是未定义的类一样。我通常在领域建模阶段使用简单的关联,并在解析详细的类模型时将其细化为组合或聚合(视情况而定)。

事实上,UML类模型中的大多数关联既不是聚合也不是组合。例如,类
Publisher
Book
之间的关联(用于将出版商出版的书籍分配给该出版商)既不是聚合,也不是合成,因为出版商出版的书籍不是该出版商的组成部分

聚合是一种特殊形式的关联,与部分-整体关系的预期含义相关,但没有精确的语义(UML规范说:“共享聚合的精确语义因应用程序区域和建模者而异”)。例如,我们可以在类
汽车
发动机
之间以及类
课程
讲座
之间建立聚合模型,因为发动机是汽车的一部分,讲座是课程的一部分

组合(在UML规范中也称为“复合聚合”)是一种特殊的聚合形式,其中组件实例一次最多是一个聚合实例的一部分(也就是说,它不能在多个聚合之间共享)。这意味着
汽车
发动机
之间的聚合是一个组合(因为发动机不能同时在两辆汽车之间共享),而
课程
讲座
之间的聚合不一定是一个组合,因为讲座可以在两门课程之间共享(例如,数据库管理课程和软件工程课程可以共享一堂关于UML的讲座)。这意味着聚合端的组合关联端的多样性为1或0..1,而在非组合聚合的情况下,也可能为*

除此之外,构成的主要特征(具有专有部分),合成也可能在聚合及其组件之间具有生命周期依赖关系,这意味着当一个聚合被删除时,它的所有部分都会随之删除。然而,这只适用于某些合成情况,而不适用于其他情况,因此它不是一个定义特征。UML规范规定:“在删除复合实例之前,可以从复合实例中删除一个零件,因此不能将其作为复合实例的一部分删除。”在我们的汽车发动机组成示例中,很明显,发动机可以在汽车损坏之前从汽车中拆下,在这种情况下,发动机不是dest