我最近才开始深入研究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更清晰。(