7

我有一个关于在 UML 图中指示多重性的问题。

我有一个 SpriteObject 类,它有一个动画列表。SpriteObject 可以有 0..* 动画。所有的动画都是在 SpriteObject 内部创建的,它们本身并不存在。

我不是 100% 确定我应该如何用多重性来表示这一点。在网上搜索后,我发现了以下 3 个选项:

选项 1:多重性应该这样表示,因为每个 SpriteObject 都有 0 个或多个动画。SpriteObject 一侧没有指示多重性,因为动画不知道 SpriteObject 的存在。 在此处输入图像描述

选项2:应该像这样在两边指示多重性,因为我们需要指示两个类之间的局部关系,因此1个SpriteObject有0个或多个动画。 在此处输入图像描述

选项3:像这样在两边都应该标明多重性,因为我们需要能够阅读多重性并将其理解为整体(游戏)的一部分。游戏可以包含 0..* SpriteObjects,SpriteObject 可以包含 0..* Animations。这就是为什么 0..* SpriteObjects 有 0..* 动画 在此处输入图像描述 谁能告诉我哪个选项是正确的?(如果有的话)

4

4 回答 4

8

[编辑]

应该是Option 1。这是一种组合关系

这意味着 SpriteObject 包含并管理动画对象的生命周期。

举个例子。

public class SpriteObject : IDispose
{
  private List<Animation> animations;

  // constructor
  public SpriteObject()
  {
    animations = new List<Animations>();

    // initialise the list
  }

  public ovveride Dispose()
  {
    // clear list
  }
}

如果这是一个聚合关系。

在此处输入图像描述

注意符号,空心菱形。这是一个聚合关系。这意味着一个 SpriteObject 实例可以有零个或多个 Animation 实例,但 Animation 对象的生命周期不依赖于 SpriteObject 的生命周期。

AC# 代码示例如下所示:

public class SpriteObject
{
  private List<Animation> animations;

  // constructor
  public SpriteObject(List<Animation> animations)
  {
    this.animations = animations;
  }
}
于 2014-01-27T01:44:40.290 回答
5

对于多重性部分- 如果您在任何地方省略多重性信息(组成、聚合、关联端、属性、部分......),根据 UML 规范,这意味着 - 您没有提供信息,它是未知的或不相关的.

您可以选择为您的模型提供默认值(UML 语言规范本身并没有为用户模型指定默认多重性值)。大多数 UML 用户只选择一个 [1] 的默认值,但我见过其他选择的默认值,例如 [0..*]。没有正式的方法来定义 UML 模型的多重性的默认值,您必须以其他方式(介绍性文本段落、评论等)告知读者您的模型。

如果您遇到不提供此信息的模型,最安全的假设是默认多重性设置为 [1]。

从这个角度来看,我会假设案例 1 和案例 2 是相同的。

对于组合部分——组合关系的语义,根据UML规范,如下: “composite:表示Property被组合聚合,即组合对象对组合对象的存在和存储负责(见定义11.2.3) 中的部分。") - 所以这条规则适用于对象,而不是类。

确实,所有组合对象都必须遵守此规则,但这并不一定意味着您的所有动画对象都必须在 sprite 中组合。您的介绍启动屏幕上可能有一个不属于任何精灵的动画。另一方面,组合对象(部分)确实不能同时组合成几个组合对象(整体)。

因此,可能的情况是:

  1. 合成的 Sprite 端的多重性为 0..1 - 这意味着某些动画是 sprite 的一部分。这些动画及其生命周期由这些精灵管理。除此之外,系统中可能还有其他独立于精灵的动画。
  2. 恰好为 1 的多重性(明确设置,如案例 2 中,或默认情况下,可能,如案例 1) - 这意味着动画的所有实例都必须是某些精灵的一部分。
  3. 其他多重情况,上限大于 1 - 好吧,因为我不能共享组合部分,组合的语义禁止我在每个动画中拥有多个精灵实例。

或许在最后一点主题评论:

将多重性设置为,比如说 0..* 在组合的 sprite 端仍然会产生有效的 UML(从抽象语法的角度来看)。这没有多大意义,读者可能会假设某种错误,但是当您考虑它时,您可以创建尊重所有结构和语义约束的实例模型,只需“不使用”具有多个的可能性每个动画的精灵。这就像说您希望某个数字同时大于 0 和 10。没有错,只是可以用更简单易懂的方式来指定。

于 2017-07-24T14:27:42.073 回答
1
  • 第三个是不正确的。一行写的是一种关系的一个实例(这次是关联)。您正在描述其功能。为了更好的感觉,你最好给它命名。例如,将animationList放在连接的右侧。这意味着,每个动画列表都连接到一个 spriteObject(很可能通过归属)和许多动画(它们宁愿成为列表中的项目)。

  • 第一个变体也不同。它没有定义左侧的多重性。所以,它可以是你想要的意思,但它也可以是别的意思,你不是这个意思。如果您还没有决定关联不是列表结构,而是更复杂的东西,可以连接到几个或零个 spriteObjects,那么就可以了。

您在所有三张图片中也有一个错误 - 如果会有一些从精灵到动画的函数引用,反之亦然,您必须在右侧放置一个箭头。

如果您已经确定连接实际上是 spriteObject 的一个属性,您可以通过在右箭头和右类之间放置一个点来更精确地显示它。在大多数工具中,它是通过设置classifier's owning关联的右端来设置的。

将多重性放在末端是一个非常好的想法。而且不仅是他们。您在聚合中放置的信息越多:名称、箭头、点、可见性,您就越能更好地理解自己的模型,并且您更有可能注意到一些问题。

顺便说一句,当您在侧面没有箭头时(与在两个箭头上都有箭头相同),它可以显示两种不同的变体:一件知道两侧实例的事物,或者(更经常)同时发生两件事 - 两种不同两个不同类的两个不同实例的属性——一端是从右到左的引用,另一端是从左到右的引用。那么点就变得非常必要了。

于 2014-01-26T12:25:38.803 回答
1

我会直接拒绝选项 3,因为您提到该Animation实例不能单独存在,而且我会非常惊讶同一个实例可能与多个SpriteObject实例相关。

下一个问题是Animation实例是否引用了它的SpriteObject所有者?如果不是,您选择选项 1。

于 2014-01-26T11:33:06.030 回答