如何显示多个成员集合中恰好有一个元素满足 UML 中的给定条件?
How to show that there's exactly one element in multiple member collections that meets given criteria in UML?
我有一个 UML 图,其中足球队由场上队员(10 名或更多)和守门员(1、2 或 3)组成。我如何使用 UML 显示团队中的一名球员是队长?
使用您当前的模型
根据给定的 classes 和关联,您可以将其表示为约束:
A Constraint is an assertion that indicates a restriction that must be satisfied by any valid realization of the model containing the Constraint.
约束表示为花括号 { ... }
之间的表达式,对应于预期为真的布尔表达式。可以是:
- 每个人都可以理解的纯文本,例如
{ only one player in a team have isSkipper true }
;
- 或更正式的说法,通常在 OCL 中,例如
{ self.fieldPlayers->select(isSkipper)->size() + self.goalKeepers->select(isSkipper)->size() = 1 }
。和很多人一样,我不精通 OCL,这就是我推荐纯文本的原因,因为模型的想法是 更容易 向读者传达设计。
我用 FootballTeam
上下文表达了这些约束(即附加到 class 的约束),因为它是整个团队的约束。
但是...
考虑到关注点分离,将 isSkipper
作为球员属性的想法似乎不是最好的想法:队长角色取决于球队,因此最好在协会 class.
此外,将守门员和场上队员等角色作为专业化很麻烦,而将队长 - 另一个角色 - 作为布尔字段实现任何合理的 OOP 多态设计可能很麻烦。
最后但并非最不重要的一点是,请记住,一支足球队可能会进化,并且所有条件(例如多重性)可能只有在您完成时才能满足,从而在模型和代码的现实之间造成一些脱节。
因此我强烈建议这样的设计:
+----------------+ * 1 +--------------+
| FootballPlayer |------------------------| FootballTeam |
+----------------+ : +--------------+
:
+------------+
| TeamPlayer |
+------------+
TeamPlayer
class 是关于取决于球员和球队的一切。
那么我建议设计一个Role
class 与TeamPlayer
相关联。您通常会为一名玩家分配 1 个角色。该角色将专门针对 GoalKeeper
与 FieldPlayer
,并且您可以使 Skipper
成为 decorator 可以叠加到另外两个角色之一。
这并没有消除表达约束的需要,但模型会更强大。最后但同样重要的是,我会看到一个 /isTeamValid
派生属性,如果您当前的所有约束都得到满足(包括守门员和场上球员以及队长角色的球员的数量),该属性将为真。优点是它可以让你建立一个团队并发展团队和角色的组成(
我有一个 UML 图,其中足球队由场上队员(10 名或更多)和守门员(1、2 或 3)组成。我如何使用 UML 显示团队中的一名球员是队长?
使用您当前的模型
根据给定的 classes 和关联,您可以将其表示为约束:
A Constraint is an assertion that indicates a restriction that must be satisfied by any valid realization of the model containing the Constraint.
约束表示为花括号 { ... }
之间的表达式,对应于预期为真的布尔表达式。可以是:
- 每个人都可以理解的纯文本,例如
{ only one player in a team have isSkipper true }
; - 或更正式的说法,通常在 OCL 中,例如
{ self.fieldPlayers->select(isSkipper)->size() + self.goalKeepers->select(isSkipper)->size() = 1 }
。和很多人一样,我不精通 OCL,这就是我推荐纯文本的原因,因为模型的想法是 更容易 向读者传达设计。
我用 FootballTeam
上下文表达了这些约束(即附加到 class 的约束),因为它是整个团队的约束。
但是...
考虑到关注点分离,将 isSkipper
作为球员属性的想法似乎不是最好的想法:队长角色取决于球队,因此最好在协会 class.
此外,将守门员和场上队员等角色作为专业化很麻烦,而将队长 - 另一个角色 - 作为布尔字段实现任何合理的 OOP 多态设计可能很麻烦。
最后但并非最不重要的一点是,请记住,一支足球队可能会进化,并且所有条件(例如多重性)可能只有在您完成时才能满足,从而在模型和代码的现实之间造成一些脱节。
因此我强烈建议这样的设计:
+----------------+ * 1 +--------------+
| FootballPlayer |------------------------| FootballTeam |
+----------------+ : +--------------+
:
+------------+
| TeamPlayer |
+------------+
TeamPlayer
class 是关于取决于球员和球队的一切。
那么我建议设计一个Role
class 与TeamPlayer
相关联。您通常会为一名玩家分配 1 个角色。该角色将专门针对 GoalKeeper
与 FieldPlayer
,并且您可以使 Skipper
成为 decorator 可以叠加到另外两个角色之一。
这并没有消除表达约束的需要,但模型会更强大。最后但同样重要的是,我会看到一个 /isTeamValid
派生属性,如果您当前的所有约束都得到满足(包括守门员和场上球员以及队长角色的球员的数量),该属性将为真。优点是它可以让你建立一个团队并发展团队和角色的组成(