三元关联相关的属性

Attributes related to ternary association

在 UML 中,属性 是关联端,可以由关联或参与分类器拥有,通常是 class。当 属性 由 class 拥有时,它被称为 属性 。例如,属性 Book::author 可以获得以下符号之一(其中应在右侧图表的作者关联端绘制一个点):

该属性可用于约束表达式,例如:self.authormybook.author->count()

这对于二进制关联来说很简单。但我怀疑这如何与三元(或更一般的 N 元)关联一起使用,例如:

声明 Project 将具有属性 participant 和属性 role 是否正确,因为它们是关联的相反成员端?

并且考虑到 participantrole 不是独立的,如何在约束中利用它们的相关性,例如指代具有给定角色的贡献者,或者指代(participant,role)-元组将其 ->count() 限制为小于 10?

当然,在您的示例中,Project::participantProject::role 等属性对于表示三元链接没有任何意义。

UML 规范(在 11.4.3.1 类)指出

Attributes of a Class are Properties that are owned by the Class. Some of these attributes may represent the ends of binary Associations.

他们没有提到属性作为 non-binary 关联的末端的可能性。

在 11.5.4(第 202 页)中,正如@Christophe 所指出的,他们说

Ownership of Association ends by an associated Classifier may be indicated graphically by a small filled circle, which (...) we will term a dot.(...) The dot shows that the model includes a Property of the type (...). This Property is owned by the Classifier at the other end.

这里重要的概念是“另一端”,在规范的其他表述中也称为“对端”。这意味着关联必须有一个唯一的另一端。

因此,由于属性是对端分类器所拥有的关联端(=Properties),它们只能是二元关联的末端。

这意味着对于 n-ary 关联,参与的 类 不能拥有任何结束,因此不能具有(参考)属性,如 Project::participant.

此外,使用常识:像 Project::participant(或更好:Project::participants)这样的属性的可能含义是什么?它可能旨在表示参与三元关联 Project-Contributor-Role 的 instance/link 的所有 Contributor 对象的集合。这可以使用 OCL 表达式定义为派生属性。但是不允许represent/implement/reconstruct三元关联。

在 OOP 中,您可以有一个像 Project::contributorByRole 这样的 属性,其值将从 ContributorRole 的笛卡尔积中排序。这样一个属性represents/implements的三元关联。但是,据我所知,UML 没有定义 Cartesian Product 类型,因此不支持这样的 tuple-valued 属性。

对于 n-ary 关联,所有端点都必须由关联拥有,因此它们不是属性。

11.8.1.8 节有限制,所以,一目了然:

association_ends

Ends of Associations with more than two ends must be owned by the Association itself.

inv: memberEnd->size() > 2 implies ownedEnd->includesAll(memberEnd)