ocl - 使用“Shorthand for Collect”的许多 OCL 表达式的正确解释是什么?
问题描述
给定以下 UML 模型:
我正在努力正确解释一些 OCL 表达式(都在“City”类的上下文中)。我正在使用的 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()),或者只需要大于 1(隐式 exists()) . 你能指出定义行为的 OCL 规范的部分吗?
inv: self.building.room->forAll(r|r.area > 0)
- 这应该表达意图 - 对吗?
解决方案
self.building.room.window => 是的,是的,是的
您已在第一个示例中成功扩展 collect。在第二个中做同样的事情,假设房间只有一个区域。
自我->收集(建筑)->收集(房间.区域)> 0
输入错误: Bag(Integer) > Integer
自我->收集(建筑)->收集(房间.区域)->尺寸()> 0
输入正确但测试是否有多个区域
self->collect(建筑)->collect(room.area)->sum() > 0
输入正确并检测是否有任何(假定为非负)区域非零
self->collect(建筑)->collect(房间)->forAll(area > 0)
非单人间的测试
(如果您使用 Eclipse OCL Xtext 控制台,您将看到您的类型错误和中间类型。)
推荐阅读
- sql - 在 Where 子句中放置一个 case when 语句
- xcode - XCode 不断挂起
- c++ - 由于“没有合适的 UserTokenPolicy”,连接到 OpcUA-Server 失败
- node.js - 缓冲问题 | 即使mongodb关闭,猫鼬也会响应
- python - 基于条件的 DataFrame 中的新列
- c - 使用 getchar 时出现分段错误
- javascript - 在子项中更改后,动态链接到组件的道具变得未定义
- excel - 连接到受保护的访问 accdb 文件会引发“密码错误”
- sql - 了解 Oracle 函数中的“BULK COLLECT”
- javascript - 将类自动分配给新元素(使用父元素)