7.5.11 集合

关联的单次导航产生一个Set,组合导航产生一个Bag,在对有{ordered}修饰的关联导航时产生一个OrderedSet。因此,OCL标准库中定义的集合类型在OCL表达式中发挥着重要的作用。

类型Collection在OCL中是预定义的。Collection定义了许多预定义的操作以用于OCL表达式操纵集合。与OCL作为一门表达式语言的定义相一致,集合操作从不改变集合;isQuery总是为真。它们可以产生一个新集合,但从不改变原有集合。

Collection是一个抽象类型,它有具体子类。OCL区分了3种集合类型:Set、Sequence和Bag。Set是一个数学意义上的集合,不包含重复元素。Bag与Set类似,但允许包含重复元素(即相同原始可以出现多次)。Sequence与Bag类似,但其中的元素是有序的。Bag和Set没有定义次序。

集合字面量

在OCL中,Set、Sequence、Bag可以使用字面量来指定。它们使用大括号将集合元素包裹起来,元素之间用逗号分隔。集合的类型写在大括号之前:

Set {1, 88, 5, 2}
Set {'strawbery', 'apple', 'orange'}
Sequence {45, 3, 3, 2, 1}
Sequence {'ape', 'nut'}
Bag {1, 2, 4, 3, 5}

由于连续整数序列很有用,还有另外一种字面量可以创建它。可以用一个区间规约来代替大括号内的元素,该表示法包括两个整型表达式Int-expr1 Int-expr2,它们之间用‘..’来分隔。这表示了位于Int-expr1Int-expr2之间的所有整数,也包括Int-expr1Int-expr2自身:

Sequence {1..(6+4)}
Sequence {1..10}
--都等同于
Sequence {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

集合操作的完整列表在第11章(OCL标准库)介绍。

可以通过上面介绍的字面量来指定集合。其它获得集合的方式是通过导航。更准确一点,获得一个Set、OrderedSet、Bag的方法如下:

  1. 字面量:
Set {2 , 4, 1 , 5 , 7 , 13, 11, 17 }
OrderedSet {1 , 2, 3 , 5 , 7 , 11, 13, 17 }
Sequence {1 , 2, 3 , 5 , 7 , 11, 13, 17 }
Bag {1, 2, 3, 2, 1}
  1. 从单一对象的导航产生一个集合:

    context Company inv:
    self.employee
    
  2. 集合上的操作可能产生新的集合:

collection1->union(collection2)

results matching ""

    No results matching ""