【问题标题】:Difference between Composition and Dependency in class diagram?类图中的组合和依赖之间的区别?
【发布时间】:2023-03-16 20:30:01
【问题描述】:

我知道,有人就这个案子问过同样的问题,但我还是不明白,我需要一个具体的答案。谢谢 :D

【问题讨论】:

  • 确实,Composition 和 Dependency 的区别是毫无疑问的。所以采取 +1 并欢迎来到 StakeOverflow。但是下一次找出第一个是什么,第二个是什么,结果就会有所不同。只有当你不明白时,才问。

标签: dependencies uml composition class-diagram


【解决方案1】:

既然Gangnus没有正确解释构图的含义,那我就得补了。

正如 Gangnus 所解释的,聚合关联的一种特殊形式,其预期含义是部分-整体-关系,但没有精确的语义(UML 规范说:“共享聚合的精确语义因应用领域和建模者而异”)。例如,我们可以对 CarEngine 类之间以及 CourseLecture 类之间的聚合建模,因为引擎是汽车的一部分,而讲座是课程的一部分。

组合(在 UML 规范中也称为“复合聚合”)是一种特殊形式的聚合,其中组件实例最多是一个聚合实例的一部分一次(也就是说,它不能在多个聚合之间共享)。这意味着CarEngine之间的聚合是一个组合(因为不能同时在两辆车之间共享一个引擎),而CourseLecture之间的聚合不一定是一个组合,因为讲座可以在两门课程之间共享(例如,数据库管理课程和软件工程课程可以共享关于 UML 的讲座)。这意味着在聚合端组合的关联端的多重性是10..1,而在非组合聚合的情况下也可能是*

除了组合的主要特征(具有专有部分)之外,组合还可能带有生命周期依赖性 在聚合及其组件之间,这意味着当删除聚合时,它的所有部分都会随之删除。然而,这仅适用于某些组合情况,而不适用于其他情况,因此它不是一个定义特征。 UML 规范声明:“可以在组合实例被删除之前从组合实例中移除一部分,因此不会作为组合实例的一部分被删除。”在我们的Car-Engine 组合示例中,显然可以在汽车被销毁之前将发动机从汽车上拆下,在这种情况下,发动机不会被破坏并且可以重复使用。

【讨论】:

  • “正如 Gangnus 所解释的,聚合是一种特殊的关联形式”。谢谢,但事实并非如此。 “属性具有聚合属性”(UML st.2.5)。所以,正如我真正说过的,聚合是关联的一个属性(属性是属性)。它不是某种形式的关联。
  • 我使用的是自然语言和常识,而您似乎更喜欢 UML 语言。但即使在 UML 2.5 中,他们在第 209 页上说:“二元关联可能表示复合聚合(即整体/部分关系)。”
  • 当然,如果你想说的更简单,更简短,每个人都会这样理解你。但问题是关于定义的,应该严格设定。顺便说一句,讨论的双方总是认为他们在使用常识。所以,以常识为论据只会让人觉得你想冒犯别人。
【解决方案2】:

这些东西相距甚远。

A- - - ->B  Dependency 

是最常见的。这意味着,A 的代码要提防 B 类。并且 A 可见的 B 成员的更改可能需要 A 的更改。

A------->B association (with none aggregation)

联想是更紧密的联系。关联可以有不同程度的紧密度,但即使在最弱的关联上,它也必须至少有一个导航箭头。 (如果它们是双面的,则不显示)这意味着存在一些从 A 指向 B 的简单方法。例如,存在 a.x.y.b 的构造。 关联具有聚合等属性。可能是nonesharedcomposition

A<>------>B  association (with shared aggregation) 

共享没有严格的定义,它留给我们建模者和工具作者。但通常它表明A实例或类在某种意义上具有B的一些实例。

A♦------>B  association (with composite aggregation or simply 'composition') 

它有严格的定义——这意味着,A 或其实例具有 B 的实例。这也意味着,这些 B 仅存在于该关联的边界中。当协会或其拥有的将被销毁时,将无法访问这些 B。如果这些严格的要求没有得到满足,那就不是作文。

来自 UML 标准 2.5 的引用: "复合聚合是一种强大的聚合形式,它要求一个部分(参见 11.2.3)实例一次最多包含在一个复合实例中。如果删除一个复合实例,它的所有部分通常都会被删除它。"

associations 的其他变体和依赖项也存在。

所以,依赖是组合所有者的祖先。

【讨论】:

    【解决方案3】:

    这很简单。 依赖是一种没有运行时语义含义的有向关系。它说一个元素(依赖源)的定义是 在语义上或结构上取决于目标元素的定义。没有运行时语义意味着在现实世界中没有实例。 (例如,人们依赖的东西不能通过模型​​中的依赖关系连接起来:)

    组合是组合聚合类型的关联。它可以有一个实例(运行时语义含义),更准确的说是关联端设置为组合的属性元素。您可以在世界任何地方找到作品。很好的例子是人体......它是由头、手臂、腿、...... 部件不能物理连接到相同类型的其他组合。人体存在,如果它的部分也存在。

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 2018-10-20
      • 2020-07-27
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多