协会类别的独特性

2023-12-25

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

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

正如这里所指出的:https://issues.omg.org/issues/UMLR-757 https://issues.omg.org/issues/UMLR-757这一句话似乎破坏了这个概念的实用性。同时,它使得几乎所有解释 UML 规范 2.5 版本之前编写的概念的文本都过时了 - 例如,请参见此处的讨论:UML 关联类 - 澄清 https://stackoverflow.com/questions/9648927/uml-association-class-clarifying

但这在概念上如何实际发挥作用呢?假设关联类的所有端都有isUnique=true,如何拥有多个关联类实例来关联同一组最终类实例,当isUnique会员端属性明确禁止此类链接的存在?

我一直认为关联类只是带有额外属性和/或操作的常规关联。这种解释现在看来已经失效了。那么关联类到底是什么?它怎么能具有独立于协会成员端的唯一性呢?似乎有一些不言而喻的多重性潜伏在某个地方(唯一性是不相关的属性,没有最大多重性高于1),但我不知道在哪里。


在很短的时间内

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

详细解释

什么是协会的独特性

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

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

我们可以用逻辑推理对位 https://en.wikipedia.org/wiki/Contraposition that:

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

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

关联类同时是两个不同的事物

根据 UML 2.5.1 第 11.5.3.2 节:

关联类是both一个协会和一个类,以及果酱静态和动态两者的语义.

所以,关联类不仅仅是“与额外属性的关联如果真这么简单,那么关联类就可以完美地成为关联的泛化:专门的关联只会继承额外的属性。但是这是明确禁止的,第 199 页:

AssociationClass 不能是 Association 或 a 的泛化 班级。

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

这种二元性就是我们问题的原因。

这种二元性对实例的影响

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

AssociationClass 的实例具有以下特征代表 AssociationClass 作为一种 Association 的实例化的链接, 和代表实例化的对象AssociationClass 作为一种类.

If isUnique=true对全部协会结束,保证关联的实例是唯一的。但请记住,关联仅涉及由关联结尾组成的元组:

关联声明类型符合或实现关联类型的实例之间可以存在链接。一条链接是一个元组,每个成员都有一个值关联结束,其中每个值都是一个实例,其类型符合或实现最后的类型。

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

例如,想象一下,我们在类之间有一个关联类A和班级B, and a and b是这些类的实例。想象一下关联结束了isUnique=true。这意味着只能有一个元组(a,b)因为该关联保证是唯一的。

设 P 为关联类的属性,并令(a,b,p1) and (a,b,p2)是关联类中该类的两个实例。类不知道关联端:从类的角度来看,不存在唯一性要求。从关联的角度来看,我们只有一个元组(a,b),所以也没关系。

该注释只是解释了这种(不幸且含糊的)情况是可能的。

是否存在矛盾或不一致?

从形式上看,并不存在矛盾。这是关联类定义方式的结果:同时有一个类和一个关联,而无需进一步定义各个实例之间的关系。

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

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

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

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

恕我直言,这很不幸:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

协会类别的独特性 的相关文章

随机推荐