2

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

我内心的软件开发人员让我相信 OCL 将允许对模型施加一般约束。像这个模型中 Person 类的所有对象的性别都是男性,或者 car 类的所有对象都有四个轮子这样的约束看起来非常有用,并且对我的模型使用声明性范式感觉是正确的。

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

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

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

4

4 回答 4

2

正如您所说,您绝对可以定义对类的约束。但是,您需要澄清上下文的含义,因为您(和您的教授)可能彼此误解了。

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

您提到的示例实际上是 OCL 中最容易解决的,通过简单的表达式,例如:

上下文人员 inv:self.age <= 120

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

于 2013-02-20T23:38:19.733 回答
2

不确定我是否真的理解函数的上下文是什么意思。但是,OCL 不仅仅是不变量/前/后条件。

来自 OMG OCL 2.3.1 规范 [1] 7.2.1 Where to Use OCL

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

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

所以,换句话说,你是对的,你可以像你描述的那样对模型类有一个约束(不确定你所说的一般是什么意思)。

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

于 2012-11-25T12:25:02.057 回答
1

根据 UML 规范(写作时 2.5 仍处于测试阶段),约束上下文的上下文是模型的任何名称空间,包括分类器(类)。可以通过例如通过 OCL 定义的 OpaqueExpression 来指定约束。

作为一个例子考虑这篇文章: http: //lowcoupling.com/post/57689107913/constraining-uml-models-through-ocl

于 2013-08-10T18:26:02.280 回答
0

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

于 2017-12-18T06:21:18.973 回答