【问题标题】:Using Association Class or just Association arrow使用关联类或仅使用关联箭头
【发布时间】:2021-04-06 00:20:14
【问题描述】:

我目前正在一起学习 OOP 和 UML,对于使用 关联类 或仅使用 普通关联 存在混淆。假设一个 Company 雇用 Person,据我所知有两种方法可以关联他们,第一种方法只是常规类型的关联(我认为这是聚合) 像这样。 Regular association

第二种方法是使用关联类,有点像 ER 图,但 Company 类不再有责任雇用任何 Person

我的问题是:

  1. 哪一个是正确的? (似乎第二个更有意义,但第一个也没有错)
  2. 如果第一种方式没有错,那么公司不会对了解太多吗?
  3. 在什么情况下我会考虑使用关联类而不是常规的关联

【问题讨论】:

  • 只是提示:您的(Mickeysoft?)工具使用了人造箭头。 UML 使用开放箭头(细线)表示有向关联。这是与扩展关系的混合。

标签: java c# oop uml object-oriented-analysis


【解决方案1】:

您的关联不是聚合,聚合有一个空菱形 (<>),所以它是一个简单的关联。

即使在可导航的情况下,关联的结尾也没有名称,那么如果您不想要属性,为什么要使用关联而不是可能是依赖项呢?当然,如果它不是一个关联,你就不能有一个关联类。

在类Company中我们可以看到属性Employees,你确定不想要吗:

您将关联命名为操作(hire),当然可以,但是关联只是表示语义关系,所以hire不代表操作。

正如@Axel Scheithauer 在他的answer 中正确所说,在关联类的情况下,类的名称和关联的名称是公共属性,不能重复,因此不能与@987654325 不同@ § 11.5.3.2 关联类第 200 页:

Association 和 Class 都是 Classifiers,因此具有一组共同的属性,例如能够拥有 Features, 具有名称等。这些属性是从同一构造(分类器)多重继承的,并且不重复。 因此,AssociationClass 只有一个名称,并且具有为 Classes 和 协会。

关于使用关联还是关联类是一个选择。

如果您想知道公司雇用员工的日期和员工薪水(雇用时/当前),那么肯定协会级是一个不错的选择,可以清楚地显示您想要什么。

但您也可以将 Onboarding 作为关联类之外的第三类,并在这 3 个类之间建立关联:

你还可以将日期和薪水作为 Person 的属性,假设一个人是必要的员工:

否则,您可以让类 Employee 继承 Person 并具有这些附加属性:

您有 Java 和 C# 作为标记,这些语言都不支持关联类,因此即使您在 UML 中使用关联类,在 Java / C# 中实现它时,您也可能会使用其他两种解决方案之一。


因为没有双向导航,公司知道他的员工,但员工不知道他/她工作的公司,你真的想要吗?

【讨论】:

  • 惊人的解释!在使用双向关联/可导航性时,我总是有疑问,这是否意味着代码中的循环依赖?或者,我可以在uml中使用双向关联,然后当我在代码中实现它们时,我会做其他事情以避免循环依赖?
  • @kjunz 肯定双向关联比方向关联更复杂,所以不要在代码中无用地使用它们,但是当需要它并且替代选择更复杂/不清楚时更好地使用双向关联。我鼓励您在 UML 和实现中使用相同的方法,否则 UML 模型不会记录/表示您的代码,那么为什么要拥有它呢?
【解决方案2】:

我同意布鲁诺在回答中所说的一切。但是,我要添加第三种可能性:一个简单的 Class

如果两个类之间的关系具有属性,您有两种选择:一个关联类或一个与这两个类关联的简单 .采用关联类的唯一优点是,您可以指定两个关联类的每对实例只能链接一次。这意味着,每个人只能为同一家公司工作一次。这不太现实。为了允许多个链接,您需要为关联类的关联端指定{non unique}{unique} 是默认值)。所以,只有在{unique} 的情况下,关联类才添加语义。如果不需要,我会避免它。

补充一点:关联类是一个元素,但它在图中显示了两次,一次是矩形,第二次是线。由于它们表示相同的元素,因此名称必须相同。

【讨论】:

  • 正确查看类和关联的通用名称(我编辑了我的答案),值得 UV ;-)
猜你喜欢
  • 1970-01-01
  • 2010-12-26
  • 2017-10-27
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多