【问题标题】:Limiting Child Objects in Class Diagram限制类图中的子对象
【发布时间】:2020-10-08 01:03:45
【问题描述】:

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

  • 我有 3 个可能的类:CompanyEmployeeManager
  • Company 必须有 20 个Employees(聚合?)。
  • Company 必须有 1 个Manager(聚合?)。
  • Manager 是 Employee(泛化?)。
  • 每个Employee只能在1个Company中。

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

我已经确定了我希望该系统如何工作的设置,但我无法完全正确地建立模型。这是我得到的:

我觉得我很接近,但我的问题是,虽然 CompanyManager 的 1 对 1 关系似乎是正确的,但 Employee 的 1 对 19 似乎不正确。由于ManagerEmployee,我无法限制这19 个Employees 中有多少是Managers。我试图做到这一点,但不将 Employees 拆分为 Non-ManagerManager 类。

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

【问题讨论】:

    标签: uml associations class-diagram generalization multiplicity


    【解决方案1】:

    问题

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

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

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

    可能的解决方案

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

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

    • 另一种解决方案是添加一个约束,指定对于Managermanager.companyemployee.employer 相同。由于Manager 管理一个且只有一个company,因此employees 中不能存在其他管理器。但这听起来有些人为。

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

    如果您有兴趣了解有关子集的更多信息,我建议您this artile about redefinition, specialization and subsetting of associations,这也可以激发您的其他变体。

    小记

    聚合很好。但是,聚合是 modelling placebo,因为 UML 规范清楚地说明了第 110 页:

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

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

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

    【讨论】:

    • 当我看到你编辑问题时,我什至没有开始写答案;-)
    • @qwerty_so 好的,下次我回答拳头然后编辑。因为我也喜欢阅读你的答案:-)
    • 嗯,你的答案通常很完整,我已经完成了“你的答案有错”。
    • 啊,一句话:+has 没有意义。看起来像是名字和角色的混合体。应该会提到。
    • @qwerty_so 确实是一个非常相关的评论。我进行了编辑以使其更具可见性。
    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多