uml - 限制类图中的子对象
问题描述
我想使用类图建模一个简单的系统:
- 我有 3 个可能的课程:
Company
,Employee
,Manager
. Company
必须有 20 个(Employees
聚合?)。Company
必须有 1 (Manager
聚合?)。- A
Manager
是 Employee(泛化?)。 - 每个
Employee
只能在 1 中Company
。
换句话说,我想限制这个系统有 20 个Employees
,其中 1 个必须是Manager
. 但是只有 1 可以是Manager
. 这将使得始终有 19Employees
和 1 个Manager
对象。
我已经在我的脑海中设置了我希望这个系统如何工作的设置,但我无法让模型完全正确。这就是我得到的:
我觉得我很接近,但我的问题是,虽然Company
1 对 1 的关系Manager
似乎是正确的,但 1 对 19 的关系似乎不正确Employee
。由于 aManager
是 a Employee
,我无法限制这 19 个中有多少Employees
是Managers
。我试图做到这一点而不Employees
分成Non-Manager
和Manager
类。
我在正确的轨道上吗?有什么我想念的吗?或者是否足够清楚 19 个必须是 Employee 对象,1 个必须是 Manager 对象?
解决方案
问题
您的模型有一个弱点:Manager
一个公司的 a 可能是另一个公司的,因为您的模型中没有任何内容表明两个类别Employee
的雇佣关系是相同的。Company
为什么?如果应用 UML 泛化语义:
Employee
Company
与有关联Manager
是 的特化Employee
,因此继承了它的所有属性、操作和关联,包括与 的关联Company
。Manager
此外,它还与Company
. 所以它有两个不同的关联:继承的关联和它自己的关联。
潜在的解决方案
标记关联的末端会很有帮助,例如 employer
/employee
和company
/ manager
:
最简单的解决方案可能是删除 和 之间的关联
Manager
,Company
因为它是继承的。但是没有简单的方法可以判断其中一定有Manager
一个employees
。此外,没有一种简单的方法可以找到Manager
a 的Company
。所以这个解决方案似乎不合适。另一种解决方案是添加一个约束,指定 ,
Manager
与manager.company
相同employee.employer
。既然一个Manager
人只管一个人company
,那么推论中就没有其他的管理者存在了employees
。但这听起来有些人为。因此,在我看来,最好的解决方案是保留这两个关联,但使用 UML 语义学来解释这一点,
company {subsets employer}
并manager {subsets employee}
注意这个解决方案需要 20 名员工,因为它清楚地表明经理是 20 人中的一个。
如果您有兴趣了解有关子集的更多信息,我建议您阅读这篇关于关联的重新定义、专业化和子集的文章,这也可能会激发您的其他变体。
小评论
聚合没问题。然而,聚合是一种建模安慰剂,因为 UML 规范清楚地说明了第 110 页:
共享聚合的精确语义因应用领域和建模者而异。
因此,我建议尽可能避免使用它们。因此,您也可以使用正常的 UML 关联。特别是对于只有一个的经理。
qwerty_so在评论中的另一条评论是应该+
在+has
: The中删除+
是关于公共可见性的。公有或私有的不是协会本身,而是协会的终结(例如employer
,employee
在我的提议中)。
推荐阅读
- arrays - 最小交换到相对排序两个数组
- javascript - 在 Node.js 中测试中间件,模拟 multipart/form-data
- python - Python,熊猫数据框,坐标的条件格式
- mongodb - mongodb 哪些文档批量写入更新
- stream - 没有输入的 Dart Stream
- r - 如何计算一列数据框中有多少个重复公式?R
- python - 优先约束 Pyomo
- javascript - 从另一个 HTML 文件导入的 Javascript 更改元素
- php - Sql Select Where In 无法正常工作
- android - 使用 SNPE 实现 mobilenetssd