当前位置: 首页 > 知识库问答 >
问题:

理解代码中的UML关联

桂志诚
2023-03-14

这就是我现在对关联、聚合和组合的理解。

协会

public class Foo { 
    void Baz(Bar bar) {
    } 
};

聚集

public class Foo { 
    private Bar bar; 
    Foo(Bar bar) { 
       this.bar = bar; 
    }
}

构成

public class Foo {
    private Bar bar = new Bar(); 
}

我认为理解这些词的意思是没有意义的,除非我不能在实际代码中表示它。以上代码取自SO答案(如果以上代码错误,请告诉我)。

我的问题是闪烁。

1) 在类图中显示聚合和组合是否重要

2) 我使用了一个可以转换java的工具。将文件分类到类图中。类可视化工具,但我无法使此工具在类图中显示聚合或组合关系。这是工具的问题还是我不了解如何在代码中使用组合和聚合?当我使用上面的代码进行关联时,该工具为我提供了“依赖”关系的表示。(虚线)

共有3个答案

计弘
2023-03-14

是否显示合成/聚合取决于。您显示了聚合或组合元素成为一个部分,没有聚合/组合元素就不能生存。例如,在一个数据库中,当你删除一个重要语句的父语句时,你会在一篇作文中删除子语句。在另一个层次上(例如,当谈论从数据库实体派生的对象时),这可能变得不那么重要。最后,它取决于目标读者群体。离开聚合/合成只会减少你传达给读者的信息。

我不知道类可视化工具,但大多数UML工具只是将示例解释为依赖项(如果有的话)。它告诉我们:“两者之间有某种联系——你自己去想象。”。或者在导入后编辑生成的模型,使其更加正确。

蓝昊然
2023-03-14

UML与代码不在同一级别,因此代码和UML之间没有1-1转换。

有许多方法可以将代码反向工程到UML模型中,甚至有更多的方法可以在代码中实现UML模型。

因此,您必须理解UML概念本身,然后才考虑如何在代码中实现此类概念。

有许多关于UML的书籍和许多在线解释,但唯一真正的来源是UML规范

基于这个规范,我写了一篇文章,试图找出不同类型关联之间(有时是微妙的)差异:UML组合vs聚合vs关联

徐瀚
2023-03-14

是的,你上面的代码是错误的,因为它没有显示关联/聚合/组合是如何编码的。事实上,您的第一个代码示例仅仅是UML依赖的情况,而不是关联的情况。关联总是在引用属性的帮助下编码/实现的,比如您的属性bar,它引用了类型为Bar对象。所以,您的第二个和第三个例子是编码FooBar之间的关联的案例。顺便说一句,UML将组合定义为一种特殊类型的聚合(具有排他的部分),聚合是一种与部分-整体关系的预期含义相关联的特殊类型。

请注意,虽然众所周知关联(不同形式的)是如何编码/实现的,并且这在许多应用程序开发框架中都得到了支持,例如在基于Ruby on Rails的活动记录范例的框架中,但在对象关系映射框架Java持久性注释(JPA)中也得到了支持,目前尚不清楚如何对聚合和合成进行编码。事实上,聚合的UML概念非常弱,它在代码方面没有任何含义。但是UML的组合概念也太弱,在编码中没有用处/意义。只有当我们通过要求组合的各个部分不能从其组合中分离出来(这一要求称为不可分割的部分)来加强它,正如我的SO答案和我的(获奖)CodeProject文章中所讨论的,我们才能从代码方面获得两种特殊含义:

  1. 在这种更强的组合形式中,组件及其组合之间存在生命周期依赖关系,这意味着组件应该在其组合被销毁时销毁
  2. 组件可以相对于其组合进行命名/标识

所以你的问题“1)聚合和组合在类图中显示重要吗?”是:

a) 不,聚合在类图中不重要/不相关,只是将其显示为关联

b)只有当组合有不可分割的部分时,它才是重要的/相关的,可以在类图中建模/显示。

 类似资料:
  • 本部分试图从专题和业务流程的角度来剖析 Neutron 代码,以便理解如此设计的内涵。

  • 我目前正在做一个项目,我们必须从UML图制作代码。我了解UML类图的解剖结构,但我无法理解什么

  • 我试图为我的项目管理软件画一个类图,描述如下。它包含以下类别: 项目 - 软件 - 管理项目的人/她 - 从事项目工作的人员 以及以下关系/关联: > < li> 一个项目经理可能要管理多个项目,而一个项目只能由一个项目经理管理 项目经理可以将员工分配给他/她管理的项目 对于上面的关联,我创建了这个类图: < li >如何对第一个关联(在< code>ProjectManager和< code>P

  • 本文向大家介绍Java Annotation注解相关原理代码总结,包括了Java Annotation注解相关原理代码总结的使用技巧和注意事项,需要的朋友参考一下 Java.lang 中自带的注解 @Override:表示当前的方法定义将覆盖基类的方法。如果你不小心拼写错误,或者方法签名被错误拼写的时候,编译器就会发出错误提示。 @Deprecated:如果使用该注解的元素被调用,编译器就会发出警

  • 本文向大家介绍关于Ajax的原理以及代码封装详解,包括了关于Ajax的原理以及代码封装详解的使用技巧和注意事项,需要的朋友参考一下 前言 其实AJAX内部实现并不麻烦,主要通过一个叫XMLHttpRequest的对象,而这个对象在现有的浏览器均被支持。 可以说,它是整个AJAX实现的基础,是浏览器用于后台与服务器交换数据的对象,有了它,才有了AJAX,也便有了部分页面刷新的艺术! 本文主要给大家介

  • 我必须将下面的Java代码转换成一个UML图,但是我不确定是否正确地完成了类之间的关联。请你告诉我UML图是否正确。