两个类别之间操作的 OCL 债券

问题描述 投票:0回答:1

我有一个类图,我需要写一些关于它的 OCL,但我不确定正确的语法。我进行了很多搜索,但发现了很多不同的方法,所以我想知道我要编写的方法是否正确。 例如,在我的 CD 中,我有通过角色“ticket validFor event”链接的 Ticket 和 Event 类。门票的价格属性是浮动的。这种写OCL来计算事件总传入的方式正确吗?

CONTEXT Event::totalIncoming():float
post result=ticket.allInstances()->select(t : t.validFor=self)->collect(price)->sum()

我正在获取所有门票实例,选择该活动的所有有效实例,收集它们的价格,最后对它们进行求和。 我认为我提供的所有信息就足够了,但如果您需要更多信息,请告诉我。谢谢

class diagram class-diagram ocl
1个回答
1
投票

您提供的示例使用完整的OCL;一个独立的文本文档,通常带有 *.ocl 文件扩展名,其中基本 OCL 表达式被赋予周围上下文,如 OCL 规范第 12 节所示:“OCL 表达式在 UML 模型中的使用”。如果您想要分离约束和模型问题和/或利用批量文本编辑的实用程序,此方法会很有帮助。

或者,您可以使用为每个 UML 约束提供文本框的工具。在这种情况下,您通常只输入一个 Essential OCL 表达式,该工具以适当的方式将其包装为 Constraint.body。

如果使用 Ecore,您可以使用 OCLinEcore 将 Essential OCL 表达式嵌入到 *.ecore 或 *.oclinecore 中。

您的示例是错误的,因为您应该使用小写的“context”和“:”,以及可选的“post”后面的名称。

您的示例可能是错误的,因为您使用“ticket”而不是“Ticket”类名称。

您的示例是不可取的,因为您使用了 allInstances,如果您确实计划执行 OCL,则应尽可能避免使用 allInstances。

但是,也许您确实将“ticket”作为集合成员变量,在这种情况下 allInstances() 是错误的。 “ticket->select(...)”足以选择一些票证集合。

我怀疑“result = Ticket->select(validFor=self).price->sum()”就可以了。然而,validFor 的反向测试可能是多余的,因为前向导航通常足以检查反向导航冗余。

© www.soinside.com 2019 - 2024. All rights reserved.