如何用OCL建模关联类约束:地点被2+用户收藏即为热门
正确的OCL约束:判断地点是否为热门地点
问题描述
需建模如下约束:当一个地点被2名及以上用户收藏时,该地点即为热门地点。尝试编写了OCL约束代码:
context place inv: place.popular = (self.user.place.popular>=2)但未达到预期效果,寻求正确的OCL约束写法。
问题分析
你的原约束存在两个核心问题:
- 循环依赖:用
place.popular属性本身来判断它的值,逻辑完全不成立,无法得到正确结果 - 导航路径错误:错误地从当前地点导航到用户,再回到地点,没有正确统计收藏该地点的用户数量
正确的OCL约束写法
根据UML模型中Place和User的关联关系,分两种场景给出正确约束:
场景1:Place类直接关联收藏它的用户集合
如果你的模型里,Place类有一个关联(比如名为fans或usersWhoFavorited)直接指向所有收藏该地点的用户,约束写法如下:
context Place inv: self.popular = (self.usersWhoFavorited->size() >= 2)
场景2:关联从User指向Place(无直接反向关联)
如果模型中只有User类有favoritePlaces这类属性指向收藏的地点,需要通过反向筛选所有用户来统计:
context Place inv: self.popular = (User.allInstances()->select(u | u.favoritePlaces->includes(self))->size() >= 2)
代码解释
->size():OCL中用来获取集合元素数量的操作符,这里用来统计收藏当前地点的用户总数- 场景1的写法更高效,因为直接访问
Place关联的用户集合;场景2适合没有设置反向关联的模型,通过全量用户筛选得到目标集合
内容的提问来源于stack exchange,提问作者JesusCrt
相关产品推荐
相关产品推荐

