我有一个类图,我需要为此编写一些OCL,但是我不确定正确的sintax。我已经搜索了很多,但是我发现了很多不同的方法,所以我想知道我将如何编写它们。 例如,在我的CD中,我将“票证”和“事件”类通过“票证validFor事件”角色链接在一起。票证的价格属性为浮动价格。这样写OCL来计算事件的总传入量是否正确?
CONTEXT Event::totalIncoming():float
post result=ticket.allInstances()->select(t : t.validFor=self)->collect(price)->sum()
我要购买所有门票,选择所有对事件有效的实例,收集价格并最终进行汇总。 我仅提供的所有信息就足够了,但是如果您需要更多信息,请告诉我。谢谢
答案 0 :(得分:0)
您提供的示例使用“完整OCL”;一个独立的文本文档,通常带有* .ocl文件扩展名,其中的基本OCL表达式具有环绕的上下文,如OCL规范的第12节“在UML模型中使用OCL表达式”所示。如果您想分离约束和模型问题和/或利用批量文本编辑的实用程序,则此方法很有用。
或者,您可以使用为每个UML约束提供一个文本框的工具。在这种情况下,您通常只输入一个基本OCL表达式,该工具就会以适当的方式包装为Constraint.body。
如果使用Ecore,则可以使用OCLinEcore将基本OCL表达式嵌入* .ecore或* .oclinecore中。
您的示例是错误的,因为您应使用小写的“上下文”,“:”以及“ post”之后的名称。
您的示例可能是错误的,因为您使用“票证”而不是“票证”类名。
您的示例不受欢迎,因为您使用allInstances,如果您实际计划执行OCL,则应尽可能避免使用该实例。
但是,也许您的意思是将“票证”作为集合成员变量,在这种情况下,allInstances()是错误的。 “ ticket-> select(...)”足以选择一些票证集合。
我怀疑“结果=票证->选择(validFor = self).price-> sum()”会起作用。然而,对validFor的反向测试可能是多余的,因为向前导航通常足以检查反向导航的冗余性。