在某些情况下:Class
可以与其他Class
一起作为Requirement
供学生使用。 Class
由Student
通过ClassGroup
获取,sessionYear
可以通过其属性sessionYear
及时订购。
我想放置一个OCL不变约束,该约束将检查ClassGroup
和Class
的{{1}} Requierement
是否早于此{{1} }。
换句话说:sessionYear
的{{1}} <sessionYear
的{{1}}
我尝试了很多内容,而我最接近的尝试是:
Requirement
但是问题是,在sessionYear
中,Class
不是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)
的{{1}},而是sy
的每个Student
实例。
答案 0 :(得分:0)
尝试很多限制就是黑客行为,并且在合理的时间内并不能总是获得令人满意的结果。
OCL是一种中等可读的形式语言。
一旦您用英语(或法语或...)清楚地表达了约束的意图,您应该发现可以相对容易地将其音译为OCL。
认为/设计不能破解。
答案 1 :(得分:0)
我最终做了这样的事情:
context Student
inv C6: inscription->forAll(insc|ClassTaken.class.Requirement->forAll(prer|inscription->exists(preIns|preIns.ClassTaken.class = prer
and if preIns.ClassTaken = insc.ClassTaken then true
else preIns.ClassTaken.sessionYear < insc.ClassTaken.sessionYear endif)))