首页 > 解决方案 > 初学者关于OCL和派生属性的问题

问题描述

我最近才开始深入研究 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>

诚然,这两种方法似乎都有些尴尬,因此,如果您能向我展示形式上正确的方法,我会很高兴。

标签: ocl

解决方案


不幸的是,“派生”一词被重载了。我认为您在这里的使用与继承无关,继承不适用于属性 - 您需要委托给派生操作。相反,我假设您的意思是自动计算。

您的第一个示例是循环的,因此应该失败,可能是堆栈溢出。尽管具有全局控制和符号功能的 OCL 实现可能会在您通过非法启动瞬态后使其“正确”,但该不变量可能会检测并失败而不是纠正不满足的条件。

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

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


推荐阅读