在很短的时间内
事实上,这并不是非常清楚,值得更好的解释。简而言之:这只是关联类定义的双重语义缺乏集成的结果。
详细解释
什么是协会的独特性
根据 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 规范进行其他更改。