关联 Class 唯一性

Association Class Uniqueness

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

NOTE. Even when all ends of the AssociationClass have isUnique=true, it is possible to have several instances associating the same set of instances of the end Classes.

如此处所述:https://issues.omg.org/issues/UMLR-757 this single sentence seems to undermine the usefulness of the concept. At the same time, it makes pretty much every text explaining the concept written before 2.5 version of the UML spec obsolete – see for example the discussion here: UML association class - clarifying

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

我一直认为关联class只是一个常规的关联,带有额外的属性and/or操作。这种解释现在看来是无效的。那么association class到底是什么?它如何具有独立于协会成员端的唯一性?似乎有一些潜伏在某处的不言而喻的多重性(唯一性是无关紧要的 属性 最大多重性高于 1),但我不知道在哪里。

简而言之

确实,这不是 super-clear,应该得到更好的解释。简而言之:这只是为关联 class.

定义的双重语义缺乏整合的结果

详细解释

什么是关联的唯一性

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

When one or more ends of the Association have isUnique=false, it is possible to have several links associating the same set of instances.

我们可以使用逻辑 contraposition 推导出:

If it is not possible to have several links associating the same set of instances, all ends of the association have isUnique=true.

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

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

根据 UML 2.5.1 第 11.5.3.2 节:

An AssociationClass is both an Association and a Class, and preserves the static and dynamic semantics of both.

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

An AssociationClass cannot be a generalization of an Association or a Class.

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

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

这种二元性对实例的影响

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

An instance of an AssociationClass has the characteristics both of a link representing an instantiation of the AssociationClass as a kind of Association, AND of an object representing an instantiation of the AssociationClass as a kind of Class.

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

An Association declares that there can be links between instances whose types conform to or implement the associated types. A link is a tuple with one value for each memberEnd of the Association, where each value is an instance whose type conforms to or implements the type at the end.

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

例如,假设我们在 class A 和 class B 以及 ab 是这些 class 的实例。假设关联端有 isUnique=true。这意味着只能有一个元组 (a,b) 因为关联保证是唯一的。

设 P 是关联 class 的一个 属性,设 (a,b,p1)(a,b,p2) 是 class 中 class 的两个实例101=]。 class 不知道 association-ends:从 class 的角度来看,没有唯一性要求。而且从关联的角度来看,我们只有一个元组 (a,b) ,所以也可以。

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

是否存在矛盾或不一致?

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

但这会在具有 non-unique 结尾的关联的语义方面产生一些问题:

When one or more ends of the Association have isUnique=false, it is possible to have several links associating the same set of instances. In such a case, links carry an additional identifier apart from their end values.

更准确地说,这使得具有唯一末端的 association-class 变得无用,因为使用 non-unique 末端可以达到相同的结果:

  • 对于与 non-unique 端的简单关联,您可以有重复项,即多个 links 关联关联端的相同实例,这些实例用附加标识符区分。
  • 对于具有唯一端的关联 classes,根据注释,您可以有重复项,即几个对象(class 实例)对应于由唯一关联端组成的 link (关联实例)。
  • 对于具有 non-unique 端的 association-class,您可以有重复项,即多个对象实例对应于同一组成员端。如果您将其解释为多个 link 关联关联端的相同实例,每个关联一个对象,或者,如果您将其解释为一个 link 关联一组唯一的对象,这没有区别关联结束的实例,即每个实例都关联到多个对象实例。

恕我直言,这很不幸:

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

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