包含电影的域的 UML 类图

问题描述

我目前正在 UML 中为电影测试域创建类图。我想知道我是否做得对。好吧,我有两个选择(第一张图片中的第一个版本,第二张图片中的第二个 - 我认为第一个更好)。我想知道我是否正确建立了所谓的“关系所有者”,即关系从哪个类走向哪个方向。我也不知道我是否没有弄错多重性(一对一、一对多等)。

所以在我的域中,我当然希望拥有电影,包括主演这些电影的演员和导演。我想知道在这种情况下类名“角色”是否合适,因为我的意思是参与电影的所有角色 - 可以是导演、演员,但也可以是“蝙蝠侠”。也许我应该在这里区分“电影角色”和“人类”、“怪物”等等。但是我不知道如何优雅地做到这一点,我会从Character类继承吗?我还想知道我是否不应该将 City 或 Country 之类的类放在一个名为 Address 的类中 - 但我希望这些类具有像在这种情况下这样的属性一个是 Master,另一个是细节 - 以及关系集在正确的方向。我只使用了继承和依赖等关系,我不知道在这种情况下我是否应该改变一些东西。

版本 1

Version 1

版本 2

Version 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 相关,你需要一个关联。

关于模型内容,我不会为你决定,没有唯一的真理。因此,我更愿意提请您注意潜在问题。我以问题的形式提出它们,由您根据自己的答案调整模型:

  • 两种变体之间的共同问题:

    • ActorDirector 真的是 Persons 吗?在这种情况下,同时是演员和导演的人(例如克林特·伊斯特伍德)怎么办?还是 ActorDirector 只是 Persons 为给定的 Movie 所扮演的角色?
    • 一个 Character 真的只与 1 个 Movie 相关吗?同一个角色出现在多部电影中的印第安纳琼斯怎么办?
    • 以类似的方式,我想知道是否真的有一个 Person 住在 City 中,或者这是否不应该是多对多关联?
  • 关于差异的问题:`

    • 版本 1 中的 PersonCharacter(继承)吗?还是 CharacterPerson 的表示(关联:表示)?
    • 版本 2 中的 Character 是否真的是 Actor 并且通过传递性也是 Person(继承)?还是 Character 仅与 Actor(关联:播放)相关联?

这由你决定,但无论我问什么关于关联或继承的问题,你最好在使用继承之前三思而后行(即更喜欢关联/组合而不是继承)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...