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

UML领域模型-如何对两个实体之间的多个关联角色建模?,uml,constraints,domain-model,Uml,Constraints,Domain Model,假设存在一个用户拥有任务的场景。每个用户都可以是任务的观察者或工作者 此外,工人可以记录他在给定任务上的工作时间 下图是否正确?我环顾了一下领域模型,并没有看到一个有两个关联(工作、手表)。可以接受吗 编辑:这个场景怎么样?用户可以向其他用户提供报价。下图显示了一种可能的建模方法 然而,在该图中,用户似乎可以向自己提供报价。是否有可能在开发过程中对某些约束进行建模,或者在开发过程中进一步处理这些约束 原则上是正确的,这就是在两个类之间建模多个关系的方式 至于约束,UML使用了OCL(对象约束语

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

此外,工人可以记录他在给定任务上的工作时间

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

编辑:这个场景怎么样?用户可以向其他用户提供报价。下图显示了一种可能的建模方法

然而,在该图中,用户似乎可以向自己提供报价。是否有可能在开发过程中对某些约束进行建模,或者在开发过程中进一步处理这些约束


原则上是正确的,这就是在两个类之间建模多个关系的方式

至于约束,UML使用了OCL(对象约束语言),因此可以说关联是独占的(xor-exclusive or)

还请注意,通常最好命名关联的最终角色

关于其中一条评论说

没有UML警察会因为你“不可接受”而责骂你

这就像是在说:没有代码警察会因为你写了糟糕的代码而惩罚你

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

就像有linter(jslint,…)检查代码中的常见问题一样,对于模型,也有做同样事情的模型验证

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

更新 正如Jim恰当地指出的那样,您通常不是以用户(或个人)的身份,而是以角色的身份进行工作。例如,当你是学生并且正在填写表格时,没有人关心你是人,但你是学生。通常,一个人也会有几个不同的角色(你可以是学生、助教、教授等)

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


在第一款车型上,这是一个非常好、非常有趣的答案,之后就没有什么可补充的了

然而,您的第二个图表(在编辑部分)似乎确实给出了一个真实而公平的视图。从严格的1对1关系中,我了解到每个用户向另一个用户提供一个报价,每个用户从另一个用户收到一个报价:

  • “一个用户可以向另一个用户提供服务”表示基数为0..1或*,而不是1
  • 由此我们可以明白,并非所有用户都需要收到报价,即基数为0..1或*
  • 这是可以讨论的,但在我看来,一个报价”并不意味着“最多一个报价”,因此基数的上限不应该是
    *
    ,而不是1,以表明每个用户可以提供多个报价并收到多个报价


如您所见,您可以添加到模式中以增加表达能力。这是在
{}
之间的注释中完成的。但是您可以选择最合适的语法。这里有一个自然语言的完整表达性的例子(正如Martin Fowler在他的“UML蒸馏”中所建议的),但是您当然可以使用更正式的,使其
{self.offererself.offeree}

我看到@Peter在我发布这个答案之前更新了他的答案,但我还是会发布这个来给你展示一些其他技巧

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

你说你想建立一个[问题]域模型。听到这个我很高兴!正如我在最后一段中解释的,问题域模型非常重要。需要指出的一点是,您希望构建一个超越您可以设想的系统的持久模型。在问题域中,没有“用户”。然而,人们也扮演着一些角色。例如,您提到了观察者和工人。希望这些是您的客户在“肉类世界”中已有的概念

在你发布的模型中,你没有地方可以挂起工作时间或取得的进展。你可以试试运动。如果你没有电脑,你的客户会如何跟踪这些东西?他们通常有(或有)一种方法,对于手动系统来说,这可能是非常理想的

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

需要注意的一些事项:

  • 一个人扮演许多角色
  • 角色只涉及一项任务和一个人。观察者只观察一项任务,工人只被分配到一项任务,任何角色都只由一个人扮演
  • 角色是抽象的,其子类是{complete},这意味着如果不同时也是子类的实例,就不会有有效的角色实例
  • 一项任务由任意数量的观察者观察,一次可分配给一名工人。有一个约束条件说{人不是观察者}。(您可以为此显示OCL,但很少有人会理解。)
  • 我添加了一个进度概念,作为记录任务进度的一种方式。工人在一项任务上取得进展。每一个进度都有一个描述和持续时间。请注意,我没有承诺使用任何计算方法来表示描述或持续时间。为此,系统的设计者可以自由地从开始和结束时间派生持续时间,或者要求用户自行报告

当然可以。没有UML警察会因为你“不可接受”而责骂你。真正的问题是:当你编写代码时,它能工作吗?UML并不重要