【问题标题】:How to depict index of elements of ordered collection in UML diagrams?如何在 UML 图中描述有序集合元素的索引?
【发布时间】:2020-12-14 16:43:48
【问题描述】:

我想在 UML 对象图中描述有序集合的元素索引。 我能在UML Spec 2.5.1 中找到的唯一信息是关于关联语义的部分 11.5.3.1。

当关联的一个或多个末端被排序时,链接除了它们的末端值之外还携带排序信息。

但是要么没有关于此类订购信息的符号的指导,要么我只是没有找到它。我想我在某些工具中看到了冒号后跟索引。我想知道对于如何在链接上描述索引是否有共识或参考?

编辑:
尽管现有答案已经是整体的,但让我添加一些说明和上下文。正如第一句话已经说过的,我想在对象图中使用这个明确的信息(也许括号很混乱,我删除了它们)。对象图用作测试用例规范的一部分,以传达输入、预期结果和实际结果的对象结构。在这方面,集合中对象的顺序可能会发挥作用,例如,想象一个测试用例规范以正确实现排序算法的规范。

我没有特意指定集合的​​类型,因为我看不出只要集合是有序的,这会如何影响答案。通常,我会想到一个序列/列表。

在这种情况下我不需要 OCL,但考虑到这一点,我很欣赏这个答案,因为对集合元素的顺序制定约束是密切相关的。

【问题讨论】:

  • 你的收藏是什么?如果索引是 0, 1, 2, ... 描述元素的索引有什么兴趣?不确定是否理解你...
  • @qwerty_so op 想知道是否有办法记录指定订购或使用订购信息。
  • @Christophe 这里的问题是 OP 没有做出反应来帮助我们理解目标。如果元素是类的实例,则可能是显示这些实例的对象图,每个实例都有一个相关的注释,指示索引是否足够?但我们甚至不知道目标是仅仅显示(作为注释)还是指定。目前唯一的可能性是关闭这个问题,因为它根本不清楚,直到 OP 的澄清
  • Johnson,您能否编辑您的问题并澄清一下:1)您的意思是对象还是类图? 2)如果要在约束中使用索引,根据一些属性定义明确的排序,或者表示一些对象实例的索引号?
  • @bruno 很抱歉花了一些时间对 cme​​ts 做出反应。我没想到stackoverflow条目会带来那种时间压力。实际上,我认为考虑在问题发布的同一天因为缺少部分而关闭问题有点苛刻(从 OP 的角度来看,这可能不是那么明显的缺失)。

标签: collections uml diagram notation


【解决方案1】:

UML

没有预见到在 UML 中表示有序集合的索引。在第 7.5.3.2 节中,定义了排序对于具有多重性的元素是有意义的:

如果 MultiplicityElement 被指定为有序(即isOrdered 为真),则此元素实例中的值集合是有序的。这种排序暗示存在从正整数到值集合元素的映射。如果 MultiplicityElement 不是多值的,则 isOrdered 的值没有语义效果。

映射的正整数对应于您所谓的索引。但是 UML 规范中没有定义任何内容:即使索引应该从 0、1 或任意值开始,也没有定义。甚至没有说索引必须是连续的。

UML 规范在同一部分解释了有序集合的语义还取决于其元素的唯一性:

isOrdered    isUnique    Collection Type
false        true        Set
true         true        OrderedSet
false        false       Bag
true         false       Sequence

很遗憾,OrderedSetSequence 没有在 UML 规范中定义。

更精确地定义排序的唯一情况是定义为派生联合的属性(第 9.5.3 节):

然后,联合的顺序是通过按照子集属性在allAttributes() 的结果中出现的顺序评估子集属性并连接结果来定义的。

结论: ¨没有办法定义顺序是什么(例如将顺序链接到某些属性),并且没有预见到引用顺序中的索引。

OCL

OCL 语言是 UML 的伙伴。它用于编写更正式和更精确的约束。它为集合定义了更多语义:

OrderedSet 是一个集合,其中的元素是有序的。它不包含重复项。 OrderedSet 本身就是元类型 OrderedSetType 的一个实例。 OrderedSet 不是 Set 的子类型,也不是 Sequence 的子类型。 Sets 和 OrderedSets 的常见超类型是 Collection。

sequence 是一个集合,其中的元素是有序的。一个元素可能不止一次地成为一个序列的一部分。 Sequence 本身就是元类型 SequenceType 的一个实例。 序列不是 Bag 的子类型。 Sequence 和 Bag 的常见超类型是 Collection。

OCL 在可用于SequenceOrderedSet 的几个操作中使用索引的概念:

  • 表达式 at(i) 标识第 i 个元素
  • 表达式indexOf(v)返回元素v的索引
  • 表达式first()返回第一个元素,被理解为它的索引是1
  • 表达式 last() 返回最后一个元素,据了解它的索引对应于集合的大小。

这些表达式与有序集合相关,而不是为无序集合(例如集合和包)定义。

结论您可以通过 OCL 在 UML 约束中使用索引,甚至可以在约束的帮助下将它们关联到属性的顺序

编辑:关于对象图的更多信息

对象图表示对象的实例。因此,这些对象之间的关联线代表您引用中提到的“链接”。

虽然存在指定对象属性值的符号,但没有为链接定义任何内容:

  • 务实地说,您可以只对链接的结尾进行编号(不应与多重性混淆,因为它是链接而不是关联)。如果您担心混淆,可以在号码前加上非正式的#Nr.
  • 或者,如果您必须保持 100% 合规,您可以将订单信息放在注释符号中。
  • 阅读第 126 页第 9.8.4 节,并考虑使用 = 来指定实例中的值,我认为可以说 order=1 是有效的,因为唯一尚未为通过两端实例的链接是订购信息。

【讨论】:

  • 现在我看到 OP 谈到了对象图。 OCL 在那里没有意义,不是吗?
  • @qwerty_so 我以为是类图。但是在对象图中,{ordered} 有意义吗?确实是一个模棱两可的问题。
  • @qwerty_so 要求进一步澄清,希望约翰逊能回答。如果不是,我仍然很高兴看到这个问题,因为除了在相关时添加一些纯文本评论之外,我从未想过它。
  • 也许我在问题中引用的 订购信息 是一些以前版本的 UML 的遗留物,或者只是没有得到足够的关注而无法完全制定。所以看起来我需要自己选择一些合适的表示。
  • @Johnson 确实,对象图表示对象的实例,而关联线实际上表示您引用中提到的“链接”。虽然存在用于指定对象属性的符号,但没有为链接定义任何内容。务实地说,您可以只对链接的结尾进行编号(不要与多重性混淆,因为它是链接而不是关联)。如果您担心一些混淆,请在数字前加上非正式的 #Nr.。或者,如果您必须保持 100% 合规,请将此信息放在注释符号中。阅读 9.8.4 pg 126 我认为order=1 可能是有效的
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多