大量使用 "Shorthand for Collect" 的 OCL 表达式的正确解释是什么?
What is the correct interpretation for a number of OCL expressions that use "Shorthand for Collect"?
给定以下 UML 模型:
我正在努力正确解释某些 OCL 表达式(所有这些都在 class "City" 的上下文中)。我正在使用的 OCL 版本是 OCL 2.3.1(尽管如果 OCL 2.4 更适合回答我的问题,例如因为 OCL 的某些方面在 OCL 2.4 中更清晰,我当然感兴趣)。
- 如果我想通过OCL保证城市中的每个房间至少要有一个window:
- 让我们忘记强制要求 "window" - 这个例子的目的是理解 OCL 表达式需要是什么样子。
inv: self.building.room.window->notEmpty()
- 据我了解OCL,这并没有表达意图,因为这意味着城市中所有windows的集合不能为空。 OCL 表达式使用 OCL 2.3.1 调用的 "Shorthand for Collect"。表达式也可以写成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()),或者只是一个(一个隐式存在())。你能指出 OCL 规范中定义行为的部分吗?
inv: self.building.room->forAll(r|r.area > 0)
- 这应该表达了意图 - 正确吗?
self.building.room.window => 是的,是的,是的
您在第一个例子中成功展开了collect。在第二个中做同样的事情,假设房间只有一个区域。
自己->收集(建筑)->收集(room.area)> 0
输入错误:Bag(Integer) > Integer
self->collect(building)->collect(room.area)->size() > 0
输入正确但测试是否有多个区域
self->collect(building)->collect(room.area)->sum() > 0
输入正确并检测是否有任何(假设非负)区域非零
self->collect(building)->collect(room)->forAll(area > 0)
非单人房测试
(如果您使用 Eclipse OCL Xtext 控制台,您将看到类型错误和中间类型。)
给定以下 UML 模型:
- 如果我想通过OCL保证城市中的每个房间至少要有一个window:
- 让我们忘记强制要求 "window" - 这个例子的目的是理解 OCL 表达式需要是什么样子。
inv: self.building.room.window->notEmpty()
- 据我了解OCL,这并没有表达意图,因为这意味着城市中所有windows的集合不能为空。 OCL 表达式使用 OCL 2.3.1 调用的 "Shorthand for Collect"。表达式也可以写成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()),或者只是一个(一个隐式存在())。你能指出 OCL 规范中定义行为的部分吗?
inv: self.building.room->forAll(r|r.area > 0)
- 这应该表达了意图 - 正确吗?
self.building.room.window => 是的,是的,是的
您在第一个例子中成功展开了collect。在第二个中做同样的事情,假设房间只有一个区域。
自己->收集(建筑)->收集(room.area)> 0
输入错误:Bag(Integer) > Integer
self->collect(building)->collect(room.area)->size() > 0
输入正确但测试是否有多个区域
self->collect(building)->collect(room.area)->sum() > 0
输入正确并检测是否有任何(假设非负)区域非零
self->collect(building)->collect(room)->forAll(area > 0)
非单人房测试
(如果您使用 Eclipse OCL Xtext 控制台,您将看到类型错误和中间类型。)