首页 > 解决方案 > 具有递归类的 ocl 约束

问题描述

对于一点上下文:aClass可以有其他Class的,Requirement以供学生使用。由ClassaStudent通过 a获取ClassGroup,可以使用其属性及时排序sessionYear

在此处输入图像描述

我想放置一个 OCL 不变约束,该约束将检查asessionYear是否已经在 this 之前被采用。ClassGroupClass RequierementsessionYear

换句话说:sessionYearfor Requirement< sessionYearforClass

我尝试了很多限制,我最接近的尝试是这个:

context Etudiant inv C6: if ClassTaken->notEmpty then classTaken->forAll(ct|ct.class.Requirement.OfferedGroup->collect(sessionYear)->forAll(sy| sy < cs.sessionYear)) else true endif

但问题是,在forAll(sy| sy->sy < cs.sessionYear),sy中将不是 a 所Student必需ClassTakenClassGroup,而是一个 Bag ,它的每个实例OfferedGroup都是Requirement它的。

标签: recursionconstraintsocl

解决方案


尝试相当多的约束是黑客行为,并不总能在合理的时间内产生令人满意的结果。

OCL 是一种可读性中等的形式语言。

一旦您用英语(或法语或......)清楚地表达了约束的意图,您应该会发现它可以相对容易地音译成 OCL。

思考/设计不要破解。


推荐阅读