ocl - 初学者关于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 实现可能会在您通过非法启动瞬态后使其“正确”,但该不变量可能会检测并失败而不是纠正不满足的条件。
如果您不能使用“init”子句进行初始化,那么我建议您添加一个执行干净访问的 genericAttribute() 操作。如果您将持久化属性重命名为 rawGenericAttribute,那么您可以重新使用 genericAttribute 拼写作为派生计算,并避免混淆相同的命名属性和操作。
(很少需要使用 x.oclIsUndefined()。x <> null 更清晰。)
推荐阅读
- conv-neural-network - CNN 和图像生成器的不同输入形状
- python - Python3 子进程未产生所需的输出
- reactjs - 改进 Cypress 结构并重用多个文件中的给定步骤
- python - “nticks”在情节场景中不受 xaxis 的尊重
- keycloak - 将 keycloak 实现为 google 的第三方 idp
- javascript - 由 chrome 扩展生成的元素上的单击事件
- c# - 有没有办法将旧的回归脚本正确转换为新的新工具,如 webdriver?
- django - Django REST - 在一个 GET-Response 中发送多个查询集
- python - 计算付款之间的周期,由客户使用 Pandas
- coq - Set vs. Prop 的可判定相等性声明