2012-02-23 73 views
2

我今天和一位教授讨论了OCL。他认为不变量,后置条件和前置条件在规定的功能范围内是允许的。OCL - 需要澄清不变量?

我的软件开发人员让我想要相信OCL将允许将一般约束放在模型上。像这个模型中的Person类的所有对象都有男性的性别约束,或者所有类车的对象都有四个车轮似乎不可思议有用,并且使用对我的模型的声明式范例感觉是对的。

我认为它像物理世界一样。如果我们将螺母拧在螺栓上,则允许螺母以一种方式安装。这些都是物理限制,无论我们如何将螺母拧在螺栓上而采取的行动,都不能被违反,或者我们已经以基本方式使我们的模型失效。

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

有人可以帮我解决这个问题吗?

回答

2

不知道我是否真的明白函数的上下文是什么意思。但是,OCL不仅仅是不变量/前/后条件。

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

OCL可用于多种不同的目的的:

  • 作为查询语言,
  • 在类模型指定的类和类型不变,
  • 指定类型不变的刻板印象,
  • 描述的操作和方法前置和后置条件,
  • 描述逆天,
  • 指定信息和行动目标(套),
  • 指定的操作限制,
  • 指定UML模型上任何表达式的属性的派生规则。

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

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

2

你绝对可以在类定义的约束,如你所说。尽管如此,你需要澄清你的意思,因为你(和你的教授)可能误解了对方。

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

你提到的例子实际上是OCL,以解决最简单,通过简单的表现形式,例如:

背景的人INV: 自我。年龄< = 120

上下文人INV: self.countChildren()< = 20

0

如前所述,一个约束,可以放在任何UML命名空间。然而,不变量的语义只是为类定义的。在包上定义的不变量是未指定的,这是不幸的,因为它要求将通用事实(在allInstances())上的定义与某些类的每个实例相关联,潜在地导致在幼稚OCL工具中进行冗余重新评估。期待在未来的OCL中包含包不变量。