【问题标题】:In UML class diagram can composition be bidirectional?在 UML 类图中,组合可以是双向的吗?
【发布时间】:2014-11-04 21:28:21
【问题描述】:

组合可以是双向的吗?

如果不是,默认的构图方向是什么?

【问题讨论】:

标签: oop uml class-diagram


【解决方案1】:

是的,Composition 不会对关联的可导航性添加限制。 有关 Accociation、Composition 和 Aggregations 之间区别的更多信息可以在这里找到:UML Composition vs Aggregation vs Association

【讨论】:

    【解决方案2】:

    您应该区分可导航性和聚合性。箭头和菱形。

    箭头 A->B 仅表示 B 可以通过某种简单的方式从 A 到达。如果A包含B的组合,则意味着

    复合对象负责存在和存储 组成的对象(部分)。

    (来自 OMG 统一建模语言 TM (OMG UML) - p.109)

    那么,组合可以双向导航吗?

    是的。很正常。

    例如,如果您决定销毁 B 的某些功能,则必须到达 A 并从那里销毁它。因此,组合经常具有双向导航能力。请注意,根据当前和未来的 UML 标准,双向导航性显示为线 两侧没有 箭头。双向箭头已弃用。这就是你不会经常看到它的原因。

    组合本身可以是双向的吗?我们可以在关联的两侧看到黑色菱形吗?

    ,这种关联当然不可能是相互的,因为不可能只在A中创建B,同时又不可能在B中创建A。

    有趣的是,shared aggregation(空菱形)也不能是相互的,但是这里的限制不是固有的,它只是被 UML 标准所禁止。

    【讨论】:

    • “双面箭头已弃用” 来源?因为 OMG UML 2.5(2015 年 6 月)第 203 页仍然说:“顶部对 AB 显示具有两个可导航端的二进制关联”该图的线在两端都有一个箭头。
    • 不是禁止的,只是模式不正常。看看他们自己的图表——那里没有两端的箭头。把它作为使用中的捷径。如果你喜欢,可以使用两端箭头。
    • 什么是会众?这是合成的别名吗?
    • @Jan 不,组合是聚合的子集。 (在 UML 中)
    • 我的母语不是英语,为什么要引入congregation这个词?你是说组成吗?什么意思?
    【解决方案3】:

    过去我和Gangnus有同样的看法

    那么,构图可以双向导航吗?

    但是在最近的一些讨论之后,我对 UML 规范有了更详细的了解。简单地说,这种说法是不正确的(只是部分)。让我们看看 UML 2.5 规范。在页。 110 说出来

    有时,Property 用于对使用一个实例将一组实例组合在一起的情况进行建模;这称为聚合。为了表示这种情况,Property 具有 AggregationKind 类型的聚合属性;代表整个组的实例由属性的所有者分类,代表分组个人的实例按属性的类型分类。 AggregationKind 是具有以下文字值的枚举:

    [省略共享聚合]

    composite:表示Property是复合聚合的,即复合object对复合objects的存在和存储负责(见部分定义见11.2.3)。

    复合聚合是一种强聚合形式,它要求一个部分对象一次最多包含在一个复合对象中。如果一个复合object被删除,它的所有objects部分实例都会被删除。

    请注意我在上述文本中对对象/实例的强调。所以 UML 只是谈论责任。如果A 组成B,它将负责在B 被销毁时将其删除。反之亦然B 将负责A 的破坏。因此,如果您在两个方向都有参考(即两侧都有菱形),那么您将负责删除另一侧的对象。这当然只有在两者中只有一个拥有对另一个的引用时才有效。如果两者都有参考,则不可能有直接责任(因为它是循环的)。

    我仍然认为在双方都有复合聚合并不是一个好主意。但是按照规范是可以的。

    【讨论】:

      【解决方案4】:

      来自https://www.lucidchart.com/pages/uml/class-diagram

      双向关联是两个类之间的默认关联,由两个类之间的直线表示。两个类都知道彼此以及彼此之间的关系。在上面的示例中,Car 类和 RoadTrip 类是相互关联的。在该行的一端,Car 将“assignedCar”与多重值 0..1 关联起来,这意味着当 RoadTrip 的实例存在时,它可以有一个 Car 实例与之关联,也可以没有 Cars 关联用它。在这种情况下,需要一个具有多重性值为 0..* 的单独 Caravan 类来证明 RoadTrip 可以具有与其关联的多个 Cars 实例。由于一个 Car 实例可能有多个“getRoadTrip”关联——换句话说,一辆车可以进行多次公路旅行——所以多重性值设置为 0..*

      【讨论】:

        猜你喜欢
        • 2018-01-21
        • 1970-01-01
        • 2011-07-06
        • 2014-09-18
        • 2018-08-24
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多