首页 > 解决方案 > 限制类图中的子对象

问题描述

我想使用类图建模一个简单的系统:

换句话说,我想限制这个系统有 20 个Employees,其中 1 个必须是Manager. 但是只有 1 可以是Manager. 这将使得始终有 19Employees和 1 个Manager对象。

我已经在我的脑海中设置了我希望这个系统如何工作的设置,但我无法让模型完全正确。这就是我得到的:

在此处输入图像描述

我觉得我很接近,但我的问题是,虽然Company1 对 1 的关系Manager似乎是正确的,但 1 对 19 的关系似乎不正确Employee。由于 aManager是 a Employee,我无法限制这 19 个中有多少EmployeesManagers。我试图做到这一点而不Employees分成Non-ManagerManager类。

我在正确的轨道上吗?有什么我想念的吗?或者是否足够清楚 19 个必须是 Employee 对象,1 个必须是 Manager 对象?

标签: umlassociationsclass-diagramgeneralizationmultiplicity

解决方案


问题

您的模型有一个弱点:Manager一个公司的 a 可能是另一个公司的,因为您的模型中没有任何内容表明两个类别Employee的雇佣关系是相同的。Company

为什么?如果应用 UML 泛化语义:

  • EmployeeCompany与有关联
  • Manager是 的特化Employee,因此继承了它的所有属性、操作和关联,包括与 的关联Company
  • Manager此外,它还与Company. 所以它有两个不同的关联:继承的关联和它自己的关联。

潜在的解决方案

标记关联的末端会很有帮助,例如 employer/employeecompany/ manager

  • 最简单的解决方案可能是删除 和 之间的关联ManagerCompany因为它是继承的。但是没有简单的方法可以判断其中一定有Manager一个employees。此外,没有一种简单的方法可以找到Managera 的Company。所以这个解决方案似乎不合适。

  • 另一种解决方案是添加一个约束,指定 ,Managermanager.company相同employee.employer。既然一个Manager人只管一个人company,那么推论中就没有其他的管理者存在了employees。但这听起来有些人为。

  • 因此,在我看来,最好的解决方案是保留这两个关联,但使用 UML 语义学来解释这一点,company {subsets employer}manager {subsets employee}注意这个解决方案需要 20 名员工,因为它清楚地表明经理是 20 人中的一个。

如果您有兴趣了解有关子集的更多信息,我建议您阅读这篇关于关联的重新定义、专业化和子集的文章,这也可能会激发您的其他变体。

小评论

聚合没问题。然而,聚合是一种建模安慰剂,因为 UML 规范清楚地说明了第 110 页:

共享聚合的精确语义因应用领域和建模者而异。

因此,我建议尽可能避免使用它们。因此,您也可以使用正常的 UML 关联。特别是对于只有一个的经理。

qwerty_so在评论中的另一条评论是应该++has: The中删除+是关于公共可见性的。公有或私有的不是协会本身,而是协会的终结(例如employeremployee在我的提议中)。


推荐阅读