【问题标题】:OCL - Need some clarification on Invariants?OCL - 需要一些关于不变量的说明?
【发布时间】:2017-12-18 14:21:18
【问题描述】:

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

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

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

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

谁能帮我解决这个问题?

【问题讨论】:

    标签: ocl


    【解决方案1】:

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

    来自 OMG OCL 2.3.1 规范 [1] 7.2.1 在哪里使用 OCL

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      context Person inv: self.age

      context Person inv: self.countChildren()

      【讨论】:

        【解决方案3】:

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

        以这篇文章为例:http://lowcoupling.com/post/57689107913/constraining-uml-models-through-ocl

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2021-09-28
            • 2019-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-16
            • 1970-01-01
            • 2012-12-17
            相关资源
            最近更新 更多