关联类唯一性

vrs*_*sio 5 uml class unique associations language-lawyer

我很难理解 UML 2.5 规范中解释的关联类的概念。最让我困惑的是摘自第 199 页的以下句子:

笔记。即使当 AssociationClass 的所有端都具有 isUnique=true 时,也可能有多个实例关联端类的同一组实例。

如此处所述:https : //issues.omg.org/issues/UMLR-757这一句话似乎削弱了该概念的实用性。同时,它使得几乎所有解释在 UML 规范 2.5 版本之前编写的概念的文本都过时了——例如参见这里的讨论:UML 关联类——澄清

但这实际上如何在概念上起作用?假设关联类的所有端都有isUnique=true,当isUnique成员端的属性明确禁止存在这样的链接时,如何可以有多个关联类的实例关联同一组端类的实例?

我一直认为关联类只是具有额外属性和/或操作的常规关联。这种解释现在似乎无效。那么究竟什么是关联类呢?它如何具有独立于协会成员端的唯一性?似乎有一些不言而喻的多重性潜伏在某处(唯一性是不相关的属性,最大多重性不高于1),但我不知道在哪里。

Chr*_*phe 5

简而言之

事实上,这并不是非常清楚,应该得到更好的解释。简而言之:这只是为关联类定义的双重语义缺乏集成的结果。

详细说明

什么是关联的唯一性

根据 UML 2.5.1 第 11.5.3.1 节,第 197 页:

当关联的一个或多个端具有 isUnique=false 时,可能有多个链接关联同一组实例。

我们可以使用逻辑对立推断

如果不可能有多个链接关联同一组实例,则关联的所有端都具有 isUnique=true。

所以我们希望这也适用于关联类,因为关联类也是一个关联。

关联类同时是两个不同的东西

根据 UML 2.5.1 第 11.5.3.2 节:

AssociationClass既是Association 又是 Class,并保留两者的静态和动态语义

因此,关联类不仅仅是“具有额外属性的关联”。如果真的那么简单,那么关联类完全可以是关联的泛化:专门化的关联只会继承额外的属性。但这是明确禁止的第199页:

AssociationClass 不能是 Association 或 Class 的泛化。

因为对类的任何特化都会失去关联语义,而对关联的任何特化都会失去类语义。

而这种二元性,就是我们问题的根源。

这种二元性对实例的影响

根据 UML 第 11.5.3.2 节,第 199 页(格式来自我):

一个AssociationClass的实例有两者的特性表示AssociationClass的实例化作为一种协会的链路,以及代表一个实例化的对象的AssociationClass的作为一种类

如果isUnique=true对于所有关联结束,则保证关联的实例是唯一的。但是请注意,关联仅与由关联结束组成的元组有关:

关联声明类型符合或实现关联类型的实例之间可以存在链接。链接是一个元组,对于 Association 的每个 memberEnd 都有一个值,其中每个值是一个实例,其类型符合或实现了末尾的类型。

但是,规范中没有任何内容要求表示关联实例化的类实例化(对象)必须是唯一的。

例如,想象一下,我们在 classA和 class之间有一个关联类Ba并且b是这些类的实例。想象一下,关联端有isUnique=true。这意味着只能有一个元组,(a,b)因为该关联保证是唯一的。

设 P 是关联类的一个属性,设(a,b,p1)(a,b,p2)是关联类中该类的两个实例。类不知道关联端:从类的角度来看,没有单一性要求。而且从关联的角度来看,我们只有一个 tuple (a,b),所以也可以。

NOTE 只是解释了这种(不幸和模棱两可的)情况是可能的。

是否存在矛盾或不一致?

形式上,没有矛盾。这是关联类定义方式的结果:同时一个类和一个关联,没有进一步定义各自实例之间的关系。

但这会在具有非唯一目的的关联的语义方面产生一些问题:

当关联的一个或多个端具有 时isUnique=false,可能有多个链接关联同一组实例。在这种情况下,链接除了其最终值外还带有一个附加标识符。

更准确地说,这使得具有唯一端的关联类变得无用,因为可以通过非唯一端实现相同的结果:

  • 对于具有非唯一端的简单关联,您可以有重复项,即多个链接将关联端的相同实例相关联,并用附加标识符进行区分。
  • 对于具有唯一端的关联类,根据注释,您可以有重复项,即多个对象(类实例)对应于由唯一关联端(关联实例)组成的链接。
  • 对于具有非唯一端的关联类,您可能有重复项,即多个对象实例对应于同一组成员端。如果您将其解释为将关联端的相同实例关联的多个链接,每个链接与单个对象关联,或者,如果您将其解释为关联关联端的一组唯一实例的一个链接,那么这没有区别每个都与多个对象实例相关联。

恕我直言,这是不幸的:

  • 它与我们的心智模型不匹配,在这种模型中,具有所有关联结束的关联类isUnique=true应该具有该类的唯一对象实例,以实现唯一的组合关联结束。这显然违背了最小惊讶原则:我从拒绝开始,我花了一段时间才接受这一点,因为它与实现关联类的传统方式非常不同。
  • 两种不同的模型,一种具有独特的关联结束,一种没有实际上可以表达相同的情况。

这个问题的一个简单解决方案是需要一个唯一的类实例(对应于关联类的对象)来对应一个唯一关联关联结束的链接。这样,唯一的关联结束就意味着唯一的关联对象,而不需要对 UML 规范进行其他更改。