我正在努力寻找一种在关联类中导航以创建约束的方法
我在这里检查了规格:https://www.omg.org/spec/OCL/About-OCL/
如您所见,我在类A的上下文中创建了一个约束(恰好在类的名称下方),我尝试使用较低的“ c”和较高的“ C”,但均无效...
Context A:
inv: self.C[b].val.mod(2) = 0
(约束的含义并不重要,我只想使其生效)
执行验证过程时,出现此错误:
“表达式有错误:[0:5]的语义错误:无法识别的变量:(C)”
此错误消息似乎是逻辑的,因为我在类型A的对象中都看不到属性“ c”或“ C”,但我不明白为什么会这样。
我做错什么了吗? 我不明白为什么它不起作用,因为我尊重规范中描述的语法。
有关信息: 我使用:
先谢谢您!
答案 0 :(得分:3)
您看着一个非常黑暗的角落。我第一次尝试实际测试此功能的尝试失败了,因为没有找到可以实际绘制图7.1的UML工具。一旦掌握了文字,我就会意识到存在许多问题。 QVTo缩写进一步加剧了两种不同x [y]语法之间的潜在冲突。扩展到不仅仅是二进制关联还有一个问题。 OCL抽象语法继续使用AssociationEnd的UML 1.x概念,而不是UML 2.x属性。
因此,您观察到的功能是某些工具供应商尽最大努力来弄清规格不足的结果。
使用MagicDraw,您曾经使用过德累斯顿OCL,但我知道MagicDraw已切换到Eclipse OCL,也许是经典Eclipse OCL。 NoMagic在归功于他们重新分发的开源软件时显得格外沉默寡言。
对于较新的Pivot Eclipse OCL,我在其中为许多OMG OCL问题提供了解决方案的原型,从UML到Pivot的加载使许多UML概念规范化,因此,关联是多余的,除非对协会的非公开导航要求关联类为被具体化。对于每个似乎可行的导航,AssociationClasss被标准化为具有普通属性的Associations Classs。
我认为您的表达不正确。
self.C [b]不能为合格的关联,因为隐式A :: C属性没有键。
self.C [b]可以是歧义化的导航A :: C,其中通过选择相反的C :: b可以解决A :: C的歧义。但是A :: C并不是模棱两可的,相反的是C :: a。所以self.C应该足够,self.C [a]是多余的,self.C [b]与b是错误的。遗憾的是您的工具不喜欢self.C,因此您的工具有缺陷。
我认为您应该写成self.C.val.mod(2)= 0。
大写C正确。 OCL <= 2.2遵循UML样式指南,误导了小写字母。请参见OCL 2.4的7.5.4中“缺少关联的结束名称”下的缩进段落。