12.1 引言
原则上,凡是表达式可以在UML规范中使用的地方,就可以使用OCL表达式(例如不变式、前置条件和后置条件),但是用其它地方也可以。OCL表达式的结果值的含义,取决于它在UML模型中的位置。
在本规范中,表达式的结构和它的计算与表达式的使用是分开的。第8章(抽象语法)定义了表达式的结构。在第9章(具体语法)早已提到过OCL表达式的命名空间环境的内容完全由该OCL表达式在模型中位置决定。在那一章中,为属性文法的每个产生式规则引入一个继承的属性env来代表这个命名空间环境。
本子章节定义了许多OCL表达式可以被使用的预定义的位置,它们相关的含义,以及命名空间环境的内容。如果OCL在UML模型中需要使用的位置没有在本章节中被定义的话,那么建模者必须定义他们自己的含义。
对于每个OCL表达式的出现,需要区分三件事:位置、上下文分类符,以及OCL表达式的self实例。
位置是指OCL表达式在UML模型中所被使用的位置(例如,做为一个连接到类Person的不变式)。
上下文分类符定义了表达式被计算的命名空间。举个例子,一个前置条件的上下文分类符是定义该前置条件的操作的属主分类符。前置条件可见的元素是在上下文分类符中可见的所有模型元素。
self实例是计算该表达式的对象的引用。它总是上下文分类符的一个实例。注意,对于上下文分类符的每个实例,该OCL表达式的计算可能会产生不同的值。
在下一小节显式地声明了一些位置,对于每个位置,给出了上下文分类符的定义和良构规则,它们真正定义了附加到UML模型的OCL表达式可以被放置的位置。