UML 域模型 - 如何模拟两个实体之间关联的多个角色?

UML Domain model - how to model multiple roles of association between two entities?

假设有一个用户有任务的场景。每个用户可以是任务的观察者或工作者。

此外,工人可以归档他在给定任务上的工作时间。

下图是否正确?我环顾了领域模型,但没有看到一个具有这两个关联(工作,手表)的模型。可以接受吗?

编辑: 这个场景怎么样?一个用户可以向另一个用户出价。下图显示了一种可能的建模方式。

但是,在该图中,用户似乎可以向自己提出要约。是否可以对某些约束进行建模,或者是否可以在开发线中进一步处理?

原则上是正确的,这就是你如何在两个 类 之间建立多重关系的模型。

至于约束,UML 使用了 OCL(对象约束语言),因此可以说关联是排他的(xor - 排他或)。

另请注意,命名协会的最终角色通常是个好主意。

关于其中一条评论

There are no UML police to flag you down for being "unacceptable".

这就像在说:没有代码警察会因为你写了糟糕的代码而对你进行举报。

你创建图表来传达信息(无论如何用于学校项目),如果你偏离标准或最佳实践,你会让其他人更难理解你的图表。

就像检查您的代码是否存在常见问题的 linters(jslint,...)一样,对于模型,也有做同样事情的模型验证。

还有模型,就像代码一样,并不是一成不变的,所以当您找到更好的方式来表达您的领域时,不要害怕修改它们。

更新

正如 Jim 恰如其分地指出的那样,您通常不是以用户(或个人)的身份,而是以角色的身份来做事。例如。当您是学生并且正在填写表格时,没有人在乎您是人,而是您是学生。通常一个人也会有几个不同的角色(你可以是学生和助教、教授等)

以这种方式将其分开会使域更加清晰,因为您只关心角色,而不关心实现角色的人员。

关于第一个模型,在 Peter 的优秀且非常有趣的答案之后没有太多要补充的。

然而,您的第二张图(在编辑部分)似乎确实给出了叙述的真实和公正的观点。从严格的 1 对 1 关系,我了解到每个用户都向另一个用户提供了一个报价,并且每个用户都从另一个用户那里收到了一个报价:

  • "用户 可以 向另一个用户提供报价" 表示基数为 0..1 或 *,而不是 1。
  • 从这里我们隐含地了解到并非所有用户都需要收到优惠,即基数也为 0..1 或 *
  • 这可以讨论,但“an offer”在我看来并不意味着“at most one offer”,因此基数的上限不应为 * 而不是 1,以表明每个用户可能会发出多个报价并收到多个报价。

如您所见,您可以添加 constraints to the schema to increase expressivity. This is done in an annotation between { } . But you can choose the most suitable syntax. Here an example with the full expressivity of natural language (as suggested by Martin Fowler in his "UML distilled") but you can of course use the more formal OCL,使其成为 {self.offerer<>self.offeree}

我看到@Peter 在我 post 这个答案之前更新了他的答案,但无论如何我都会 post 向你展示一些其他技巧。

一般来说,在相同的两个 类 之间有多个关联是完全有效的。但是,我认为这里不是一个好主意。

你说你想建立一个[问题]领域模型。我很高兴听到这个消息!正如我在最后一段 中解释的那样,问题领域模型非常重要。需要指出的一件事是,您想构建一个 耐用 模型,超越您可以设想的系统。在问题域中,没有"User"。然而,人们扮演着角色。例如,您提到了 Watcher 和 Worker。希望这些是您的客户在 "meat world".

中已有的概念

在您 post 编辑的模型中,您没有地方可以挂起工作时间或取得的进步。你可以试试练习。如果您没有计算机,您的客户将如何跟踪这些东西?他们通常有(或有)一种方法,并且对于手动系统来说可能是最佳选择。

以下是我将如何模拟我对您的问题域的理解:

一些注意事项:

  • 一个人扮演任意数量的角色。
  • 一个角色是关于一个任务和一个人的。一个 Watcher 只能监视一个 Task,一个 Worker 只能被分配到一个 Task,任何一种 Role 只能由一个 Person 扮演。
  • 角色是抽象的,它的子类是{完整}的,这意味着如果角色不是子类的实例,就没有有效的角色实例。
  • 一个任务被任意数量的观察者观察,一次可以分配给一个工人。有一个约束说{person is not a watcher}。 (你可以展示OCL,但很少有人会看懂。)
  • 我添加了一个进度概念,作为记录任务进度的一种方式。一名工人在一项任务上取得进展。每一点进度都有一个描述和一个持续时间。请注意,我没有承诺以任何计算方式来表示描述或持续时间。为此,系统的设计者可以自由地从开始时间和结束时间导出持续时间,或者要求用户自行报告。