OCL - 调用规则

时间:2017-01-21 15:45:51

标签: ocl model-driven-development

以下代码有什么作用?当有一个元素而不是元素时,如何编写这个OCL表达式?

换句话说,我不明白代码收集了哪些元素? 由于当我们有多个元素时使用“collect”,如果我有一个元素(而不是元素),那么“ - > collect(s | thisModule.CreateMatchClass(s​​))”表达式会发生什么变化?

s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s))

enter image description here

1 个答案:

答案 0 :(得分:1)

你的OCL表达只是简单地创造了'来自thismodule中元素的元素(关于s.source函数的名称)。然后,创建的元素将作为Collection

返回
  • s.source.elementsCollection
  • 导航,返回(据称)Set/Sequence...(可能是s
  • collect(...)收集其参数表达式的结果

如果关系elements不再是0..*而是0..11..1,那么如何更改表达式?

事实上,collect(...)适用于集合,但->也是Set的隐式转换器。 OCL规范的第15页声明:

  

" - >"导航速记执行对象的隐式设置转换。

     

anObject->union(aSet)anObject.oclAsSet()->union(aSet)

的简写

这意味着element(我删除了最后的' s)是一个"单身"关系和s.source.element返回单个元素,调用s.source.element->...相当于s.source.element.oclAsSet()->...。在您的情况下,无论elements是否很多,表达式仍然相同:

s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s))

此表达式适用于两种情况。

如果你真的不想要collect,如果你的elements关系是单身,你也可以这样写:

thisModule.createAnyMatchClass(s.source.elements)