【发布时间】: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