17.1 对象约束语言概述 对象约束语言简称 OCL ( Object Constrai
nt Language ),它是一种用于施加在指定的模型元素上约束的语言。 OCL 表达式以附加在模型元素上的条件和限制来表现对该对象的约束,其中包括附加在模型元素上的不变量或约束的表达式、附加在操作和方法上的前置条件和后置条件等。
OCL 的产生 OCL 的产生是为了解决约束表达的问题。 OCL 最初由 IBM 公司设计成功。 OCL 已经为标准化组织 OMG 所接受,成为了 UML 标准的一部分。 OCL 语言虽然是一种形式化语言,但是它既具有形式化语言无二义性的特点,又消除了形式化语言的复杂性。
OCL 的特点① OCL 是一种精确的、无二义性的语言,易于使用和掌握。② OCL 是一种规范说明性语言,所有有关实现的问题都不能用 OCL 来表达。③ OCL 是一种纯表达式语言,它是具有没有任何副作用的声明性语言。对 OCL 表达式的计算将返回一个值,计算不会改变系统的状态。④ OCL 是一种类型化语言,即 OCL 中的每个表达式都是具有类型的。⑤ OCL 不是一种程序设计语言,不能用 OCL 编写程序逻辑和控制流程。
17.2 标准 OCL 类型 OCL 预定义的标准类型定义了一组基本类型和集合类型。 OCL 的基本类型有“ Boolean” 、“ Integ
er” 、“ Real” 和“ String” 等,集合类型包括“ Collection” 、“ Set” 、“ Bag” 和“ Sequence” 等,这些标准类型是 OCL表达式的组成部分。
17.2.3 基本类型 OCL 定义了很多基本类型,它的基本类型和程序设计语言中的数据类型的含义类似。 OCL 还在基本类型上定义了一些操作,这些操作也与程序设计语言中的操作类似。 OCL 的基本类型与操作见表 17-3 。
17.2.4 集合类型 除了基本类型以外, OCL 还定义了一些较为高级的标准 OCL 类型称为集合类型。 集合是成组的对象或元素,可以用来作为表达式计算过程中的结果。 集合类型除了抽象数据类型 Collection 以外,还有 Set (集)、 Bag (袋)和序列( Sequence )等。
OCL 表达式的特点① OCL 表达式可以附加在模型元素上。② OCL 表达式可以附加在操作上。③ OCL 表达式可以指定附加在模型元素上的监护条件。④ OCL 表达式的计算原则是从左到右⑤ OCL 表达式既可以使用基本类型又可以使用集合类型。
17.3.1 OCL 表达式的语法 OCL 表达式的语法用扩展的巴斯科范式( EBNF )定义,在 EBNF 中:① “|” 表示选择② “ ?”表示可选项③ “*” 表示零次或多次④ “ +”表示一次或多次
17.3.1 OCL 表达式的语法 OCL 基本表达式的语法用 EBNF 定义如下: PrimaryExpression:=literalCollection | literal | pathName time Expression ? FeatureCallparameters? | “(“ expression ”)” | ifExpression Literal:=<string> | <number> | “#” <name> timeExpression:=”@”<name> featrueCallParameters:=”(”(declarator)?(actualParameterList)?”)” ifExpression :=”if” expression “then” expression “else” expression “endif”
17.4 用 OCL 表达对象性质约束 所谓对象性质,就是指一个对象的属性、操作等对象有关的特性,在建模中具体是指定义的模型元素的特性。 OCL 表达式可以表达对模型元素性质的约束,常见的使用情况有三种:不变量、前置条件与后置条件和 let 表达式。
17.4.2 前置条件和后置条件 OCL 表达式附加在操作上可以规定一个前置条件或后置条件。 前置条件指的是操作开始执行前必须为真的条件,后置条件指的是操作成功结束执行后必须为真的条件。 前置条件用保留字“ pre” 标识,后置条件用保留字“ post” 标识。