7 OCL语言描述

本章介绍OCL,一种用于描述UML模型表达式的形式语言。这种表达式通常规定所建模系统所必须满足的不变式条件和模型中所描述对象的检索。注意,当计算OCL表达式时,它们不能有副作用(例如,它们的计算不能改变相应执行系统的状态)。

OCL表达式可以用于规定操作(operations)/动作(actions),这些客体在计算时是改变系统状态的。UML建模者可以使用OCL来规定模型中应用特定的约束。还可以使用OCL来规定UML模型上的检索,而这完全是编程语言无关的。

7.1 为什么要用OCL?

UML图,例如一个类图,通常不能精化到可以提供一个规约的所有相关方面。也就是说模型中还需要描述一些额外的对象约束。这些约束通常用自然语言来描述。实践证明这总是会带来歧义。为了编写无歧义的约束,形式语言应运而生。传统形式语言的弊端是它们只适用于具有很强的数学背景的用户,而对一般的业务或系统建模者来说很难使用。

OCL被开发用来弥补这个鸿沟。它是一种形式语言同时易于读写。它作为一种业务建模语言诞生于IBM保险部门,根植于Syntropy方法(译者注:一种面向对象的分析和软件建模方法,详细请参考Wikipedia:https://en.wikipedia.org/wiki/Syntropy_(software))。

OCL是一种纯规约语言;因此,保障了OCL表达式是无副作用的。当计算一个OCL表达式时,只是简单的返回一个值。它不能改变模型中的任何东西。这意味着系统中的状态在计算OCL表达式时永远不会发生改变,即使一个OCL表达式可以用来规定一个状态改变(例如,在后置条件中)。

OCL不是编程语言;因此,在OCL中不能编写程序逻辑或流控制。你不能在OCL中调用过程和激活非检索操作。由于OCL天生是一门建模语言,OCL表达式是不能直接执行的。

OCL是一种类型语言,因此每个OCL表达式都有一个类型。为了保障良构,OCL表达式必须遵循该语言的类型一致性规则。举个例子,你不能拿一个整型与一个字符串进行比较。UML模型中定义的每个分类符代表了一个不同的OCL类型。此外,OCL还包括了一些预定义的补充类型。这在第11章描述。

作为一种规约语言,它的实现超出OCL的范围而且也不能在OCL中进行表示。

OCL表达式的计算是瞬时完成了。这意味着在计算过程中模型中对象的状态不能改变。

7.1.1 何处使用OCL

OCL可以用于许多不同目的:

  • 作为一种检索语言;
  • 规定类模型中类和类型的不变式;
  • 规定Stereotype的类型不变式;
  • 描述操作和方法的前置-和后置条件;
  • 描述Guards;
  • 规定消息和动作的目标;
  • 规定操作上的约束;
  • 规定UML中任意表达式中属性的衍生规则。

results matching ""

    No results matching ""