【问题标题】:Aggregation vs Composition vs Association vs Direct Association聚合 vs 组合 vs 关联 vs 直接关联
【发布时间】:2014-03-24 22:33:17
【问题描述】:

我正在复习我在面向对象编程方面的知识。在类之间的关系主题下,我遇到了一些对我来说有点模棱两可的关系。

我知道依赖“uses-a”和继承“is-a”,但我对聚合、组合、关联和直接关联有点不熟悉;另外,它们中的哪一个是“有”关系。有些人将聚合与关联互换使用。

什么是直接关联?另外,什么是组合?在 UML 图中,表示它们的箭头是不同的。如果您能帮我解决这些问题,我将不胜感激。

【问题讨论】:

  • 阅读 Paul Gestwicki 的 this 文章。

标签: oop uml aggregation composition model-associations


【解决方案1】:

请注意,对“关联”的定义有不同的解释。我的以下观点主要基于您在 Oracle 认证书籍和学习指南中阅读的内容。

临时关联

方法内部的用法、其签名或作为返回值。它实际上并不是对特定对象的引用。

例如:我把车停在车库里。

作曲关联

所谓的“强关系”:链接对象的实例化通常很难 在对象的构造函数中编码。不能从 物体外。 (组合不能是多对多的 关系。)

例子:房子是由石头组成的。

直接关联

这是一个“弱关系”。对象可以独立存在,通常有 setter 或其他方式来注入依赖对象。

示例:汽车可以有乘客。

聚合关联

与直接关联非常相似。这也是一个具有独立对象的“弱关系”。然而,这里的关联对象是包含对象的关键部分。

示例:汽车应该有轮胎。

注意:直接关联和聚合关联通常都被概括为“关联”。差别相当微妙。

【讨论】:

  • “组合关联”的名称是组合聚合。您所说的“聚合关联”是共享组合,并且根据 UML2.5 没有定义的语义。请看上面的盒子。第 110 页。
  • @qwerty_so 你指的是哪本书?
  • OMG 的 UML 2.5:omg.org/spec/UML/2.5/About-UML
【解决方案2】:

OOP 的全部意义在于您的代码复制现实世界的对象,使您的代码具有可读性和可维护性。

1.协会

关联是:A 类使用 B 类。

例子:

  • 员工使用巴士/火车服务进行交通。
  • 计算机使用键盘作为输入设备

在UML图中,关联用普通箭头表示。

2。聚合

A 类包含 B 类,或者 A 类有 B 类的实例。

当对象的生命独立于容器对象时使用聚合。但容器对象仍然拥有聚合对象。

因此,如果我们删除 A 类,并不意味着 B 类也将被删除。例如。没有一个或多个教师可以属于一个或多个系。

教师和部门之间的关系是聚合的。

3.作曲

A 类拥有 B 类。

例如身体由手臂、头部、腿组成。 BankAccount 由 Balance 和 TransactionHistory 组成。

因此,如果 A 类被删除,那么 B 类也将被删除。

【讨论】:

    【解决方案3】:

    直接关联与其他三个没有共同之处。它根本不属于UML,它是IBM requirements modelling term

    至于其他人,

    关联 A->B 是 Dependency 的子级。关联意味着,A(或其实例)有一些简单的方法可以到达 B 的实例。例如,a.x.y.b。或者通过函数,或者通过一些局部变量。或通过直接引用或指针,或其他东西(世界上有许多语言)。如您所见,依赖和关联之间没有严格的界限。

    Association 的属性之一是 Aggregation,它可以有值:None、shared(通常被错误地称为聚合)和 composition。

    如果A(或实例)具有B的一些(或一个)实例,则关联的破坏意味着B实例的破坏,它就是组合。

    如果您或工具作者已经决定,某些has-a关系,即组合较弱,需要特别显示,您可以使用shared聚合。通常是 A 中对 B 的一些引用集合。

    关联还有一些更有趣的属性。有兴趣可以看here

    【讨论】:

    • 请注意,在 UML 中,关联的概念并非源自依赖的概念。关联是关系和分类器,而依赖是定向关系。您对作文的解释也不正确,请参阅我对this question 的回答。
    • 它不是作为模型元素派生的。但是根据他们的定义,每个关联 A--->B 也是一个依赖 A-->B。一个是另一个的子集。谢谢,唉,我注意到了,他们没有这样命名。
    • 不,那句话是完全错误的。在这种情况下,每个关联都必须是有向关系,这是不正确的。
    • 非常抱歉,您能解释一下您的意思吗?
    • 依赖性 - 一种变化影响另一个的关系。这也适用于关联。
    【解决方案4】:

    对象类型之间的关联对这些类型的对象之间的关系进行分类。例如,Person-isEmployedBy-Enterprise 关联也可以对类型为 Person 的对象 PeterMiller、SusanSmith 和 SarahAnderson 之间的关系 PeterMiller-isEmployedBy-IBM、SusanSmith-isEmployedBy-IBM 和 SarahAnderson-isEmployedBy-Google 进行分类作为Enterprise 类型的Google 和IBM。换言之,关联是具有两个或多个对象类型参与其中的关系类型。两种对象类型之间的关联称为二进制。虽然二元关联更常见,但我们可能还需要处理 n 元关联,其中 n 是大于 2 的自然数。例如,Person-isTreatedIn-Hospital-for-Disease 是 3 - 对象类型PersonHospitalDisease 之间的三元(“三元”)关联。

    我猜“直接关联”是指定向(或定向)关联,它是一个关联(具有域类和范围类),表示其域类中的引用属性。这样的定向关联在其目标端有一个“所有权点”。

    有关关联的更多信息,请参阅this book chapter

    有关聚合和组合的说明,请参阅我对 this SO question 的回答。

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2014-07-13
      • 2012-07-01
      • 2016-06-27
      • 2011-05-03
      相关资源
      最近更新 更多