问题描述
您好,我是 OCL 新手,想知道是否可以使用 OCL 完成以下操作:
- 在创建对象之前检查某些条件是否成立
- 指定对象销毁后必须执行的操作
如果是,我们可以通过在构造函数中指定前置条件(第 1 号)和在析构函数中指定后置条件(第 2 号)来实现这一点,还是有其他方法?
谢谢!
解决方法
OCL 是一种无副作用的语言,因此没有任何变化,因此没有对象构造或销毁。 UML 和 Ecore 都没有提供任何构造函数或析构函数的建模。
基于 Pivot 的 OCL 通过引入阴影对象来解决无类型构造限制的解决方案,OCL 表达式可以保护其构造。但是为了避免副作用,影子对象只是来自所有可能对象的宇宙的惰性具体化,因此没有破坏。
完整的 OCL 增加了使用 @pre 或 oclIsNew() 来推理两个系统状态之间变化的能力,因此您可以在某处使用 oclIsNew() 来检测发生了不好的事情。
OMG OCL 标准定义了一个历史模型,可以允许对许多系统状态进行推理,但我不知道有任何实现它的尝试。最近,USE 小组发表了关于更有前途的幻灯片方法的论文。它可能会被详细说明以支持建设/破坏。
非正式地,您可以在构造函数/析构函数的文档中自由使用 OCL 表达式。
我对编程的看法是所有系统都是状态机,所有转换都是模型转换。因此,您可以在状态转换/转换的保护条件中使用 OCL,并使用执行状态突变的操作。