Ocl 呼叫规则

Ocl 呼叫规则,ocl,model-driven-development,Ocl,Model Driven Development,下面的代码做什么?当存在一个元素而不是一个元素时,如何编写此OCL表达式 换句话说,我不明白代码收集哪些元素? 因为当我们有多个元素时使用collect,如果我有一个元素而不是元素,那么该表达式的->collect s | thisModule.CreateMatchClasss部分会发生什么变化 s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s)) OCL表达式只是从s.source中的元素中“创建”有关t

下面的代码做什么?当存在一个元素而不是一个元素时,如何编写此OCL表达式

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

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

OCL表达式只是从s.source中的元素中“创建”有关thismodule函数名称的元素。然后将创建的元素作为集合返回:

s、 source.elements返回的集合可能是一个集合/序列。。。通过从s导航 收集收集其参数表达式的结果 如果关系元素不再是0..*而是0..1或1..1,如何更改表达式? 的确,收集。。。可用于集合,但->也是到集合的隐式转换器。OCL规范第15页规定:

->navigation速记执行对象的隐式集合转换

anObject->unionaSet是anObject.oclAsSet->unionaSet的简写

这意味着在我删除的元素中,最后的“s”是一个关系,而s.source.element返回一个元素,调用s.source.element->。。。相当于s.source.element.oclAsSet->。。。。在您的情况下,无论元素是否多,表达式都是相同的:

s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s))
此表达式在这两种情况下都适用

如果您确实不想收集,并且您的元素关系是单一的,那么您也可以这样写:

thisModule.createAnyMatchClass(s.source.elements)

当我编写类collect sipe | thisModule.CreateAnyMatchClasssipe时,它没有创建模型,我有一个错误。你知道我能做什么吗?我附加了我的元模型。在元模型中,s是指TransformationRule。当我将源代码替换为目标代码时,我没有错误,当我将源代码引用更改为0时..*仍然有错误在这一点上,您的问题与OCL没有直接关系,而是与ATL及其管理转换的方式有关。我认为您将有更多的机会在专门讨论ATL的Eclipse论坛上获得相关答案。谢谢。它适用于您编写的最后一行代码。当我重新启动eclipse时,我感到很惊讶,它可以正常工作!