我想为两个人之间的伙伴关系建模。我的第一个想法是使用协会。协会的两端名称必须不同。因此,我需要两个角色:partner1
和partner2
。这又使每个人都有两个伙伴。不完全是我想要的。
我的第二种尝试是使用属性partner
。这里的问题是,一个人的合伙人的合伙人应该是这个人,但是模型没有捕捉到这个。当然,我们可以使用具有这种效果的约束,但是我更喜欢使用图形表示法的解决方案。
第三个选项(在下面的注释中建议)使用附加的类Partnership
。这行得通,但是如果它没有任何属性,只会使模型变得比必要的复杂。
最优雅的解决方案是一个关联,其中两个member ends
将是相同的partner
属性。但是,这是不允许的,因为成员end属性是唯一的。因此,它不能包含相同的属性两次。这是规范中的错误吗?这真的难得吗?在所有递归关联中,双方的角色都相同。
答案 0 :(得分:1)
这是对称部分关联的示例。只能在适当的约束条件下对这种关联进行建模,如以下模型所示:
仅当已经定义了将在关联原型中使用的相应约束关键字(如“对称”)时,才可以避免附加的显式约束/不变式。不幸的是,UML 2.5没有提供这样的构造型,但是我们可以像这样随意添加它:
[我在提交答案后只阅读了上面“ bruno”的评论。 “ bruno”正确指出了约束的主要部分的必要性:self.partner.partner = self
。]
答案 1 :(得分:0)
一对夫妇正好有2个人链接。一个类不能有任何额外的属性。但是,您可以想到它的创建日期。如果是婚姻,则可以指明姓氏的人,等等。由于您似乎很需要这种伴侣关系,因此可能还有更多关于伴侣关系的信息。
现在,为什么要使用复合聚合?基本上,组成意味着溶解组成元素也将消除组成元素。所以这看起来很宽容,不是吗?是的,对我感到羞耻。但是,应该有一些表达“一个人只能由一对夫妇组成”。这就是复合聚合的含义(在我最喜欢的页面110上):
复合聚集是聚集的一种强大形式,它要求一次将一个对象最多包含在一个复合对象中。如果删除了一个复合对象,则随即删除作为对象的所有零件实例。
好吧,所以应该使用共享的合成
表示该属性具有共享的聚合语义。共享聚合的精确语义因应用程序区域和建模器而异。
带有建模说明,该解释说明每个元素在共享的合成中只能使用一次。
当然,带有约束的简单关联是最好的。不过,我还是将图留给读者以娱乐。
P.S。仔细阅读各种注释,使我认为Partnership
(及其兄弟情谊形式)的语义对社会的敏感性远比直觉开始想到的更为敏感。因此,真正的“答案”应该是:首先为Partnership
定义社交环境。
答案 2 :(得分:-2)