OCL:为构造函数和析构函数指定前置和后置条件

问题描述

您好,我是 OCL 新手,想知道是否可以使用 OCL 完成以下操作:

  1. 在创建对象之前检查某些条件是否成立
  2. 指定对象销毁后必须执行的操作

如果是,我们可以通过在构造函数中指定前置条件(第 1 号)和在析构函数中指定后置条件(第 2 号)来实现这一点,还是有其他方法

谢谢!

解决方法

OCL 是一种无副作用的语言,因此没有任何变化,因此没有对象构造或销毁。 UML 和 Ecore 都没有提供任何构造函数或析构函数的建模。

基于 Pivot 的 OCL 通过引入阴影对象来解决无类型构造限制的解决方案,OCL 表达式可以保护其构造。但是为了避免副作用,影子对象只是来自所有可能对象的宇宙的惰性具体化,因此没有破坏。

完整的 OCL 增加了使用 @pre 或 oclIsNew() 来推理两个系统状态之间变化的能力,因此您可以在某处使用 oclIsNew() 来检测发生了不好的事情。

OMG OCL 标准定义了一个历史模型,可以允许对许多系统状态进行推理,但我不知道有任何实现它的尝试。最近,USE 小组发表了关于更有前途的幻灯片方法的论文。它可能会被详细说明以支持建设/破坏。

非正式地,您可以在构造函数/析构函数的文档中自由使用 OCL 表达式。

我对编程的看法是所有系统都是状态机,所有转换都是模型转换。因此,您可以在状态转换/转换的保护条件中使用 OCL,并使用执行状态突变的操作。