Collections 如何在UML图中描述有序集合元素的索引?

Collections 如何在UML图中描述有序集合元素的索引?,collections,uml,diagram,notation,Collections,Uml,Diagram,Notation,我想在UML对象图中描述有序集合元素的索引。 我能在中找到的唯一信息是关于关联语义的部分11.5.3.1 当关联的一个或多个端点被排序时,链接除了其端点值之外还携带排序信息 但是,要么是没有关于这种订购信息的符号的指导,要么就是我没有找到它。我想我在一些工具中看到了一个冒号后跟索引。我想知道对于如何描述链接上的索引是否有共识或参考 编辑: 虽然现有的答案已经是全面的,但让我补充一些澄清和背景。正如前面的第一句话所述,我想在对象图中使用这个显式信息(可能括号混淆了,我删除了它们)。对象图用作测试用

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

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

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

编辑:
虽然现有的答案已经是全面的,但让我补充一些澄清和背景。正如前面的第一句话所述,我想在对象图中使用这个显式信息(可能括号混淆了,我删除了它们)。对象图用作测试用例规范的一部分,用于传达输入的对象结构、预期结果和实际结果。在这方面,集合中对象的顺序可能发挥作用,例如,想象一个测试用例规范,用于正确实现排序算法的规范

我没有特意指定收集的类型,因为我不认为只要收集是有序的,这会对答案产生什么影响。通常,我会想到一个序列/列表

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

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

如果将乘法元素指定为有序(即,
isOrdered
为true),则该元素实例化中的值集合是有序的。这种排序意味着存在从正整数到值集合元素的映射。如果MultiplicationElement不是多值的,则isOrdered的值没有语义效果

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

UML规范在同一节中解释,有序集合的语义也取决于其元素的唯一性:

isOrdered    isUnique    Collection Type
false        true        Set
true         true        OrderedSet
false        false       Bag
true         false       Sequence
不幸的是,UML规范中没有定义
OrderedSet
Sequence

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

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

结论:¨无法定义订单是什么(例如,将订单链接到某些属性),并且预计不会引用订单中的索引

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

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

序列是元素有序的集合。一个元素可以是序列的一部分不止一次。序列本身是元类型SequenceType的实例。 序列不是Bag的子类型。序列和包的常见超类型是集合

OCL在可用于
Sequence
OrderedSet
的多个操作中使用索引的概念:

  • 在(i)处的表达式
    标识了元素的i
  • 表达式
    indexOf(v)
    返回元素v的索引
  • 表达式
    first()
    返回第一个元素,其索引为1
  • 表达式
    last()
    reutrn最后一个元素,因为它的索引对应于集合的大小
这些表达式与有序集合相关,不为集合和行李等无序集合定义

结论通过使用OCL,您可以在UML约束中使用索引,甚至可以在约束的帮助下将它们与属性联系起来

编辑:有关对象关系图的更多信息 对象图表示对象的实例。因此,这些对象之间的关联线表示报价中提到的“链接”

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

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