递归的 ocl 约束 class
ocl constraint with recursive class
关于一点上下文:一个 Class
可以有其他 Class
作为 Requirement
由学生采取。 Class
由 Student
通过 ClassGroup
获取,可以使用其属性 sessionYear
.
及时排序
我想放置一个 OCL 不变约束,它将检查 sessionYear
和 ClassGroup
是否在此 [= 之前已经采用了它的 Class
Requierement
17=]。
换句话说:sessionYear
for Requirement
< sessionYear
for 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)
中,sy
将不是 ClassGroup
所需的 Student
ClassTaken
,而是 ClassGroup
包含每个 OfferedGroup
实例的包 Requirement
。
尝试相当多的约束是黑客行为,并不总能在合理的时间内产生令人满意的结果。
OCL 是一种可读性适中的形式语言。
一旦您用英语(或法语或...)清楚地表达了约束的意图,您应该会发现它可以相对容易地音译成 OCL。
Think/design 请勿破解。
我最终做了这样的事情:
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)))
关于一点上下文:一个 Class
可以有其他 Class
作为 Requirement
由学生采取。 Class
由 Student
通过 ClassGroup
获取,可以使用其属性 sessionYear
.
我想放置一个 OCL 不变约束,它将检查 sessionYear
和 ClassGroup
是否在此 [= 之前已经采用了它的 Class
Requierement
17=]。
换句话说:sessionYear
for Requirement
< sessionYear
for 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)
中,sy
将不是 ClassGroup
所需的 Student
ClassTaken
,而是 ClassGroup
包含每个 OfferedGroup
实例的包 Requirement
。
尝试相当多的约束是黑客行为,并不总能在合理的时间内产生令人满意的结果。
OCL 是一种可读性适中的形式语言。
一旦您用英语(或法语或...)清楚地表达了约束的意图,您应该会发现它可以相对容易地音译成 OCL。
Think/design 请勿破解。
我最终做了这样的事情:
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)))