前几周在使用GMF来做TOGAF建模工具时,了解到GMF使用OCL作为其模型的约束语言,于是花了一点时间简单的了解了一下OCL,下面简要的对OCL进行一下介绍,具体如何应用将在后续blog中再介绍,因为我现在还不知道:)
一个约束就是对一个(或部分)面向对象模型或者系统的一个或者一些值的限制。UML类图中的所有值都可以被约束,而表达这些约束的方法就是 OCL。在UML2标准中,OCL不仅用来写约束,还能够用来对UML图中的任何元素写表达式。每个OCL表达式都能指出系统中的一个值或者对象。因为 OCL表达式能够求出一个系统中的任何值或者值的集合,因此它具有了和SQL同样的能力,也就是说OCL也是一种查询语言。
OCL的基础是数学中的集合论和谓词逻辑,并且它有一个形式化的数学语义,但是它并没有使用某种数学符号。因为虽然数学符号能够清晰的、无歧义的表达事物,但是只有极少的专家可以看懂。所以数学符号并不适合用于一个广泛应用的标准语言。
自然语言是最易懂的,但是它是含混不清晰的。OCL取了自然语言和数学符号的折中方案,使用普通的ASCII字符来表达数学中同样的概念。如果你不喜欢当前的OCL表达方法,OCL规范还允许你定义自己的OCL符号集,这点是可以理解的,因为OCL有一个清晰的数学语义。
OCL是一个类型语言,任何表达式的值都是属于一个类型的。这个类型可以是预定义的标准类型例如Boolean或者Integer,也可以是UML图中的元素例如对象。也可以是这些元素组成的集合,例如对象的集合、包、有序集合等等。
表达式仅仅描述了应该去做"什么",而不是应该"怎样"去做。因为OCL是宣言式语言,所以UML中的表达式被提升到了纯建模的领域,而不必理会实现的细节和实现的语言。
OCL起源于1997年BIM公司为响应OMG的"面向对象分析和设计标准"征求稿所提交的"对象时间限制提议",OCL是该提议的部分内容。 用OCL可以描述四类约束,分别是不变量、前置条件、后置条件和监护条件。
1)不变量是在属性的生命期内一直保持为真的规则。
2)前置条件是在一个操作被调用时必须为真的约束。它是一个断言,不是可执行语句。
3)后置条件就是在操作完成时必须为真的约束。它不是可执行语句而是断言,必须为真。
4)监护规则是在对象能够从一种状态转变为另一种状态前其值必须为真的约束。
---------------------------
模型上下文
每一个OCL表达式都必须赋予一个明确的上下文来定义参考基准。在模型中的任何一个元素都可以定义为一个上下文,例如类、属性、操作和关联。以下是一个简单示例:
context Company inv:
self.numberOfEmployees > 50
----------------------------
OCL Expressions
一旦我们定义了上下文,就可以开始定义约束表达式饿。OCL是一种声明式语言,大部分表达式执行后会返回一个布尔值,也有一些表达式会用来选择一个单一值或者一个对象/值的集合。
更多内容参考:OCL – Object Constraint Language(OCL version 2.0).ppt
---------------------
Self
关键字self 用来表示上下文实例,如果上下文实例是Company,那么self指向的就是一个Company实例
-----------------------
不变量(Invariants)
不变量这个概念我是在产生式开发第一次听到的概念,它在OCL中是最基本的概念之一,我感觉就是一个可以使用表达式来写的一个业务规则。不变量由关键字inv: 来声明。以下三个是等价的:
context Company inv:
self.numberOfEmployees > 50
上面的关键字self可以不写,或者定义为另一个变量c:
context c : Company inv:
c.numberOfEmployees > 50
还可以给这个约束指定一个名称
context c : Company inv enoughEmployees:
c.numberOfEmployees > 50
---------------------------
前置和后置条件(Pre- and Postconditions)
context Typename::operationName(param1 : Type1, ... ): ReturnType
pre : param1 > ...
post: result = ...
以下为一个示例,在income函数调用之后,需要确保返回结果为5000
context Person::income(d : Date) : Integer
post: result = 5000
-----------------------------
操作表达式(Operation Body Expression)
这个有点我们在模型驱动开发中使用表达式来定义返回值一样,示例如下:
context Person::getCurrentSpouse() : Person
pre: self.isMarried = true
body: self.mariages->select( m | m.ended = false ).spouse
以上只是一些最基本的了解,具体如何应用还需要后续学习。
参考:
http://www.eclipse.org/modeling/mdt/?project=ocl#ocl
Implementing Model Integrity in EMF with MDT OCL
http://www.omg.org/spec/OCL/2.2/
推荐:你可能需要的在线电子书
欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]