问题描述
我目前正在一起学习 OOP 和 UML,关于使用关联类或仅使用普通关联存在混淆。假设一个公司雇用个人,据我所知有两种方法可以将它们关联起来,第一种方式只是常规类型的关联(我认为这是聚合) 像这样。
Regular association
第二种方法是使用关联类,有点像 ER 图,但 Company 类不再负责雇用任何 Person。
我的问题是:
- 哪个是正确的? (似乎第二个更有意义,但第一个也没有错)
- 如果第一种方式没有错,那么公司会不会对人了解太多?
- 在什么情况下我会考虑使用关联类而不是常规的关联?
解决方法
你的关联不是聚合,聚合有一个空菱形 (<>
),所以它是一个简单的关联。
即使在可导航的情况下,也没有任何关联结尾具有名称,那么如果您不想要属性,为什么要使用关联而不是可能是依赖项?当然,如果不是关联,则不能有关联类。
在类Company中我们可以看到属性Employees,你确定你不想要:
或
您将关联命名为操作(hire),当然可以,但是关联只是代表语义关系,所以hire不代表操作。
正如@Axel Scheithauer 在他的 answer 中所说的那样,如果是关联类,类的名称和关联的名称是公共属性,不得重复,因此不能不同,来自 formal/2017-12-05 § 11.5.3.2 关联类第 200 页:
Association 和 Class 都是分类器,因此有一组共同的属性,比如能够拥有特征, 具有名称等。这些属性是从同一构造(分类器)多次继承的,并且不会重复。 因此,一个 AssociationClass 只有一个名称,并且具有为 Classes 和 关联。
关于使用关联或关联类是一种选择。
如果您想知道公司聘用员工的日期和员工的工资(聘用时/当前),那么协会课程是一个很好的选择,可以清楚地表明您的需求。
但是您也可以将入职作为关联类中的第三个类并在三个类之间建立关联:
并且您还可以将日期和工资作为 Person 的属性,假设一个人是一个雇员:
否则,您可以让 Employee 类继承 Person 并具有以下附加属性:
你有 Java 和 C# 作为标签,这些语言都不支持关联类,所以即使你在 UML 中使用关联类在 Java/C# 中实现它,你也可能会使用其他两种解决方案之一。
>因为没有双向导航,公司知道他的员工,但员工不知道他/她工作的公司,你真的想要吗?
,我同意布鲁诺在他的回答中所说的一切。但是,我会添加第三种可能性:一个简单的 Class。
如果两个类之间的关系具有属性,您有两个选择:关联类或与两个类关联的简单类 .采用关联类的唯一优点是,您可以指定两个关联类的每对实例只能链接一次。这意味着,每个人只能在同一家公司工作一次。这不太现实。为了允许多个链接,您需要为关联类的关联端指定 {non unique}
({unique}
是默认值)。因此,只有在 {unique}
的情况下,关联类才会添加语义。如果不需要,我会避免它。
另外一个注意事项:关联类是一个元素,但它在图表中显示了两次,一次显示为矩形,第二次显示为一条线。由于它们表示相同的元素,因此名称必须相同。