对象约束语言

对象约束语言OCL )是一种声明性语言,描述了适用于IBM开发的统一建模语言(UML)模型的规则,现在已成为UML标准的一部分。最初,OCL只是UML的正式规范语言扩展。现在可以将OCL与包括UML在内的任何Meta-Object设施(MOF)对像管理组(OMG)元模型一起使用。对象约束语言是一种精确的文本语言,可在任何MOF模型或元模型上提供约束和对象查询表达式,否则无法通过图表表示法表示。 OCL是用于转换模型,查询/视图/转换( QVT )规范的新OMG标准建议的关键组成部分。

描述

OCL是Syntropy的后代,即第二代面向对象的分析和设计方法。 OCL 1.4定义指定了约束语言。在OCL 2.0中,已扩展该定义以包括一般对象查询语言定义。

OCL语句分为四个部分:

  1. 定义声明有效情况有限情况的上下文
  2. 代表上下文某些特征的属性(例如,如果上下文是类,则可能是属性)
  3. 操纵或符合财产资格的操作(例如,算术,面向设置),并且
  4. 关键字(例如,如果,则是else,以及或不暗示的),用于指定条件表达式。

关系

OCL和UML

OCL通过提供具有自然语言歧义的表达方式,也没有使用复杂数学的固有困难来补充UML 。 OCL也是基于图的模型的导航语言。

OCL和MOF

OCL通过将主张与其元元素相关联,使元对象设施模型更加精确。

OCL和QVT

对于模型驱动工程(MDE)或模型驱动的体系结构特别重要的是模型转换的概念。 OMG已定义了称为MOF/QVT或简短QVT的模型转换的特定标准。目前可用几种模型转换语言,例如GreatViaTraTefkat ,并且符合QVT标准的不同级别。这些语言中的许多语言都建在OCL之上,OCL是QVT合作的主要部分。

备择方案

作为基于规则的验证语言,示意图可以被视为OCL的替代方法。然而,原始示期适用于可扩展的标记语言(XML)树,而OCL则可以导航基于MOF的模型和元模型(即XML Metadata Interchange( XMI )树)。换句话说,OCL与模式与XML相关的UML或MOF相似。 (请注意,模式使用XPath在XML树内导航。)
作为一种模型规范语言,允许设计师装饰具有无副作用注释的模型或元模型,因此OCL可以用合金等语言代替。自然语言原则上可以产生自动化的OCL。

例子
约束 OCL等效
一个人的年龄不是负面的。 context Person inv: self.age >=0
一个人比父母年轻。 context Person inv: self.parents->forAll(p|p.age>self.age)
生日过后,一个人年龄大了。 context Person::hasBirthday() post: self.age=self.age@pre+1
一个人最多有2个父母。 context Person inv: self.parents->size()<=2
在有人生了孩子之后,他/她的孩子没有空的,而且比以前更大。 context Person::getsChild() post: self.childs->notEmpty() and self.childs->size() > self.childs@pre->size()
只有成年人可以是汽车的所有者。 context Person inv: self.age<18 implies self.cars->isEmpty()
汽车的第一个注册在制造之前不能进行。 context Auto inv: self.registration>=self.constructionYear
每个拥有汽车的人至少都有一辆比人年轻的汽车。 context Person inv: self.cars->notEmpty() implies self.cars->exists( c | Calendar.YEAR - c.constructionYear < self.age)
没有人可以成为他/她自己的父母。 context Person inv: self.parents->excludes(self)
至少有一个拥有汽车的人。 context Person inv: Person.allInstances()->exists(p | p.cars->size() > 0)


扩展

Eclipse OCL通过其他操作员扩展了标准OCL和用于地图的类型。 Agileuml使用地图和功能类型扩展了标准OCL。这些扩展与现代编程语言(例如Python和Swift)中存在的地图和功能类型一致。

也可以看看