12.8 初始值表达式
初始值表达式是一个可以链接到由一个分类符或关联所拥有的一个属性的表达式。属性的初始值OCL表达式的类型必须符合该属性的OCL类型。当属性的multiplicity的上限是1,那么该属性的OCL类型是该属性的UML类型。当multiplicty的上限大于1时,属性的OCL类型是一个集合类型,其中的元素类型是该属性的UML类型。集合的种类(Bag、OrderedSet、Dequence、Set)由该属性的是否唯一和有序UML属性来决定。
该OCL表达式在拥有该属性的实例创建的时候(且该属性有初始值的情况下)被计算。对于关联端有初始值的情况,该OCL表达式在该关联的另一端分类符实例被创建时被计算。
UML元模型中属性初始值的位置如图12.4所示(译者注:原文是图12.5,是错误的),如下的良构规则必须要满足。该规则还定义了上下文分类符的值。
注意-关联端初始值的位置取决于UML 2.0元模型。因此有如下的良构规则。
图12.4 Expression used to define the initial value of an attribute
12.8.1 良构规则
[1] 该表达式是一个属性的初始值(A),且该属性有一个属主(B)。上下文分类符是属性的属主,且该OCL表达式的类型必须符合属性的类型。
context ExpressionInOcl
inv: self.attribute->notEmpty() -- A
and
self.attribute.owner->size() = 1 -- B
implies
contextualClassifier = self.attribute.owner
and
self.bodyExpression.type.conformsTo(self.attribute.type)
[2] @pre不允许用在初始属性值中。
context ExpressionInOcl
inv: -- TBD