GMF:OCL(Object Constraint Language)介绍

简介:

  前几周在使用GMF来做TOGAF建模工具时,了解到GMF使用OCL作为其模型的约束语言,于是花了一点时间简单的了解了一下OCL,下面简要的对OCL进行一下介绍,具体如何应用将在后续blog中再介绍,因为我现在还不知道:)

OCL是约束(Constraint)语言和查询(Query)语言

一个约束就是对一个(或部分)面向对象模型或者系统的一个或者一些值的限制。UML类图中的所有值都可以被约束,而表达这些约束的方法就是 OCL。在UML2标准中,OCL不仅用来写约束,还能够用来对UML图中的任何元素写表达式。每个OCL表达式都能指出系统中的一个值或者对象。因为 OCL表达式能够求出一个系统中的任何值或者值的集合,因此它具有了和SQL同样的能力,也就是说OCL也是一种查询语言。

OCL是基于数学的,但没有使用数学符号

OCL的基础是数学中的集合论和谓词逻辑,并且它有一个形式化的数学语义,但是它并没有使用某种数学符号。因为虽然数学符号能够清晰的、无歧义的表达事物,但是只有极少的专家可以看懂。所以数学符号并不适合用于一个广泛应用的标准语言。

自然语言是最易懂的,但是它是含混不清晰的。OCL取了自然语言和数学符号的折中方案,使用普通的ASCII字符来表达数学中同样的概念。如果你不喜欢当前的OCL表达方法,OCL规范还允许你定义自己的OCL符号集,这点是可以理解的,因为OCL有一个清晰的数学语义。

强类型的语言

OCL是一个类型语言,任何表达式的值都是属于一个类型的。这个类型可以是预定义的标准类型例如Boolean或者Integer,也可以是UML图中的元素例如对象。也可以是这些元素组成的集合,例如对象的集合、包、有序集合等等。

声明式(Declarative)的语言

表达式仅仅描述了应该去做"什么",而不是应该"怎样"去做。因为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/





 本文转自 陈本峰 51CTO博客,原文链接:http://blog.51cto.com/zhoujg/517002,如需转载请自行联系原作者

相关文章
|
SQL Java 关系型数据库
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
429 0
|
机器学习/深度学习 算法 计算机视觉
【计算机视觉 | 目标检测】Open-vocabulary Object Detection via Vision and Language Knowledge Distillation
在这项工作中,我们考虑借用预训练的开放词汇分类模型中的知识来实现open vocabulary检测。
1536 0
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
442 1
课时78:Object类的基本概念
Object类的主要特点是可以解决参数的统一问题,使用object类可以接受所有的数据类型。 1. Object类简介 2. 观察Object类接收所有子类对象 3. 使用Object类接收数组
246 0
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
248 8
|
Java
Java Object 类详解
在 Java 中,`Object` 类是所有类的根类,每个 Java 类都直接或间接继承自 `Object`。作为所有类的超类,`Object` 定义了若干基本方法,如 `equals`、`hashCode`、`toString` 等,这些方法在所有对象中均可使用。通过重写这些方法,可以实现基于内容的比较、生成有意义的字符串表示以及确保哈希码的一致性。此外,`Object` 还提供了 `clone`、`getClass`、`notify`、`notifyAll` 和 `wait` 等方法,支持对象克隆、反射机制及线程同步。理解和重写这些方法有助于提升 Java 代码的可读性和可维护性。
569 20
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
605 4
【Java基础面试二十】、介绍一下Object类中的方法
这篇文章介绍了Java中Object类的常用方法,包括`getClass()`、`equals()`、`hashCode()`、`toString()`、`wait()`、`notify()`、`notifyAll()`和`clone()`,并提到了不推荐使用的`finalize()`方法。
【Java基础面试二十】、介绍一下Object类中的方法
|
Python
类与面向对象编程(Object-Oriented Programming, OOP)
类与面向对象编程(Object-Oriented Programming, OOP)
154 1
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
180 5