OCL-- 调用规则

OCL - calling rule

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

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

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

您的 OCL 表达式只是 s.source 中元素的 'create' 个元素(关于 thismodule 函数的名称)。然后将创建的元素 returned 为 Collection:

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

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

的确,collect(...) 可用于集合,但 -> 也是 Set 的隐式转换器。 OCL 规范的第 15 页指出:

The "->" navigation shorthand performs an implicit set conversion of an object.

anObject->union(aSet) is a shorthand for anObject.oclAsSet()->union(aSet)

表示在element(我去掉最后的's')是“单一”关系且s.source.elementreturn是单一元素的情况下,调用s.source.element->... 等同于 s.source.element.oclAsSet()->...。在您的情况下,无论 elements 是否多,表达式仍然相同:

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

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

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

thisModule.createAnyMatchClass(s.source.elements)