8.3.1 表达式核心
图8.2展示了表达式包的核心部分。包中的基本结构包括类OclExpression, CallExp和VaribleExp。一个OclExpression总是有一个类型,它通常并不显式地被建模,而是衍生出的。每个CallExp都有一个源,它由OclExpression来指定。在本节我们使用术语‘属性’——特征、关联端的泛化,以及OCL中预定义的集合遍历操作。
FeatureCallExp泛化了所有的属性调用,它们引用UML元模型中的特征。在图8.3中,定义了FeatureCallExp的不同子类。
表达式包的其余大部分内容包含了CallExp不同子类的规约和它们的特定结构。从元模型我们可以推断出OCL表达式总是起始于一个变量或字面量,在此基础上,递归地应用一个属性。
CallExp
CallExp表达式引用一个特征(操作或属性)或集合上的一个预定义跌打器。它的结果值是对相应特征的计算。它是一个抽象元类。
关联 | 说明 |
---|---|
source | source表达式的结果值是执行该属性调用的实例 |
FeatureCallExp
FeatureCallExp表达式引用一个在UML模型中的分类符上定义的特征。它的结果值是相应特征的计算结果。
关联 | 说明 |
---|---|
isPre | 布尔值,指示表达式所引用的特征是否是前置条件时刻的值。 |
IfExp
IfExp在8.3.3 If 表达式中定义,出于完整才包含在图中。
IterateExp
IterateExp表达式为集合中的每个元素执行其body表达式。它的行为类似循环结构,在源集合中遍历每个元素,然后产生一个值。在每个迭代步骤中执行body表达式所产生的值成为result变量的新值,用于后续的迭代步骤。结果可以是任意类型并且由result关联来定义。IterateExp是OCL表达式包中定义的最基本的集合表达式。
关联 | 说明 |
---|---|
result | 代表结果变量的变量 |
IteratorExp
IteratorExp表达式为集合中的每个元素执行其body表达式。它的行为类似循环结构,对集合的每个元素进行遍历并产生一个值。迭代器表达式的类型取决于表达式的名称,而且有时取决于所关联的source表达式的类型。IteratorExp代表了所有其它使用了一个迭代器的预定义集合操作。这包括 select, collect, reject, forAll, exists等等。OCL标准库定义了一些预定义的迭代器表达式。它们的语义在11.7 预定义的迭代器表达式中根据迭代表达式来进行定义。
LiteralExp
LiteralExp是一个没有实参的表达式。通常,其结果值与表达式符号是相同的。这包括像整数 1 或字符串字面量 ‘this is a Literal’。
LoopExp
LoopExp代表了一个集合上的循环结构体表达式。它有一个迭代器变量表示迭代过程中集合的元素。body表达式在集合的每个元素上执行。表达式的结果取决与特定的循环种类和它的名称。
关联 | 说明 |
---|---|
iterator | 迭代器变量。在迭代过程中绑定到集合中的每个元素 |
body | 对集合中每个元素都要执行的OclExpression |
MessageExp
MessageExp在8.3.4定义,出于完整才包含在图中。
OclExpression
OclExpression是一个可以在给定环境中被执行的表达式。在元模型中,OclExpression是所有其它表达式的抽象超类——除了ExpressionInOcl容器类。它是OCL表达式包的顶层元素。每个OclExpression都有一个类型,可以通过静态分析和它的上下文来获得。表达式的执行产生一个值。具有布尔值的表达式可以用做约束(例如,规定一个类的不变式)。任何类型的表达式都可以用来指定检索、初始属性值、目标集合等。
OclExpression的环境定义了在一个表达式中可以看到和访问哪些元素。在最上层,环境由OCL表达式所附加到的Element所定义,例如如果OCL表达式用做一个不变式的话,那么它就是一个分类符。在低一些的层次,每个迭代器表达式都可以在环境中引入一个或多个迭代器变量。环境没有被建模为一个单独的元类,因为它可以完全通过衍生规则衍生出来。完整的衍生规则在第9章 具体语法。
StateExp
StateExp是一个在表达式中引用类的一个状态的表达式。它用于直接向预定义的操作oclIsInState传递所引用的状态。
关联 | 说明 |
---|---|
referredState | 被引用的状态 |
TypeExp
TypeExp是一个在表达式中引用一个既有类型的表达式。它用于在调用类似oclIsKindOf, oclIsTypeOf和oclAsType等操作时向其传递类型的引用。
关联 | 说明 |
---|---|
referredType | 所引用的类型 |
Variable
Variable是有类型的元素,用于在表达式中传递数据。但需要其在自己的变量声明范围内。该元类代表了变量self和result,以及使用Let表达式定义的变量。
关联 | 说明 |
---|---|
initExpression | 代表该变量初始值的OclExpression。根据该变量声明所起的作用,该表达式可能是必须的。 |
representedParameter | 该变量在当前的操作中所代表的参数。任意对该变量的访问代表了对参数值的访问 |
VariableExp
VariableExp是一个包含了对一个变量引用的表达式。像对self和result,或者Let表达式所定义的变量的引用都是这类变量表达式的例子。
关联 | 说明 |
---|---|
referredVariable | 该变量表达式所引用的变量 |