【问题标题】:Is this UML class diagram correct?这个 UML 类图正确吗?
【发布时间】:2016-09-15 09:19:08
【问题描述】:

我一直在努力将我的系统放入类图中。我倾向于通过在数据库结构中考虑太多来犯关系错误。我有一个类图:

所以解释一下我需要的情况:

员工部分:

  • 可以按项目阶段将员工分配到 0 个或多个项目

项目部分:

  • 项目属于某种类型(我可能会混淆项目是否属于某种类型)。
  • 一个项目类型由 1 个或多个项目阶段组成
  • 某个阶段的项目阶段IS

解释系统必须做什么:

可以将员工分配到项目的某个阶段。项目应该是某种类型,并且该类型由某些项目阶段组成。项目阶段是某个阶段。

因为员工需要查看他当前的所有项目等,所以我也建立了员工和项目的链接。我不知道这是否正确,或者这是项目阶段,它有责任为员工提供正确的项目。

【问题讨论】:

  • 关于项目符号“一个项目类型由1个或多个项目阶段组成”:我认为您最好说“一个项目类型由1个或多个阶段组成”。

标签: class oop uml class-diagram


【解决方案1】:

根据经验 - 没有唯一正确的绘制图表的方法。

聚合

一个明显的错误是您使用复合聚合。使用这种用法,您假设 ProjectPhase 附加到一个员工,并且不能与其他员工共享,这绝对不是您要在此处描述的内容。

如果您想表明该项目是由多个员工构建的,您最终可以使用共享聚合,这意味着您应该有一个相反的方向和一个开放的菱形。

在 ProjectPhase 和 ProjectType 的情况下,这复合聚合,但方向相反(ProjectType 是特定 ProjectPhase 的构建,而 ProjectPhase 恰好是一个 ProjectType 的一部分)。

泛化

Project 到 ProjectType 和 Phase 到 ProjectPhase 是存在多个选项的地方。

  1. 如果您假设一个项目是由阶段构建的,然后您想要对特定类型的项目(例如 ProjectWaterfall、ProjectScrum、ProjectXP、ProjectRUP、ProjectPrince2)进行建模,这些项目将专门化具有特定结构的项目,那么您可以使用泛化,但是 Project 和 Phase 将位于泛化端(带箭头的一端),而特定的 ProjectType 和 ProjectPhase 将位于专用端(无箭头)。如果您遵循此方法,您可以显示每个 ProjectType 的详细结构。有关详细信息,请参阅示例。还要注意如何使用一些额外的约束来更精确地定义如何理解建模系统的逻辑。最后请注意,在我的图表中,我假设每个项目和阶段都必须是特定类型。你不能有这样的项目(不一定是真的),因此我把它们抽象化了。 这里是某个 ProjetType 的 Project IS

  2. 另一个选项是使用 ProjectType 和 PhaseType 分别作为 Project 和 Phase 的属性,并在其他地方保留哪些类型应该在特定类型的 Project 中的逻辑。在这种情况下,您通常将 ProjectType 和 PhaseType 建模为枚举器,然后将它们作为属性分别放在 Project 和 Phase 中,将各个元素与 Dependency 链接起来。 Here Project 有特定的 ProjetType

注意事项

  • 给定的选择不会创建完整的可能性列表。这些只是最常用的两种方法。
  • 您可以在同一模型中混合使用方法,具体取决于哪种方法更适合您的目的。但是,在类之间的这种依赖级别上,您通常会使用与在图表中受益相同的方法(参见示例)。

员工 - 项目关系

显然,将员工分配到项目仅通过阶段完成,因此直接关系是多余的。您最终可以将其描述为派生关系。

示例

特殊类型

本示例使用第一种方法。请注意,我定义了精确的、特定类型的项目,而不是一些未定义的通用 ProjectType(阶段相同)。

在这个例子中,我完全省略了关于 Employee 和 Phase 之间关系的冗余信息。

枚举类型

此示例未提供有关特定类型结构的详细信息。您可能希望在此处添加其他类,为您的项目创建模板,以定义项目结构的外观(包括哪些阶段)。示例图中未显示此类。 此外,我添加了 Employee 和 Project 之间的直接派生关联。

【讨论】:

  • 清晰而惊人的解释!
【解决方案2】:

我认为这是适合您要求的类图:

我已经对 Project/ProjectPhase 之间以及 ProjectType/Phase 之间的组合关联进行了建模,因为一个 Project 由 ProjectPhases 组成,ProjectPhases 没有它们的 Projects 就不能存在,ProjectType/Phase 也是如此。

Employees 和 ProjectPhases 既没有部分关系也没有存在依赖关系,因此这里不适合组合关联。

在我的图表中,Employee 通过 ProjectPhases 被隐式分配给 Projects,但如果您想强调Employees 和 Projects 之间的关系,您可以显式地在这些类之间绘制关联。

【讨论】:

    【解决方案3】:

    一些明显的错误:

    • 在这两种情况下都删除合成。它们是错误的,并且通常根本没有添加足够的语义来使用(几乎所有时间)。
    • 将泛化更改为简单关联。这里不是继承,而是归属。

    在我看来,这符合你的解释:

    您不需要从 EmployeeProject 的关联,因为它是通过阶段和类型链接的。 phase 没有解释,所以我只是添加了一个简单的属性。我猜这是一个枚举或字符串。最终ProjectType 也是一个简单的枚举,可以用Project 中的属性替换(需要调查)。

    【讨论】:

    • 清除阶段。管理员应该能够管理多个阶段,因此创建等。如果它只是项目阶段,将会有许多相同的预定义阶段,而项目阶段应该始终存在于选定的几个已创建阶段之一中。
    • 对我来说这太抽象了。这看起来更像是一种学术结构,而不是实际用途。您可能会在 The Deadline: A Novel About Project Management (DeMarco) 中找到拥有项目类型和阶段并且两者都可配置的内容,但在实践中却没有。
    • @ThomasKilian,“ProjectPhase”是一个特定项目的一个阶段。您应该在 ProjectType 和 ProjectPhase 之间建模“阶段”,并且在 ProjectPhase 和 Project 之间应该有关联。在您的图表中,对于每个 ProjectType,都有多个项目,因此您无法派生属于给定员工的项目。
    • @www.admiraalit.nl 如前所述,我认为该模型听起来很合理。一个项目可以有阶段,好的。它可能是一种类型。但实际上两者都只是枚举。我们需要在白板上与利益相关者讨论时澄清您的解释是否更好:-)
    • @ThomasKilian:那么您不会获得分配给员工的项目,而是获得与分配给员工的项目具有相同项目类型的所有项目。 DaViDa 明确规定了“员工需要查看他当前的所有项目”的要求。您的图表不满足此要求。
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多