问题描述
我目前正在 UML 中为电影测试域创建类图。我想知道我是否做得对。好吧,我有两个选择(第一张图片中的第一个版本,第二张图片中的第二个 - 我认为第一个更好)。我想知道我是否正确建立了所谓的“关系所有者”,即关系从哪个类走向哪个方向。我也不知道我是否没有弄错多重性(一对一、一对多等)。
所以在我的域中,我当然希望拥有电影,包括主演这些电影的演员和导演。我想知道在这种情况下类名“角色”是否合适,因为我的意思是参与电影的所有角色 - 可以是导演、演员,但也可以是“蝙蝠侠”。也许我应该在这里区分“电影角色”和“人类”、“怪物”等等。但是我不知道如何优雅地做到这一点,我会从Character类继承吗?我还想知道我是否不应该将 City 或 Country 之类的类放在一个名为 Address 的类中 - 但我希望这些类具有像在这种情况下这样的属性,一个是 Master,另一个是细节 - 以及关系集在正确的方向。我只使用了继承和依赖等关系,我不知道在这种情况下我是否应该改变一些东西。
版本 1
版本 2
预先感谢您的任何建议或意见!
解决方法
简而言之
非常小心地使用继承。首选 association over inheritance 当您的继承不是一个对象从出生到死亡的永久真理时。并且请记住,类之间的依赖关系不会对这些类的对象做出任何承诺。
更多解释
对 UML 语法的一些说明:
- 我知道您以空心小三角形结尾的普通粗线表示专业化/泛化关系(又名继承)。如果这是正确的,三角形应该更大以避免视觉混乱。此外,多重性对继承没有意义,应该删除。
- 我知道您打算用虚线表示与多重性的关联。如果这是正确的:
- 关联应该是纯线条,因为虚线表示依赖关系,而多重性没有意义。
- 您赋予箭头的含义是不清楚的。您是否使用它们来记录适航性?如有疑问,请将其删除。如果要记录关联端的所有权,请改用点表示法。 (我们不能说它是对还是错,因为这取决于您的模型如何看待关联)
鉴于您的评论和其中链接的第三个模型,您需要记住一些关键的 UML 语义:
- 继承是一种超强关系,这意味着“是(总是)”。在您的示例中,您可能会说
Actor
始终是Person
,因此,您所说的关于Person
的所有内容也适用于Actor
。顺便说一句,您应该避免重复继承的属性或方法,因为这可能会造成一些歧义。 - 继承不能替代聚合、组合或关联。例如,您不能说
CrewMember
(一个人)总是一个Crew
(一群人)。CrewMember
属于Crew
,但有些事情是工作人员可以一起做而单个成员不能。 - 如果不总是正确的,则继承不合适。例如,
Character
通常可能是Person
。但并非总是如此;:您可以有幽灵角色、漫画角色、机器人角色或动物。 - 关联意味着关联类的某些实例之间存在某种结构关系。例如,一个或几个人住在一个城市,这似乎是一个非常相关的关联。
- 依赖意味着一个类依赖于另一个类,即没有另一个类它将无法工作或丢失某些东西。这是关于类而不是对象的声明。 IE。如果您想说
Person
依赖于City
,您只需说类 Person 在不知道 City 的情况下将无法工作(例如,因为操作sendPostCardFrom(city: City)
需要一个参数type) 但你没有说任何关于人 X、Y 和 Z。如果你想让 X、Y 和 Z 与城市 a、b 和 c 相关,你需要一个关联。
关于模型内容,我不会为你决定,没有唯一的真理。因此,我更愿意提请您注意潜在问题。我以问题的形式提出它们,由您根据自己的答案调整模型:
-
两种变体之间的共同问题:
-
Actor
和Director
真的是Persons
吗?在这种情况下,同时是演员和导演的人(例如克林特·伊斯特伍德)怎么办?还是Actor
和Director
只是Persons
为给定的Movie
所扮演的角色? - 一个
Character
真的只与 1 个Movie
相关吗?同一个角色出现在多部电影中的印第安纳琼斯怎么办? - 以类似的方式,我想知道是否真的有一个
Person
住在City
中,或者这是否不应该是多对多关联?
-
-
关于差异的问题:`
- 版本 1 中的
Person
是Character
(继承)吗?还是Character
是Person
的表示(关联:表示)? - 版本 2 中的
Character
是否真的是Actor
并且通过传递性也是Person
(继承)?还是Character
仅与Actor
(关联:播放)相关联?
- 版本 1 中的
这由你决定,但无论我问什么关于关联或继承的问题,你最好在使用继承之前三思而后行(即更喜欢关联/组合而不是继承)