【问题标题】:Many-to-one multiplicity when there's an association of a class with two classes当一个类与两个类有关联时的多对一多重性
【发布时间】:2015-10-06 05:45:07
【问题描述】:

上下文:我有一个抽象类学生。从这个类我派生出三个具体的类SchoolStudent、UnderGradStudentPostGradStudent。我还有另一门课Vehicle。学生必须驾驶车辆,但本科生或研究生可能会或可能不会驾驶车辆。但每辆车都必须由某人驾驶,因此 Vehicle类有一个学生的引用。

问题:我在 UnderGradStudent 和 Vehicle 类之间有关联,而在 PostGradStudent 和 Vehicle 之间有另一个关联。但是,我对多样性有点困惑。

据我了解,UML 类图应如下所示:

但是,我怀疑上图表明每辆 Vehicle 将有一个 UnderGradStudent 以及一个 PostGradStudent

上图对于我想要建模的内容是否正确?

【问题讨论】:

    标签: uml class-diagram


    【解决方案1】:

    当您绘制此 UML 图时,它暗示(但没有正确地说)Vehicle 必须由一个UnderGradStudent 和一个PostGradStudent 驱动。这也意味着UnderGradStudent 可以驱动任意数量的Vehicles,而PostGradStudent 可以驱动任意数量的Vehicles(同时)。我不认为那是你的本意。我说“暗示”的原因是您在一端覆盖了两个关联。最后我检查了,那是无效的 UML。

    我想你想说Vehicle 最多可以由一个Undergrad StudentPostgrad Student 驱动。这么说,我推荐以下模型:

    这句话是:

    • Student 的有效实例必须是 School StudentUndergrad StudentPostgrad Student 之一(并且不能多次分类)
    • Allowed Driver 的有效实例必须是 Undergrad StudentPostgrad Student 之一(并且不能多次分类)
    • Vehicle 最多可以由一个 Allowed Driver 驱动(一次)
    • 一个Allowed Driver 最多驱动一个Vehicle(一次)

    这描述了任何时间点的有效情况,这非常有用。将其视为评估电影中任何帧的有效性的一种方式。

    如果您需要记录每辆车曾经的所有驾驶员,则需要进行许多更改。 Person 实际上扮演 Student 的角色(通​​常还有其他角色),并且该角色会随着时间而改变。您需要记录每次角色更改的开始和结束时间以及每次驾驶员/车辆更改的开始和结束时间。可以将其视为记录电影中的所有帧,但无法表达电影中任何给定帧的有效性。当你放松多重性时,你就会失去这种能力。

    通过结合我提到的所有关联,您可以获得“单帧”和“整部电影”方法的好处。

    【讨论】:

    • 这将解决问题,但使用多重继承 (MI)。可能是品味问题,但我的 POV 中的 MI 只是一个技术构造,与现实无关。例如。一辆两栖汽车不会继承人们可能认为的船舶和汽车。它是自己的一类。必须始终小心使用 MI。
    • 这是一个语义分析模型。多重继承在OOA和知识表示中很常见。如果您的目标语言与 MI 不兼容,例如 Java,也相当于将 Allowed Driver 置于 Student 下方。
    • @JimL。谢谢你的回复。但是,我的目标语言是不支持 MI 的 Java。此外,我无法收集您在评论中关于将“AllowedDriver”置于 Student 下面的内容以防万一。如果您能详细说明一下,那将非常有帮助。
    • 我会尽量用文字解释。剪断从本科生和研究生到学生的概括线,并从允许的司机到学生的概括线,然后重新排列所有子类以使其分层。
    【解决方案2】:

    通过在Vehicle*Student 类附近使用 0..1 的多重性,您的问题将很容易解决。这将告诉读者两者都被允许拥有相关的可选车辆。为了避免两者使用同一辆车,您需要附加这样的约束:

    您也可以通过以下方式进行操作:

    我不擅长编写 OCL,但你也可以形式化约束。

    【讨论】:

    • 请看我的编辑。您自己的图表建议允许驾驶多辆汽车。根据您的评论进行了更改。
    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多