如何建立伙伴关系模型?

时间:2019-03-04 11:04:58

标签: uml class-diagram

我想为两个人之间的伙伴关系建模。我的第一个想法是使用协会。协会的两端名称必须不同。因此,我需要两个角色:partner1partner2。这又使每个人都有两个伙伴。不完全是我想要的。 partnership 我的第二种尝试是使用属性partner。这里的问题是,一个人的合伙人的合伙人应该是这个人,但是模型没有捕捉到这个。当然,我们可以使用具有这种效果的约束,但是我更喜欢使用图形表示法的解决方案。

第三个选项(在下面的注释中建议)使用附加的类Partnership。这行得通,但是如果它没有任何属性,只会使模型变得比必要的复杂。

最优雅的解决方案是一个关联,其中两个member ends将是相同的partner属性。但是,这是不允许的,因为成员end属性是唯一的。因此,它不能包含相同的属性两次。这是规范中的错误吗?这真的难得吗?在所有递归关联中,双方的角色都相同。

3 个答案:

答案 0 :(得分:1)

这是对称部分关联的示例。只能在适当的约束条件下对这种关联进行建模,如以下模型所示:

enter image description here

仅当已经定义了将在关联原型中使用的相应约束关键字(如“对称”)时,才可以避免附加的显式约束/不变式。不幸的是,UML 2.5没有提供这样的构造型,但是我们可以像这样随意添加它:

enter image description here

[我在提交答案后只阅读了上面“ bruno”的评论。 “ bruno”正确指出了约束的主要部分的必要性:self.partner.partner = self。]

答案 1 :(得分:0)

该结构如何:enter image description here

一对夫妇正好有2个人链接。一个类不能有任何额外的属性。但是,您可以想到它的创建日期。如果是婚姻,则可以指明姓氏的人,等等。由于您似乎很需要这种伴侣关系,因此可能还有更多关于伴侣关系的信息。

现在,为什么要使用复合聚合?基本上,组成意味着溶解组成元素也将消除组成元素。所以这看起来很宽容,不是吗?是的,对我感到羞耻。但是,应该有一些表达“一个人只能由一对夫妇组成”。这就是复合聚合的含义(在我最喜欢的页面110上):

  

复合聚集是聚集的一种强大形式,它要求一次将一个对象最多包含在一个复合对象中。如果删除了一个复合对象,则随即删除作为对象的所有零件实例。

好吧,所以应该使用共享的合成

  

表示该属性具有共享的聚合语义。共享聚合的精确语义因应用程序区域和建模器而异。

带有建模说明,该解释说明每个元素在共享的合成中只能使用一次。

当然,带有约束的简单关联是最好的。不过,我还是将图留给读者以娱乐。

P.S。仔细阅读各种注释,使我认为Partnership(及其兄弟情谊形式)的语义对社会的敏感性远比直觉开始想到的更为敏感。因此,真正的“答案”应该是:首先为Partnership定义社交环境。

答案 2 :(得分:-2)

问题中提到的优雅解决方案如下所示: Person with partner attribute 它看起来与其他解决方案没有太大区别,但是实际上,当前的UML无法实现,因为member end属性具有isUnique=trueMetamodel 我认为,这是规范的错误。当然可以纠正(蓝色显示)。但是,似乎这个错误很少被注意到。这种校正是否足够有用,值得付出努力?

如果应该回答这个问题,我将提出一个问题。