问题描述
我想使用类图为简单的系统建模:
- 我有3种可能的类:
Company
,Employee
,Manager
。 -
Company
必须有20个Employees
(聚合?)。 -
Company
必须具有1个Manager
(聚合?)。 -
Manager
是雇员(一般化吗?)。 - 每个
Employee
只能位于1个Company
中。
换句话说,我想将此系统限制为20个Employees
,其中1个必须为Manager
。但是,只有1可以是Manager
。这样可以确保始终有19个Employees
和1个Manager
对象。
我想让该系统工作,但我无法正确地建立模型。这就是我得到的:
我觉得自己很亲密,但是我的问题是,尽管与Company
的{{1}}一对一关系似乎正确,但与Manager
的1对19关系似乎错了。由于Employee
是Manager
,因此我无法限制这19个Employee
中有多少Employees
。我试图做到这一点,而又没有将Managers
分为Employees
和Non-Manager
类。
我走对了吗?我有什么想念的吗?还是很清楚,必须19个必须是Employee对象,而1个必须是Manager对象?
解决方法
问题
您的模型有一个弱点:一个公司的Manager
可能是另一个公司的Employee
,因为您的模型中没有任何内容表明与Company
的雇佣关系对于两个公司都是相同的课程。
为什么?如果您应用UML概括语义:
-
Employee
与Company
有关联, -
Manager
是Employee
的特化,因此继承了其所有属性,操作和关联,包括与Company
的关联。 -
Manager
另外还与Company
有关联。因此,它具有两个不同的关联:继承的关联和它自己的关联。
潜在解决方案
标记关联的结束会很有帮助,例如employer
/ employee
和company
/ manager
:
-
最简单的解决方案是删除
Manager
和Company
之间的关联,因为它是继承的。但是,没有简单的方法来判断Manager
中必须有employees
。此外,找不到Manager
中的Company
的简便方法。因此,此解决方案似乎不合适。 -
另一个解决方案是添加一个约束,该约束指定对于
Manager
,manager.company
与employee.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 (例如,我的提案中的employer
和employee
)。