对象约束语言
对象约束语言( 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语句分为四个部分:
- 定义声明有效情况有限情况的上下文
- 代表上下文某些特征的属性(例如,如果上下文是类,则可能是属性)
- 操纵或符合财产资格的操作(例如,算术,面向设置),并且
- 关键字(例如,如果,则是else,以及或不暗示的),用于指定条件表达式。
关系
OCL和UML
OCL通过提供具有自然语言歧义的表达方式,也没有使用复杂数学的固有困难来补充UML 。 OCL也是基于图的模型的导航语言。
OCL和MOF
OCL通过将主张与其元元素相关联,使元对象设施模型更加精确。
OCL和QVT
对于模型驱动工程(MDE)或模型驱动的体系结构特别重要的是模型转换的概念。 OMG已定义了称为MOF/QVT或简短QVT的模型转换的特定标准。目前可用几种模型转换语言,例如Great , ViaTra或Tefkat ,并且符合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)中存在的地图和功能类型一致。