8.2.2 用于类型包的操作和良构规则
BagType
[1] bag类型的名称是“Bag”,后面跟着元素类型名称。
context BagType
inv: self.name='Bag('+ self.elementType.name +')'
BooleanType
allInstances(): Set(Boolean) 返回 Set {true, false}
CollectionType
[1] 集合类型的名称是“Collection”,后面跟元素类型的名称。
context CollectionType
inv: self.name='Collection('+ self.elementType.name + ')'
InvalidType
allInstances(): Set(OclInvalid) 返回 invalid,因为在表示法上 Set {invalid} 不是良构的。
MessageType
[1] MessageType具有一个到信号或操作的链接,不能二者兼之。
context MessageType
inv: referredOperation->size() + referredSignal->size() = 1
[2] 所引用的操作的参数成为MessageType实例的属性。
context MessageType
inv: referredOperation->size()=1 implies
Set {1..self.ownedAttribute->size()}->forAll(i | self.ownedAttribute.at(i).cmpSlots(
referredOperation.ownedParameter.asProperty()->at(i)))
[3] 所引用的信号的属性成为MessageType实例的属性。
context MessageType
inv: referredSignal->size()=1 implies
Set {1..self.ownedAttribute->size()}->forAll(i | self.ownedAttribute.asOrderedSet().at(i).cmpSlots(
referredSignal.ownedAttribute.asOrderedSet()->at(i)))
OrderedSetType
[1] 该类型的名称是“OrderedSet”,后面跟元素类型名称。
context.OrderedSetType
inv: self.name='OrderedSet(' + self.elementType.name + ')'
SequenceType
[1] 序列类型的名称是“Sequence”,后面跟元素类型名称。
context SequenceType
inv: self.name = 'Sequence(' + self.elementType.name + ')'
SetType
[1] 该类型的名称是“Set”,后面跟元素类型名称。
context.SetType
inv: self.name='Set(' + self.elementType.name + ')'
TupleType
[1] 元组类型的名称包括每个成员的名称及其类型。
context TupleType
inv: name= 'Tuple('.concat (
Sequence{1..allProperties()->size()}->iterate(pn; s: String = '' |
let p: Attribute = allProperties()->at(pn) in (
s.concat (
(if (pn > 1) then ',' else '' endif)
.concat(p.name).concat(':')
.concat(p.type.name)
)
)
)
).concat(')')
[2] 元组类型的成员具有唯一的名称。
context TupleType
inv: --总为真,因为属性具有唯一名称
[3] TupleType实例只有是元组成员的特征。
context TupleType
inv: feature->forAll(f | f.oclIsTypeOf(Property))
VoidType
allInstances(): Set(OclVoid) 返回 Set{null}。