2012-03-09 145 views
45

在这里,我与另一个关于聚合和关联的问题。我想学习一些UML的基础知识,所以我开始阅读Martin Fowler的“UML蒸馏”。我读了关于课程的两章,还有一件事情我不能完全理解,我认为这是聚合与关联。在这本书中有这样的引用:UML聚合与协会

在UML之前的日子里,人们通常对聚合和什么是关联是什么都很模糊。无论模糊与否,他们总是与其他人不一致。因此,许多建模者认为聚合很重要,尽管原因不同。所以UML 包括聚合(图5.3),但几乎没有任何语义。正如Jim Rumbaugh所说:“想象一下 是一种模拟安慰剂”[Rumbaugh,UML Reference]。

当我从这个报价和我的堆栈溢出阅读主题的理解并不重要的这两个关系我使用的一个,他们的意思是bassicly相同,或有任何情况下的使用聚合而不是关联会是合理的和/或我不能改变一个到另一个而不改变类图的“含义”?

我在问这个问题,因为这本书是从2003年开始的,有些东西可能会在这几年中发生变化。

回答

26

鲁博的语句是最有说服力的和Uncle Bob的好建议。正如我所说的elsewhere,Aggregation在语义上很弱以至于没有提供任何实际的益处。它只有一个有效的角落案例(递归关系的非循环),但很少有人知道并理解这一点。所以你最终不得不在评论中指出。

我只是不使用它。并从未感到任何损失。坚持简单的二元关联,关注真正重要的事情 - 获得基数和命名权。与尝试确定不可判定的关联与聚合相比,你会得到更多的结果。

hth。

+0

对组成链接有什么想法? – Dennis 2013-06-01 08:19:20

+0

@ Dennis:与Aggregation不同,Composition具有明确定义的语义,可以将其与直接二元关联区分开来。更多在这里:http://stackoverflow.com/questions/7834052/uml-class-diagram-association-vs-aggregation-composition-diamonds/7836357#7836357 – sfinnie 2013-06-03 07:44:32

27

也许这可以帮助你,但我不认为你会找到最完美的解释:

不同的是蕴涵之一。聚合表示全部/部分关系,而关联则不表示关系。然而, 可能在实施两种关系 的方式上有很大差异。也就是说,查看代码 并确定特定关系是否应该是聚合或关联是非常困难的。由于这个原因, 完全忽略聚合关系是非常安全的。
[Robert C. Martin | UML]

和每个情况的例子:

一)协会是一个关系,其中所有的对象都有自己的生命周期 并没有主人。让我们举一个老师和 学生的例子。多个学生可以与单个教师关联,并且单个学生可以与多个教师关联,但对象之间不存在所有权并且都具有其自己的生命周期。 都可以独立创建和删除。

b)聚合是一种特殊的关联形式,其中所有对象都有自己的生命周期,但存在所有权和子对象不能属于另一个父对象。我们以部门和教师的 为例。单个教师不能属于 多个部门,但是如果我们删除部门,教师对象 不会被销毁。我们可以考虑“有一个”的关系。
[Maesh | GeeksWithBlogs]

+2

有趣,但关于第二个例子,我认为如果我们将聚合与关联交换,仍然不会有任何区别,这一切归结为个人喜好和图表的可读性? – Andna 2012-03-09 21:25:47

+0

你怎么能告诉*关系是否是整体/部分? – reinierpost 2012-03-13 09:07:05

+0

可能有用http://www.uml-diagrams.org/association.html#aggregation – Jekis 2015-07-31 09:01:36

0

在UML聚合中定义不明确,因为它们没有任何明确定义的语义。 聚合的一个有效用例是几个类的封装,如Eric Evans的“Domain Driven Design”中所述。

E.g.一辆车有四个轮子。 对于每辆车,您可能需要计算每个车轮驱动的总米数。 这个计算是由汽车实体完成的,因为它知道它有哪个车轮,而且你不关心哪个车轮属于哪辆车。

汽车是所有零件的聚合根部,例如车轮,并且您无法从聚合体外部访问汽车零部件,只是根部。

所以基本上一个聚合封装了一组属于彼此的类。

+0

UML组成在语义上更接近DDD的聚合。 DDD聚合具有一些非常明确的语义(甚至比UML组合更强)。当然比UML聚合更强大。不幸的是,这些术语不匹配:-( – sfinnie 2012-03-12 20:47:42

2

我倾向于使用Aggregation来显示与具有一大区别的组合相同的关系:包含的类不负责所包含对象的生命周期。通常,将一个(非空)指针或对要包含的对象的引用传递给包含类的构造函数。包含对象在其生命周期期间取决于所包含的对象。如果没有包含的对象,包含对象就无法完成它的工作。这是我对Aggregation暗示的“部分/整体”关系的解释。

+1

“包含对象无法完全地在没有包含对象的情况下完成它的工作”。对于关联和某些窗体依赖关系,这是否也适用? – Jupiter 2013-09-10 16:15:55

-1

他们不是这个意思!我可以这样说:

关联关系:一个类引用另一个类。其实它表明一个班级与另一个班级有关,但他们 不一定具有显示这种关系的属性......例如 '教师'和'学生'班级,虽然'教师'班级没有 属性,指的是学生,但我们确实知道,实际上 老师确实有学生......并且“学校”班也有'老师'和' ''学生'属性,现在让这两个类别与其他每个 相关。

聚合关系:一个类包含另一个类。但是如果容器(ClassRoom)被销毁,则包含的(Chair)不是。 其实ClassRoom拥有主席。聚合关系比关系关系更强烈。

这里也是关于它和整个UML2的教程。0,这说明了一切方便,简单,你可能会发现它有用:https://github.com/imalitavakoli/learn-uml2

提示:也让我提,因为关联关系类大部分的时间之间存在,我们有时不把它画到避免不必要的复杂

0

实施明智没有太大的区别,但概念上有很大的不同:聚合用于表示层次结构。当您使用组件的层次那里工作,你需要有根接口某些类型的操作:在层次

  • 添加/从层次结构中删除子组件/
  • 变化

    • 发现子所有组分
    • 横动组件间的递归层级(访问者模式)
    • 重新配置的层级和连接(关联)的共同属性

    与协会打交道时,大多数这些操作是不需要的。

  • 0

    这个词经常会感到困惑。

    聚合和组合是一些类型的关联。有 几乎期间 实现聚合和协会之间的差异,很多人会完全跳过聚集关系, 他们与关联关系图。

    你可以从这个比喻的想法。

    类:A(人)等级:B(汽车)具有关联关系,如果 类:阿具有等级:B声明,并且还类别: B(汽车)对象不是必需创建等级:A(人)对象。

    类:A(汽车)等级:B(轮胎)具有聚合关系,如果 类:阿具有等级:B声明,并且还等级:B(轮胎)目的是必不可少创建类:A(汽车)对象。

    干杯!

    0

    要添加,我只想建议从OMG网站下载UML规范:最好的参考,并请参阅第110

    没有表明Property没有聚集语义。

    shared指示该属性具有共享聚合语义。精确的共享聚合语义因应用领域和建模者而异。

    composite指示该属性是复合聚合的,即复合对象对组合对象的存在和存储负责(参见11.2.3中的部分定义)。