OCL - 需要对不变量进行一些澄清吗?

时间:2012-02-23 21:19:42

标签: ocl

我今天在OCL与一位教授进行了讨论。他认为在定义的函数上下文中允许不变量,后置条件和前置条件。

我的软件开发人员让我想要相信OCL会允许将一般约束放在模型上。像这个模型中的所有对象Person的约束都具有男性的性别,或者所有类车的对象都有四个轮子看起来非常有用,并且对我的模型使用声明性范例感觉是对的。

我有点像物质世界一样。如果我们将螺母拧在螺栓上,则允许螺母以一种方式安装。这些都是物理限制,无论我们采取什么行动,比如将螺母拧到螺栓上,并且不能违反,或者我们已经从根本上使模型无效。

他的观点是,在OCL中,我们只能在提供上下文的函数中定义约束(前置和后置条件/不变量)。

有人可以为我清楚吗?

4 个答案:

答案 0 :(得分:2)

不确定我是否真的明白你的功能背景是什么意思。但是,OCL超越了不变量/前/后条件。

从OMG OCL 2.3.1规范[1] 7.2.1 在何处使用OCL

OCL可用于多种用途:

  • 作为查询语言,
  • 指定类模型中的类和类型的不变量
  • 为Stereotypes指定类型不变量,
  • 描述操作和方法的前后条件
  • 描述卫兵,
  • 指定消息和操作的目标(集),
  • 指定操作约束,
  • 为UML模型上的任何表达式指定属性的派生规则。

所以,换句话说,你是对的,你可以在你描述的模型类上有一个约束(不确定你的意思)。

[1] http://www.omg.org/spec/OCL/2.3.1

答案 1 :(得分:2)

你可以肯定地定义类的约束,如你所说。你需要澄清你对上下文的意思,因为你(和你的教授)可能互相误解了。

OCL有一个名为context的关键字,它基本上可以引用任何UML分类器(类型,类,接口,关联,数据类型......)。

您提到的示例实际上是通过简单表达式(例如:

)在OCL中最容易解决的

context Person inv: self.age< = 120

context Person inv: self.countChildren()< = 20

答案 2 :(得分:1)

根据UML规范(编写时仍为2.5),约束上下文的上下文是模型的任何NameSpace,包括分类(Classes)。可以通过定义的OpaqueExpression指定约束,例如,通过OCL。

作为示例,请考虑以下帖子:http://lowcoupling.com/post/57689107913/constraining-uml-models-through-ocl

答案 3 :(得分:0)

As already noted, a Constraint may be placed on any UML namespace. However the semantics of invariants is only defined for classes. An invariant defined on a package is unspecified, which is unfortunate since it requires the definition of universal truth (on allInstances()) to be associated with each instance of some class potentially leading to redundant re-evaluation in naive OCL tooling. Look forward to inclusion of package invariants in a future OCL.