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..1
或 1..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.element
return是单一元素的情况下,调用s.source.element->...
等同于 s.source.element.oclAsSet()->...
。在您的情况下,无论 elements
是否多,表达式仍然相同:
s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s))
此表达式适用于两种情况。
如果你真的不想要 collect
并且你的 elements
关系是单身,你也可以这样写:
thisModule.createAnyMatchClass(s.source.elements)
下面的代码是做什么的?只有一个元素而不是元素时,如何编写这个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..1
或 1..1
,如何更改表达式?
的确,collect(...)
可用于集合,但 ->
也是 Set
的隐式转换器。 OCL 规范的第 15 页指出:
The "->" navigation shorthand performs an implicit set conversion of an object.
anObject->union(aSet)
is a shorthand foranObject.oclAsSet()->union(aSet)
表示在element
(我去掉最后的's')是“单一”关系且s.source.element
return是单一元素的情况下,调用s.source.element->...
等同于 s.source.element.oclAsSet()->...
。在您的情况下,无论 elements
是否多,表达式仍然相同:
s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s))
此表达式适用于两种情况。
如果你真的不想要 collect
并且你的 elements
关系是单身,你也可以这样写:
thisModule.createAnyMatchClass(s.source.elements)