【发布时间】:2022-01-15 19:56:55
【问题描述】:
总之
共享聚合似乎只是表达一种简单的关联。它显然是一种“建模安慰剂”,没有使用它的客观理由(除非在建模者之间就特定的附加语义达成一致的特定情况下)。
然而,一些消息来源声称共享聚合意味着实例的聚合图中没有循环。这将使聚合成为图形建模领域的强大工具。
但我在规范中找不到任何证据证明这些说法。我是否遗漏了一些间接证据(例如多个约束的相互作用)?
更多详情
报价
在他们的书统一建模语言参考手册,第 2 版中,Booch、Jacobson 和 Rumbaugh 声称(共享)聚合:
聚合和关联之间的区别通常是品味问题,而不是语义上的差异。请记住,聚合是关联。聚合传达了这样一种思想,即聚合本质上是其部分的总和。事实上,它添加到关联中的唯一真正语义是聚合链接链可能不会形成循环的约束,但了解这一点通常很重要。 (...) 尽管聚合附带的语义很少,但每个人都认为它是必要的(出于不同的原因)。将其视为建模安慰剂。
其他消息灵通的来源(例如uml-diagrams.org 和几篇学术论文)也认为有向无环图是理所当然的。
根据 UML 规范验证
这些书籍来自 2004 年,基于 UML 2.0。但这种说法的大部分内容仍然在 UML 2.5.1 规范中得到验证。共享聚合在其中以非常模糊的术语定义,与简单关联相比没有任何客观优势(第 112 页):
有时,Property 用于对使用一个实例将一组实例组合在一起的情况进行建模;这称为聚合。为了表示这种情况,Property 具有 AggregationKind 类型的聚合属性; (...)
...
分享: 表示该属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。
另一个关于聚合的子句防止一些特殊的循环情况(p.200):
如果关联是二进制的并且另一端未标记为共享或复合聚合,则关联的一端属性只能标记为共享或复合聚合。
然而,在一般情况下,我没有发现任何证据表明“聚合链接链可能不会形成循环”。我也没有发现其他属性,例如传递性和反对称,可以推断出不存在循环。
UML 发明者的主张现在已经过时了吗?还是我错过了当前规范中允许得出此声明的某些内容?
【问题讨论】:
-
我必须调查一下,但是从内存构成等于责任,这将排除一个循环。
-
顺便说一句。说聚合是不正确的。你的意思是复合聚合?共享聚合甚至没有语义。您引用的书中的措辞可能已经过时了。
-
@qwerty_so 我的意思是共享聚合。除了引用之外,我已经更正了:Booch et al use "aggregation" for shared aggregation 和 "composition"。事实上,对于组合,它可以从生命周期责任中推断出来(甚至是白底黑字“组合可以在具有传递删除特征的有向无环图中链接”。如果该声明对于共享聚合仍然适用,那么最终会有合理地使用它,对树和其他具有自反关联的 DAG 进行建模,如 other question
-
共享聚合的唯一限制是它只能用于二进制关联。
-
如果你要找到它,你会找到什么样的证据?在实践中,如果聚合是其部分的总和,那么循环怎么可能呢?
标签: language-lawyer uml aggregation class-diagram