【发布时间】:2014-11-04 21:28:21
【问题描述】:
组合可以是双向的吗?
如果不是,默认的构图方向是什么?
【问题讨论】:
-
问题很简单,但是我这里还没有看到。 +1。
标签: oop uml class-diagram
组合可以是双向的吗?
如果不是,默认的构图方向是什么?
【问题讨论】:
标签: oop uml class-diagram
是的,Composition 不会对关联的可导航性添加限制。 有关 Accociation、Composition 和 Aggregations 之间区别的更多信息可以在这里找到:UML Composition vs Aggregation vs Association
【讨论】:
箭头 A->B 仅表示 B 可以通过某种简单的方式从 A 到达。如果A包含B的组合,则意味着
复合对象负责存在和存储 组成的对象(部分)。
(来自 OMG 统一建模语言 TM (OMG UML) - p.109)
是的。很正常。
例如,如果您决定销毁 B 的某些功能,则必须到达 A 并从那里销毁它。因此,组合经常具有双向导航能力。请注意,根据当前和未来的 UML 标准,双向导航性显示为线 两侧没有 箭头。双向箭头已弃用。这就是你不会经常看到它的原因。
不,这种关联当然不可能是相互的,因为不可能只在A中创建B,同时又不可能在B中创建A。
有趣的是,shared aggregation(空菱形)也不能是相互的,但是这里的限制不是固有的,它只是被 UML 标准所禁止。
【讨论】:
过去我和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 的破坏。因此,如果您在两个方向都有参考(即两侧都有菱形),那么您将负责删除另一侧的对象。这当然只有在两者中只有一个拥有对另一个的引用时才有效。如果两者都有参考,则不可能有直接责任(因为它是循环的)。
我仍然认为在双方都有复合聚合并不是一个好主意。但是按照规范是可以的。
【讨论】:
来自https://www.lucidchart.com/pages/uml/class-diagram:
双向关联是两个类之间的默认关联,由两个类之间的直线表示。两个类都知道彼此以及彼此之间的关系。在上面的示例中,Car 类和 RoadTrip 类是相互关联的。在该行的一端,Car 将“assignedCar”与多重值 0..1 关联起来,这意味着当 RoadTrip 的实例存在时,它可以有一个 Car 实例与之关联,也可以没有 Cars 关联用它。在这种情况下,需要一个具有多重性值为 0..* 的单独 Caravan 类来证明 RoadTrip 可以具有与其关联的多个 Cars 实例。由于一个 Car 实例可能有多个“getRoadTrip”关联——换句话说,一辆车可以进行多次公路旅行——所以多重性值设置为 0..*
【讨论】: