OCL(对象约束语言)简易教程

OCL(对象约束语言)始于1995年,最初作为UML的补充,用于克服图形表示的局限性,现已成为模型驱动工程的关键。OCL不仅是一种约束语言,也是一种查询语言,支持不变量、前提、后置、派生等多种约束类型。它在模型层级中广泛应用,从元模型到对象级别,用于规范、验证和转换。OCL的类型包括基本类型和集合类型,支持丰富的集合操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OCL的发展历史

OCL(Object Constraint Language,对象约束语言)最初是对UML的补充,其目的是在精确指定系统的详细设计方面克服UML图形表示的局限性。在Why you need to learn OCL中指出,一个完整的模型是需要OCL的,而UML或者其他图形语言只是完整而精确模型的冰山一角,如下图所示。

冰山一角

OCL最早是在1995年在IBM内部开发的,是Syntropy方法中一种表达语言的发展。OCL的工作是与ObjectTime Limited提出的一项联合提案的一部分,该提案是由对象管理组(OMG)发行的一种标准的面向对象的分析和设计语言。于1997年集成到UML标准中(1.1版本)。

OCL_history

最初,OCL仅用作UML的约束语言,但很快扩展了它的范围,现在OCL已成为任何模型驱动工程(MDE)技术的关键组成部分,成为表示各种(元)模型的默认语言。

OCL的一些特性

  • 既是约束语言,也是查询语言
  • 宣言式语言
  • 无副作用
  • 强类型语言

OCL约束的常见类型

什么是约束(Constraint)?

定义:“约束是面向对象的模型或系统中对一个或多个值的限制”。

  • 约束在类的层面规定,但是其语义在对象的层面进行解释。
  • 一般规定在UML模型(UML图的集合)的上下文(context)中。

1.不变量(Invariant)

定义不变量约束是在指定对象的整个生命周期都需要满足的约束。

语法

context <classifier>
inv [<constraint name>]: <Boolean OCL expression>

示例

 

描述会议结束时间大于开始时间的约束:

context Meeting inv: self.end > self.start

由于self总是指向约束被评估的对象,因此可以省略self,上式等价于:

context Meeting inv: end > start

我们可以对这条约束进行命名:

context Meeting inv startEndConstraint:
self.end > self.start

2.前提(Precondition)

定义:执行操作(operation)前应该满足的条件。

语法

context <classifier>::<operation> (<parameters>) 
pre [<constraint name>]: <Boolean OCL expression>

示例

会议shift()操作的前提:

context Meeting::shift(d:Integer)
pre: self.isConfirmed = false and d>0

3.后置(Postcondition)

定义:在操作执行后必须满足的条件。

  • 用来描述一个操作的实际影响

语法

context <classifier>::<operation> (<parameters>)
post [<constraint name>]: <Boolean OCL expression>

示例

会议duration()操作后得到result的值:

context Meeting::duration():Integer
post: result = self.end – self.start

会议confirm()操作后isConfirmed属性值为true:

context Meeting::confirm()
post: self.isConfirmed = true

@pre表示执行操作前的值,只能用在后置约束中:

context Meeting::shift(d:Integer)
post: start = start@pre +d and end = end@pre + d

通讯也只用在后置约束中,使用已经发送^”运算符

context Subject::hasChanged()
post: observer^update(2,4)
    /* standard observer pattern:
    results in true if an update message with arguments 2 and 4
    was sent to the observer object during execution of the
    operation hasChanged()
    */

4.派生(derive)(OCL2中添加)

派生属性:

context Team::size:Integer
derive:members->size()

派生关联,定义一个会议集合,其中的会议彼此冲突:

context Meeting::conflict:Set(Meeting)
derive: select(m|m<>self and self.inConflict(m))

5.初始化(init)(OCL2中添加)

示例:

context Meeting::isConfirmed : Boolean
init: false

context Teammember:meetings : Set(Meetings)
init: Set{}

6.定义局部变量(let)

一般用于复杂表达式中,定义局部变量:

context Meeting inv:
    let noConflict : Boolean =
        participants meetings participants.meetings-> forAll(m|m<>self and
        m.isConfirmed implies not self.inConflict(m))
    in isConfirmed implies noConflict

7.定义新的属性和操作(def)(OCL2中添加)

类似于let,便于在其它约束中重用OCL表达式:

context Meeting context Meeting
    def: noConflict : Boolean =
        participants.meetings->forAll(m|m<>self and
        m.isConfirmed implies not
        self.inConflict(m))

8.包(package)

package是对作用范围进行了约束:

package MeetingExample
context Meeting::isConfirmed : Boolean
init: false init: false
context Teammember:meetings : Set(Meetings)
init: Set{}
..
endpackage

 

 

OCL的类型

之前提到OCL是强类型语言,OCL的类型包括基本类型和集合类型,如下图。

OCL_type

基本类型:Boolean、Integer、Real、String

集合类型:Set、OrderedSet、Bag、Sequence

图中OCLType是用户定义类型。

集合类型包含以下操作:

  • 等于(=)和不等于(<>)
  • 转换(asBag(), asSet(), asOrderedSet(), asSequence())
  • including(object)和excluding(object)
  • flatten()
  • 一些通用的集合操作(union, intersection, minus, symmetricDifference)
  • 仅适用于排序集合(OrderedSet, Sequence)的操作(如first(), last(), indexOf())
  • 循环操作(any, collect, exists, isUnique, one, select, reject, sortedBy)

OCL的常见使用场景

模型层级示例
M2(元模型)

-OMG标准中WFR的规范

-定义DSL的建模指导

-模型转换的规范

M1(模型)

-模型验证(CASE工具)

-评估建模指导

-执行模型转换

-商业规则/约束的规范

-测试用例的规范

M0(对象)

-评估商业规则/约束

-测试

示例:

OMG标准中WFR的规范,如泛化关系不允许成环:

context Classifier inv:
not self.allParents->includes( )

定义DSL的建模指导,如Java语言中不允许多继承:

context Classifier inv SingleInheritance:
self.generalization->size()<= 1

一些值得一看的资料

OCL是一门值得仔细研究的语言,目前它的使用范畴也远超其初衷,本文只是浮光掠影地概述了一些基本概念,要想深入理解OCL还需要进一步学习研究。

[1] Warmer, J., Kleppe, A.: The Object Constraint Language. Precise Modeling with UML. Addison-Wesley, 1999
[2] Warmer, J., Kleppe, A.: The Object Constraint Language. Second Edition.Getting Your Models Ready For MDA. Addison-Wesley, 2003
[3] OMG UML specification,www.omg.org/technology/documents/modeling_spec_catalog.htm#UML
[4] OMG UML 2.0 OCL,www.omg.org/technology/documents/formal/ocl.htm
[5] Heinrich Hußmann: Formal Specification of Software Systems. Course, 2000, Technische Universität Dresden

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与你如初见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值