【发布时间】:2020-05-29 20:54:33
【问题描述】:
【问题讨论】:
标签: uml class-diagram
【问题讨论】:
标签: uml class-diagram
为什么角色类属性不能只在人员类中?
注意多重性1..*,如果您将 position 和 description 移动到 Person 您必须管理它们的集合并关联每个到相应的公司。
[根据您的评论]
对于给定的 Person,position 和 description 取决于每个关联的 Compagny,因此不可能拥有您建议的字段,除非 position 和 description 都是一个集合,并且有一种方式/规则来知道 position 中的哪个条目和 description 对应正确的 Compagny。
将这些信息也移动到 Person 中会消除对称性,也可以将这些信息移动到 Compagny 中,与 Person
关联类既是类又是关系,当您用 C++ 或 Java 等语言实现它时,当然不存在该概念,因此一种方法是您建议将字段移至两者之一类,或创建第三个类,该类的预期字段不止一个到Person,一个到Company。
第三类的优点是将所有相关信息分组,相当于:
例如,对象图可以是:
如果没有第三类,您需要知道如何关联所有分离的信息,例如在 Person 中使用三个向量来记住公司、职位和描述的所有信息,您可以使用相同的索引值总而言之,但这不太清楚,当您为 Person 添加/删除 Company 时,您必须更新所有这些向量。
【讨论】:
假设我们生活在这样一个世界中,一个人必须在公司中扮演一个角色才能生存,而公司可能在没有人的情况下存在。
如果这就是您想了解的关于人和公司之间关系的全部信息,即只有存在这种关系这一事实,仅此而已,您可以这样建模:
然后,如果您希望另外捕获Person的角色的position和description,则使用所谓的AssociationClass(Role in我们的案例):
Role 的每个实例都有四个属性(属性和关联的结尾都是 UML 中的属性):
例如,假设一个名为 Scott Tiger 的人在两家公司担任职务 - Food Inc 和 Water Ltd,并且每个公司都知道 em>Scott Tiger 在其中发挥了作用。那么就会有Role的两个实例(显示为元组):
(Food Inc., Scott Tigger, eater, eats here)
(Water Inc., Scott Tigger, drinker, drinks here)
现在,回到您的问题,应该清楚的是,Person 和 name、position、description 属性的实例实际上“缺少”Company,如果您“添加”@987654340 @你会得到Role,而不是Person!
所以你在问题末尾提出的是一个有效的设计,如果你对Company 和Role 建模并且一个人只是Role 的一个属性:
其内容如下:Company 的每个实例有零个或多个Roles,Role 的每个实例只有一个Company。关联的两端都是可导航的,即Role 知道它的Company,Company 知道它的Roles。
UML Specification 在条款 9.5.3 中为您提供以下建议:
一个属性可以代表一个分类器的一个属性,一个协会的一个memberEnd,或者在某些情况下两者同时。
对于一般建模场景的一个有用约定是,类型为类的属性是关联 end,而类型是一种 DataType 的属性不是。 UML 不强制执行此约定。
【讨论】: