UML-关联或聚合(简单代码片段)

UML-关联或聚合(简单代码片段),uml,associations,aggregation,class-diagram,diagramming,Uml,Associations,Aggregation,Class Diagram,Diagramming,有多少书自相矛盾,我都快疯了 Class A {} class B {void UseA(A a)} //some say this is an association, no reference is held but communication is possible Class A {} class B {A a;} //some say this is aggregration, a reference is held 但许多人说,持有引用仍然只是一种关联,对于聚合,他们使用一

有多少书自相矛盾,我都快疯了

Class A {} class B {void UseA(A a)} //some say this is an association,
no reference is held but communication is possible
Class A {} class B {A a;} //some say this is
    aggregration, a reference is held
但许多人说,持有引用仍然只是一种关联,对于聚合,他们使用一个列表——这是一样的,它仍然是一种引用

我很困惑,我想了解这个问题

例如:这里:-强关联和聚合之间有什么区别,在这两种情况下,作者都使用一个字段来存储引用

另一个例子: 这就是所谓的联想:

这就是所谓的聚集:

public class Professor {
  // ...
}

public class Department {
  private List<Professor> professorList;
  // ..

}

公共课教授{
// ...
}
公共课系{
私人名单教授名单;
// ..
}

再说一次,有什么区别?这两种情况下都是参考

参见上部结构2.1.1:

关联可以表示复合聚合(即,整体/部分关系)。只有二进制关联可以是聚合。复合聚合是一种强大的聚合形式,要求零件实例一次最多包含在一个复合中。如果删除组合,则其所有零件通常都会随之删除。请注意,零件可以(在允许的情况下)在删除组合之前从组合中删除,因此不能作为组合的一部分删除。组合物可以链接在具有传递删除特征的有向无环图中;也就是说,删除图的一部分中的元素也将导致删除该元素下的子图的所有元素。组合由设置为true的关联的部件端的isComposite属性表示

可导航性意味着在运行时参与链接的实例(关联实例)可以从参与关联另一端链接的实例有效地访问。实现这种访问的确切机制是特定于实现的。如果一端不可导航,则从另一端访问可能是可能的,也可能是不可能的,如果是,则可能没有效率。注意,在UML模型上操作的工具不会被阻止从非导航端导航关联

您上面的示例位于不同的抽象级别
/
课程
是具体的编码课程,
/
教授
是抽象的业务级别。虽然没有很好的来源(我知道)来解释这一事实,
composition
aggregation
是您将仅在业务级别上使用的概念,几乎不会在编码级别上使用(下面的例外)。当您处于代码级别时,您的生活会更好,因为
关联
两边都有角色名。角色本身是引用相反类的类的属性的不同(/冗余!)呈现

聚合作为类之间的强绑定在数据库建模中使用。在这里,您只能在聚合之前已全部删除的情况下删除主节点(反之亦然:删除主节点将强制删除聚合)。聚合体不能独立生存。你的例子中的组合(从我的观点来看)是一个愚蠢的构造,因为它假装是某个星期的聚合。但这完全是胡说八道。然后使用关联。只有在业务层面上,您才能尝试将(例如)机器零件建模为复合材料。在具体的层面上,构图是一个无用的概念

tl;博士


如果类之间存在关系,则将其显示为简单关联。在讨论域详细信息时,添加角色等详细信息将有所帮助。只有在业务级建模时才鼓励使用组合/聚合,而不鼓励在代码级使用组合/聚合。

我已经写了一篇文章,讨论了基于实际UML规范而不是基于书籍作者的解释的组合/聚合之间的差异

主要结论是

简言之,组合是一种对发展具有实际制约和影响的关联,而聚合纯粹是对关联性质的功能指示,没有技术影响


导航性是一个完全不同的属性,独立于AggregationKind。

这个问题在许多不同的变体中已经被问过很多次,也将被问到很多次,因为许多人,包括许多知名的开发人员,对UML中定义的这些术语的含义感到困惑。因为这个问题已经被问了很多次,也被回答了很多次。参见,例如。我将尝试总结UML定义

两个类之间的关联不是通过方法参数建立的,而是通过引用属性(类属性)建立的,引用属性的范围/类型是关联的类。如果方法参数的类型是类,则不会建立关联,而是建立依赖关系

在研究关联的编码方式之前,首先理解关联的逻辑概念是至关重要的。对象类型之间的关联对这些类型的对象之间的关系进行分类。例如,协会
委员会
-将-
俱乐部成员
-视为主席,在下图所示的类图中显示为一条连接线,可以将关系分类财务委员会将彼得米勒作为主席,招聘委员会将苏传递作为主席,咨询委员会将萨拉汉德森作为主席,其中,PeterMiller、Susanmisth和SarahAnderson的对象类型为
俱乐部成员
,而财务委员会、招聘委员会和咨询委员会的对象类型为
委员会

关联始终通过引用属性进行编码,引用属性的范围/类型是关联的类。比如说,

class Committee { ClubMember chair; String name;}
在UML中,聚合和组合被定义为特殊形式的关联,其意图是对部分-整体关系进行分类。就