【问题标题】:What is the correct interpretation for a number of OCL expressions that use "Shorthand for Collect"?使用“Shorthand for Collect”的许多 OCL 表达式的正确解释是什么?
【发布时间】:2018-08-13 15:16:09
【问题描述】:

给定以下 UML 模型:

我正在努力正确解释一些 OCL 表达式(都在“城市”类的上下文中)。我正在使用的 OCL 版本是 OCL 2.3.1(尽管如果 OCL 2.4 更适合回答我的问题,例如因为 OCL 的某些方面在 OCL 2.4 中更加清晰,我当然会感兴趣)。

  • 如果我想通过 OCL 确保城市中的每个房间都必须至少有一个窗户:
    • 让我们忘记强制“窗口”吧 - 此示例的目标是了解 OCL 表达式的外观。
    • inv: self.building.room.window->notEmpty() - 据我了解OCL,这并没有表达意图,因为这意味着城市中所有窗口的集合不能为空。 OCL 表达式使用 OCL 2.3.1 所称的“收集的简写”。该表达式也可以写成inv: self.building->collect(room)->collect(window)->notEmpty()。这是正确的吗?
    • inv: self.building.room->forAll(r|r.window->notEmpty()) - 这应该表达意图 - 对吗?
    • inv: self.building->forAll(b|b.room->forAll(r|r.window->notEmpty())) - 这也应该表达意图 - 对吗?
  • 考虑另一个要求是每个房间的面积必须大于 0:
    • inv: self.building.room.area > 0 - 这是一个有效的表达式吗? 如果是:
      • 如何评估此表达式(如果表达式有效) - 检查每个面积值是否大于 0(forAll),或者仅检查其中一个面积值是否大于 0(存在)?李>
      • 在 OCL 规范中,我找不到任何信息告诉我,在这个表达式中,面积值的集合是否都需要大于 0(隐式 forAll()),或者只需要大于 0(隐式存在())。您能否指出 OCL 规范中定义行为的部分?
    • inv: self.building.room->forAll(r|r.area > 0) - 这应该表达意图 - 对吗?

【问题讨论】:

    标签: ocl


    【解决方案1】:

    self.building.room.window => 是的,是的,是的

    您已在第一个示例中成功扩展 collect。在第二个中做同样的事情,假设房间只有一个区域。

    self->collect(building)->collect(room.area) > 0

    输入错误:Bag(Integer) > Integer

    self->collect(建筑)->collect(room.area)->size() > 0

    输入正确,但测试是否有多个区域

    self->collect(建筑)->collect(room.area)->sum() > 0

    输入正确并检测是否有任何(假定为非负)区域非零

    self->collect(building)->collect(room)->forAll(area > 0)

    非单人房间的测试

    (如果您使用 Eclipse OCL Xtext 控制台,您将看到您的类型错误和中间类型。)

    【讨论】:

    • 所以由于inv: self.building.room.area > 0 输入错误(Bag(Integer) > Integer),所以它是无效的。而self->collect(building)->collect(room)->forAll(area > 0)代表我问题中的最后一个表达,并且正确表达了意图?我只是想确保我做对了。
    • 是的,所以最大的简写可以是 inv: self.building.room->forAll(area > 0)
    • 谢谢 - 也感谢您提供有关 Eclipse OCL 的提示。
    猜你喜欢
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多