0

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

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

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

在此处输入图像描述

4

1 回答 1

1

您的 OCL 表达式只是thismodules.source. 然后将创建的元素作为 a 返回Collection

  • s.source.elements通过导航返回(假设) a Collection(可能是 a )Set/Sequence...s
  • collect(...)收集其参数表达式的结果

如果关系不再elements是or ,如何更改表达式?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)
于 2017-01-23T08:10:04.333 回答