如何为类变量添加OCL约束?复合模式下面积校验问题
OCL约束编写与应用类说明
你的两种写法问题分析
- 第一种写法:确实无法在OCL中引用方法的局部变量
sArea,OCL只能访问类的属性、关联以及方法的参数/返回值,方法内部的局部变量不在OCL的可见范围内,所以这个约束无效。 - 第二种写法:语法和逻辑都有问题。
def的写法不符合OCL规范,而且你误用了pre前置条件——这个约束是方法执行后要满足的规则,应该用后置条件post;同时let结合iterate的写法也存在语法错误。
正确的OCL约束写法
你需要约束的核心是:getSurfaceArea()的返回值既要等于所有子区域面积的总和,也要和类中存储的surfaceArea属性值一致。正确的后置条件写法如下:
context ComplexTerritory::getSurfaceArea(): Real post: result = self.surfaceArea and result = self.territories->sum(ter | ter.getSurfaceArea())
解释:
result是OCL的内置关键字,专门用来指代方法的返回值->sum()是OCL的集合操作,直接计算所有子区域getSurfaceArea()的总和,比iterate写法更简洁直观- 同时约束返回值等于存储的
surfaceArea、返回值等于子区域总和,确保三者完全一致
约束应用的类选择
应该把约束加在抽象类ComplexTerritory上,原因是:
- City作为ComplexTerritory的子类,会继承
getSurfaceArea()方法和对应的属性,父类上的约束会自动被子类继承,无需重复编写 - 所有继承自ComplexTerritory的子类都需要遵守这个面积一致性规则,父类层面的约束能统一规范所有子类的行为
内容的提问来源于stack exchange,提问作者Aleksa Majkic
相关产品推荐
相关产品推荐

