4

我正在努力寻找一种方法来浏览关联类以创建约束

我在这里检查了规范: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”,但我不明白为什么会这样。

难道我做错了什么 ?我不明白为什么它不起作用,因为我尊重规范中描述的语法。

有关信息:我使用:

  • 魔术抽奖:v18.5
  • OCL:2.0

提前谢谢你!

4

1 回答 1

4

你看着一个非常黑暗的角落。我第一次实际测试这个功能的尝试失败了,因为没有找到一个可以实际绘制图 7.1 的 UML 工具。一旦我掌握了文本,我意识到有很多问题;两种不同的 x[y] 语法之间的潜在冲突,QVTo 缩写进一步加剧了这种冲突。扩展到多于二元关联存在问题。OCL 抽象语法继续使用 UML 1.x 的 AssociationEnd 概念而不是 UML 2.x 属性。

因此,您观察到的功能是某些工具供应商尽最大努力理解非常不充分的规范的结果。

使用 MagicDraw,您曾经使用 Dresden OCL,但我知道 MagicDraw 已切换到 Eclipse OCL,也许是 Classic Eclipse OCL。NoMagic 似乎对他们重新分发的开源软件非常谨慎。

对于较新的 Pivot Eclipse OCL,我在其中对许多 OMG OCL 问题的解决方案进行了原型设计,UML 到 Pivot 加载规范了许多 UML 概念,因此关联是多余的,除非对关联的显式导航需要具体化关联类。对于每个似是而非的导航,关联类被规范化为具有普通属性的关联类。

我认为你的表达不正确。

self.C[b] 不能是合格的关联,因为隐式 A::C 属性没有键。

self.C[b] 可以是一个明确的导航 A::C,其中 A::C 的歧义通过选择对面的 C::b 来解决。但是 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 中“缺少关联结束名称”下的缩进段落。

于 2018-12-11T11:01:40.643 回答