初学者关于OCL和派生属性的问题

Beginner's question on OCL and derived attributes

我最近才开始深入研究 OCL 的复杂性。在我的第一次申请中,出现了以下问题:

是否可能,如果可能,在没有提供值的情况下派生属性的正确方法是什么?

我想到但形式上可能不正确的方法是:

context   GenericClass::genericAttribute : PrimitiveType
derive:   if genericAttribute.oclIsUndefined() then
             <expression of matching type>
          endif

我能想到的另一种方法是

context   GenericClass::genericAttribute : PrimitiveType
inv:      genericAttribute.oclIsUndefined implies genericAttribute = <expression of matching type>

诚然,这两种方法似乎都有些笨拙,因此,如果你能告诉我正式的正确方法,我会很高兴。

不幸的是,术语 'derived' 超载了。我认为您在这里的用法与继承无关,继承不适用于属性 - 您需要委托给派生操作。相反,我假设你的意思是自动计算。

您的第一个示例是循环的,因此应该会失败,可能是堆栈溢出。尽管具有全局控制和符号功能的 OCL 实现可能会得到它,但不变量可能会检测并失败,而不是纠正不满足的条件 'right' 一旦你过了非法启动瞬态。

如果您不能使用 'init' 子句进行初始化,那么我建议您添加一个执行干净访问的 genericAttribute() 操作。如果将持久属性重命名为 rawGenericAttribute,则可以重新使用 genericAttribute 拼写作为派生计算,避免相同命名属性和操作的混淆。

(很少需要使用x.oclIsUndefined()。x <> null 更清楚。)