问题描述
我正在用 UML 制作类图,但找不到有关此主题的信息。 我可以在多个协会课程中开设一个课程吗? 这是一个例子:
Message 应该是用户和组之间的关联类,也是用户和频道之间的关联类。 这是允许的还是有其他方法可以做到这一点? 谢谢!
解决方法
什么是关联类?
在查看关联类的图形符号时,我们可能会误以为关联类只是附加到关联的类。
但关联类实际上是一个关联,同时也是一个类:
UML 2.5.1 / 第 11.5.3.2 节:AssociationClass 是对具有自己的一组功能的 Association 的声明。 AssociationClass既是Association又是Class,同时保留了两者的静态语义和动态语义。
所以在建模语义上,除了表示法之外,不能把关联类和对应的关联分开。如果您还不相信,请看规格中的下一句:
AssociationClass 描述了一组对象,每个对象共享 AssociationClass 作为一类类所包含的相同的特征、约束和语义规范,并对应于一个唯一的链接,将 AssociationClass 实例化为一种协会。
(链接是关联的实例,对应于具有“每个成员关联一个值”的元组)
关联类二元性的后果是什么?
结果是相同的关联类不能存在于多种风格中,而每种风格都会关联不同的类集。
虽然表示法中没有任何内容阻止您添加虚线以将同一个类看似“附加”到两个不同的关联 as Bruno explains,但该表示法与有效的 UML 语义不对应。
替代方案
您的问题强调了一个有趣的设计问题。幸运的是,有很多方法可以解决它。例如:
-
User
类与抽象Destination
类相关联。Message
将是关联类。Destination
将特化为Group
和Chanel
,它们都将继承关联(无需以图形方式复制关联)。 (编辑:如注释中Axel Scheithauer下划线所示,关联和关联类是一回事,必须同名)
- 忘记关联类。使
Message
成为与User
相关联的普通类。它还与Group
和Chanel
相关联。如有必要,请在这两个关联之间添加一个{xor}
约束(如果它们是互斥的)。
您目前仅与 Group
而非 Channel
具有多对多关联的事实表明存在一些显着差异并且会支持 (2) 而不是(1).
不相关:您当前的模型中有什么奇怪的东西?
无论关联类主题如何,您当前的模型都提出了一些关于与 Group
的多对多关联的问题:
- 您的意思是多个用户可以向多个群组发送相同的消息吗?
- 还是您的意思是一个用户可以向一个群组发送消息并且该群组由多个用户组成?
在后一种情况下,您应该选择 2 个不同的关联:一个用于发送关联,一个用于群组成员关联(参见上图中的红色关联)。
,这是一个非常有趣的问题。
在formal/2017-12-05中,图11.25 Associations第 199 页、§ 11.5.3.2 Association Classes 起始页 200 和 § 11.8 中都没有.2 AssociationClass [Class] 起始页 220 说一个类不能用于多个关联类。
所以对我来说是允许的
但是警告,类的名称和关联的名称必须相同,来自 formal/2017-12-05 § 11.5.3.2 Association Classes page 200 :
Association 和 Class 都是分类器,因此有一组共同的属性,比如能够拥有特征, 具有名称等。这些属性是从同一构造(分类器)多次继承的,并且不会重复。 因此,一个 AssociationClass 只有一个名称,并且具有为 Classes 和 关联。
如果你想制作association-class,那么这个类不能被命名为Message和sends的关联。
Note 类和关联是 NamedElement(第 47 页的第 7.8.9 NamedElement [抽象类]),一个给定的名称可以用于多个 NamedElement 但要共存于同一个 Namespace 中,两个 NamedElement 必须是可区分的。从 formal/2017-12-05 § 7.8.9.7 操作第 49 页:
isDistinguishableFrom(n : NamedElement,ns : Namespace) : Boolean
查询 isDistinguishableFrom() 确定两个 NamedElements 是否可以在逻辑上共存于一个
命名空间。默认情况下,两个命名元素是可区分的,如果 (a) 它们的类型都不是 a
或者 (b) 他们有不同的名字。
那么这两个关联Message必须在不同的命名空间中,因为它们具有相同的名称。
,如果您希望 Message 成为将 User 连接到 Group 和 Channel 的 UML 关联类的实例,您可以将 Message 关联的一个端属性连接到一个 UML 类的实例,该实例是 Group 和 Channel 的联合。
要构造一个联合类,使其成为 UML 泛化的两个实例的一般结束并使其抽象。一个泛化的特定端是 Group,另一个是 Channel。为了更加清晰,将泛化放入一个 {complete} 的 UML 泛化集实例中。