UML循环引用,包含聚合和组合

时间:2016-03-06 12:12:38

标签: uml aggregation circular-reference

几天前,一位朋友向我指出,我对UML中的构图有错误的想法。她是完全正确的,所以我决定找出我可能犯的错误。现在,我还有一件事需要怀疑:我在代码库中有一个循环依赖,我希望以UML形式呈现。但是如何。

在我的情况下,以下情况属实:

  • A和B都有一个C
  • 列表
  • C引用A和B来获取信息。
  • 如果A或B停止存在,则
  • C不存在
  • 从A和/或B
  • 中删除C后,A和B仍然存在

为了对此进行建模,我已经提出了以下UML(我现在已经忽略了多重性,为了不占用图表。)

enter image description here

我的问题是,这是建立这种关系的正确方法吗?

2 个答案:

答案 0 :(得分:3)

<强>问题

要牢记的一些事实:

  • 默认多重性会使您的模型无效。一个类只能在一个其他类中组成。当你没有指定多重性时,你得到[1..1]。这个默认值很难过,但确实如此。
  • UML规范没有定义开放钻石聚合的含义。
  • 您的模型有许多重复的属性。属性隔离专区中不需要任何属性,因为在每个关联的末尾都有未命名的属性。

<强>更正

以下是您的模型的重新设计,以使其更正确:

enter image description here

请注意以下事项:

  • 关联之间的排他或约束意味着一次只能存在其中一个关联。
  • 不幸的是,多重性允许C的实例存在,而不是由AB组成。 (参见下面的返工模型。)
  • 所有关联末尾的属性名称明确指出模型中未命名的内容。 (我还尝试在属性名称中指明目的。)
  • 导航箭头可防止多个不需要的属性,而无需使用重复属性。

推荐设计

如果我正确理解了你的模型意味着什么,我可能会将实现转化为设计:

enter image description here

请注意以下事项:

  • D是抽象的(类名以斜体显示),这意味着它没有直接实例。
  • 概括集说:

    • 实例不能按AB进行多重分类。 (即,AB是{disjoint}。)
    • D 的实例必须是其中一个子类的实例。 (即AB {完全},称为covering axiom。)
  • 子类继承类ownedC中的D属性。
  • 撰写类现在可以具有[1..1]的多重性,不再允许C的实例存在,而不是由AB组成

答案 1 :(得分:1)

将露天钻石留下并使它们成为正常的关联。这些不是共享聚合,而是简单的关联。复合聚合没问题。

一般来说,显示聚合的附加值并不大。语义附加值非常低。在过去,这是一个很好的提示,可以帮助垃圾收集处理不需要的对象。但是现在几乎所有目标语言都内置了高效的垃圾收集器。只有在您希望显式删除聚合对象的情况下,才应使用复合聚合。