问题描述
一个系统中的角色分为三种类型。
裁判
主席(只有一位主席)
作者
一个人既可以是推荐人,也可以是作者。
如果一个人担任总裁的角色,他们就不能再担任其他角色。
UML 类图应该是怎样的?
解决方法
这完全取决于您设计中人员和角色的目的。
首先想到,如果一个 Person
可以有一个 Role
,那么您将在这里拥有两个具有以下多重性关联的类:
- 一个
Person
有1..n
Role
,表示至少有一个角色 - 一个
Role
可以被0..n
Person
占用,这意味着有些角色可能根本无法实现,而角色可以由多个用户担任 - 对于某个类(称为对象,例如标记为“总统”)的特定出现的关联(称为链接)的特定出现次数没有说明
对于“总裁”等具体角色,有多种设计选择:
- 您可以在您的系统中使用(硬编码?)控件来确保只有一个链接。您可以在具有显式约束的类图中表达这一点。
- 您可以指定将角色作为角色属性的最大人数。但这立即表明存在不同类型的 if 角色(有些具有最大值,有些没有限制)。
深入了解这个启动模型会引发其他问题:
- 该系统对 1 位总裁的限制是全局的,还是该角色与其他事物相关联(例如实体、陪审团、公司的总裁...)?在后一种情况下,会缺少一些额外的类(和要求)。
- 角色列表是否固定?是否有很多与之相关的规则?如果是,您可以考虑布鲁诺建议的枚举。如果没有,您可以考虑使用字符串属性来描述角色。
- 最后但并非最不重要的一点是,特定角色在系统中是否具有特定行为?如果是,您可以考虑在图表中添加角色的专业化(并且
President
显然是Role
的此类专业化的候选者)。
所以这完全取决于您设计的大局。
,在你的问题中,我想
-
角色Referees必须是Referee
-
角色Authors必须是Author
-
如果一个人担任总统的角色,他们不能担任另一个角色必须如果一个人担任总统的角色, >那个人不能有其他角色
-
只有1位总统必须只有1位总统
在 UML 中建模的一种方法是:
由于多重性1..2 {unique}
,一个人有 1 或 2 个角色,并且不能有两次相同的角色。
但是多重性允许既是裁判又是总统,或者作者和总统,这就是为什么我在 Person 上添加了约束 self.roles->size() = 1 or self.roles->excluding(Role::President)
以避免这种情况。
由于约束 Person.allInstances()->count(p | p.roles()->first() = Role::President) = 1
,只有一位总统。或者当然,如果有可能没有总统用= 1
<= 1
关于多重性,请参阅第 33 页的 § 7.5.3.2 Multiplicity 和 formal/2017-12-05
的第 34 页的 § 7.5.4.1 Multiplicity Element关于 OCL,请参阅 formal/2014-02-03