UML表示法 - 聚合/组合与“香草”关联

时间:2009-07-16 15:00:14

标签: uml associations aggregation composition

我最近花了很多时间来执行我编写的各种SW组件的详细UML设计。回顾一下我最近完成的事情,并将其与我第一次学习UML时的情况进行比较,我发现我现在几乎严格使用聚合和组合关系,并且实际上已经放弃了“香草”非定向/定向关系。我当然仍然使用泛化和实现,但这些与上面的明显不同,并且不被视为此问题的一部分。

在我看来,聚合/组合意味着“香草”联想的含义相同,等等。聚合和组合自然意味着一个方向,任何现代UML程序仍然允许您在聚合/组合关系上定义多重性并将动词应用于关系。那时,我认为香草协会的目的不大。

据我所知,有些人很难理解聚合和组合之间的区别。在早期,我有点难以理解他们的差异,我相信混淆是我使用香草协会的部分原因。我现在处于这样的地步,我看到很少或没有使用香草协会,并且实际上不喜欢看到它们被使用,因为我相信它们会留下一些问题(特别是两个对象之间强大或弱的生命周期关系)。我相信香草协会唯一的实际用途是当你对手头问题的理解还没有发展到足以确定聚合和组合之间的生命周期差异时。在这种情况下,最好至少 show 表明关系存在,然后当您更好地理解手头的问题时,您可以回来并适当地改变它。

长话短说,我相信人们使用香草协会的绝大多数时间,他们可以更准确地描述为聚合,有时作为一个组合。在我的信念中,我是非常错的吗?我错过了什么吗?让我听听!

5 个答案:

答案 0 :(得分:2)

事实上,UML类模型中的大多数关联案例既不是聚合也不是组合。例如,用于将发布者发布的图书分配给此发布者的类PublisherBook之间的关联既不是聚合也不是合成,因为发布者发布的图书不是其中的部分或组成部分。这个出版商。

A model of the association between Publisher and Book

聚合是与部分 - 整体关系的预期含义相关联的一种特殊形式,但没有精确的语义(UML规范说:"共享聚合的精确语义因应用领域和建模者而异#&# 34)。例如,我们可以对类CarEngine之间以及类CourseLecture之间的聚合建模,因为引擎是汽车的一部分而讲座是一部分课程。

组合(也称为"复合聚合"在UML规范中)是一种特殊形式的聚合,其中组件实例一次只能是一个聚合实例的一部分(也就是说,它不能在几个聚合之间共享)。这意味着CarEngine之间的聚合是一个组合(因为引擎不能同时在两个汽车之间共享),而Course和{{1}之间的聚合由于讲座可以在两门课程之间共享(例如,数据库管理课程和软件工程课程可以共享UML讲座),因此不一定是作文。这意味着在聚合侧的组合关联结束的多重性是1或0..1,而在非复合聚合的情况下它也可以是*。

除了组合的这些主要特征(具有独占部分)之外,组合还可能在聚合体及其组件之间具有生命周期依赖性,这意味着当删除聚合时,其所有部分都将被删除用它。然而,这仅适用于某些组合情况,而不适用于其他情况,因此它不是一个定义特征。 UML规范指出:"在复合实例被删除之前,可以从复合实例中删除部分,因此不会将其作为复合实例的一部分删除。"在我们的汽车发动机组合示例中,显然情况是汽车在汽车被摧毁之前可以从汽车中取出,在这种情况下发动机不会被破坏并且可以重复使用。

答案 1 :(得分:1)

在类图上,您正在考虑类之间的静态关系。你可能不需要在类图上考虑这些关系的行为方面,它只是混淆了水域并且是过度分析的证据。 (当然是恕我直言)

答案 2 :(得分:1)

当你说,'香草协会'时,你只是实际使用的是当你对手头问题的理解尚未发展到足以确定生命周期差异和< em>表明这种关系存在,然后你可以在你更好地理解手头的问题时回来并适当地改变它。

UML Meta-Model将聚合和组合定义为关联的扩展。可以将关联视为域对象之间的未定义关系,与Domain对象是未定义的类的方式相同。我通常在域建模阶段使用简单关联,并在解析详细的类模型时将其细化为合成或聚合。

答案 3 :(得分:1)

Vanilla Associations,Aggregration和Compositions有时用以下语义解释:

  • 香草协会:一个对象'知道'一个或多个其他对象
  • 聚合:一个对象'拥有'一个或多个其他对象
  • 组成:一个对象'由'一个或多个其他对象组成 - 子对象不能没有组合容器

主要是聚合和组合的差异围绕着“如果主对象消失了 - 部件对象会发生什么?”的问题。

因此,我们的想法是使用三个选项中的一个来区分“删除级联”之类的完整性约束。 UML有三个不同的符号用于此

  • 没有符号 - 香草协会
  • 钻石 - 聚合
  • 填充钻石 - 成分

这三个选项的问题在于语义对于现实生活情况来说不够精确,特别是如果你看一下随时间变化的情况

E.g。试着回答一个简单的问题“我的车有多少轮胎?” 会得出不同的答案:

  • 4个车轮,永久地连接在我的车上
  • 我可能在紧急情况下使用的1个备用轮胎
  • 4个轮子,无论是我的夏天还是我的冬季轮子,并且在其他季节没有附着在汽车上

当汽车消失时,这些车轮中有多少会消失? 如果你尝试使用UML提供的三个符号来模拟这种情况,你最终会得到很多讨论和协商,你的模型真正意味着什么。我认为永远不要使用aggegation和组合符号,而是始终将关联语义描述为 尽可能用几行文字。通过这种方式,您可以向阅读模型的人清楚地了解您真正想要的内容。 我认为它甚至是o.k.写道“汽车是包含车轮的零件组成......”

但是现在你没有使用合成符号,而是真正引用了作曲的行为。

另见 http://de.wikipedia.org/wiki/Assoziation_%28UML%29#Aggregation_und_Komposition(德语)

答案 4 :(得分:0)

聚合和组合都意味着关系的参与者“支配”另一个(在组合中,支配地位更强),而正常的关联没有这个含义。因此,当两个参与者在关系中具有相同的重要性时,我使用正常关联