关于 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>

诚然,这两种方法似乎都有点尴尬,因此如果你能给我展示正式正确的方法,我会很高兴。

术语"derived"不幸重载。我认为您在这里的用法与继承无关,而继承对于属性是不可用的——您需要委托给派生操作。相反,我认为你指的是自动计算。

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

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

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

最新更新