在类图中限制子对象

问题描述

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

  • 我有3种可能的类:CompanyEmployeeManager
  • Company必须有20个Employees(聚合?)。
  • Company必须具有1个Manager(聚合?)。
  • Manager是雇员(一般化吗?)。
  • 每个Employee只能位于1个Company中。

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

我想让该系统工作,但我无法正确地建立模型。这就是我得到的:

enter image description here

我觉得自己很亲密,但是我的问题是,尽管与Company的{​​{1}}一对一关系似乎正确,但与Manager的1对19关系似乎错了。由于EmployeeManager,因此我无法限制这19个Employee中有多少Employees。我试图做到这一点,而又没有将Managers分为EmployeesNon-Manager类。

我走对了吗?我有什么想念的吗?还是很清楚,必须19个必须是Employee对象,而1个必须是Manager对象?

解决方法

问题

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

为什么?如果您应用UML概括语义:

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

潜在解决方案

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

  • 最简单的解决方案是删除ManagerCompany之间的关联,因为它是继承的。但是,没有简单的方法来判断Manager中必须有employees。此外,找不到Manager中的Company的简便方法。因此,此解决方案似乎不合适。

  • 另一个解决方案是添加一个约束,该约束指定对于Managermanager.companyemployee.employer相同。由于Manager只管理一个company,因此employees之间没有其他经理可以推论得出。但这听起来有些人为。

  • 因此,我认为最好的解决方案是保留两个关联,但使用UML smeantics来解释company {subsets employer}manager {subsets employee},请注意此解决方案需要20名员工,因为很明显经理年满20岁。

如果您想进一步了解子集,建议您this artile about redefinition,specialization and subsetting of associations,这也可能会激发您其他的灵感。

次要发言

聚合很好。但是,聚合是modelling placebo,因为UML规范明确指出第110页:

共享聚合的精确语义因应用程序区域和建模器而异。

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

qwerty_so在评论中的另一句话是,+应该在+has中删除:+与公众可见度有关。不是协会本身是公共的还是私人的,而是association end (例如,我的提案中的employeremployee)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...