【问题标题】:How to navigate through association class to create constraints with OCL?如何通过关联类导航以使用 OCL 创建约束?
【发布时间】:2019-05-12 06:15:22
【问题描述】:

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

我在这里查看了规范: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

提前谢谢你!

【问题讨论】:

    标签: uml ocl magic-draw


    【解决方案1】:

    你看着一个非常黑暗的角落。我第一次实际测试这个功能的尝试失败了,因为没有找到一个可以实际绘制图 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 概念,因此关联是多余的,除非到关联的显式导航需要关联类来被具体化。 AssociationClasses 被规范化为具有每个合理导航的普通属性的关联类。

    我认为你的表达不正确。

    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

    【讨论】:

      猜你喜欢
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多