如何显示多个成员集合中恰好有一个元素满足 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 个角色。该角色将专门针对 GoalKeeperFieldPlayer,并且您可以使 Skipper 成为 decorator 可以叠加到另外两个角色之一。

这并没有消除表达约束的需要,但模型会更强大。最后但同样重要的是,我会看到一个 /isTeamValid 派生属性,如果您当前的所有约束都得到满足(包括守门员和场上球员以及队长角色的球员的数量),该属性将为真。优点是它可以让你建立一个团队并发展团队和角色的组成(