recursion - 具有递归类的 ocl 约束
问题描述
对于一点上下文:aClass
可以有其他Class
的,Requirement
以供学生使用。由Class
aStudent
通过 a获取ClassGroup
,可以使用其属性及时排序sessionYear
。
我想放置一个 OCL 不变约束,该约束将检查asessionYear
是否已经在 this 之前被采用。ClassGroup
Class
Requierement
sessionYear
换句话说:sessionYear
for Requirement
< sessionYear
forClass
我尝试了很多限制,我最接近的尝试是这个:
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
必需ClassTaken
的ClassGroup
,而是一个 Bag ,它的每个实例OfferedGroup
都是Requirement
它的。
解决方案
尝试相当多的约束是黑客行为,并不总能在合理的时间内产生令人满意的结果。
OCL 是一种可读性中等的形式语言。
一旦您用英语(或法语或......)清楚地表达了约束的意图,您应该会发现它可以相对容易地音译成 OCL。
思考/设计不要破解。
推荐阅读
- kubernetes - k8s节点状态的自定义条件
- c# - 如何使用 CommandLineUtils ExecuteAsync 定义在命令解析错误的情况下执行的行为?
- java - 在 Hibernate 中执行 save() 时,弯引号变成 SQL 中的问号?
- java - 将子递归添加到树结构(父之前的子)
- arrays - 尽管在读取之前存储了数据,但我无法从数组中读取数据。我需要帮助。C
- java - 从spring webflux中的post请求打印处理程序中的正文
- r - 从 anova 到锯齿状的 ancova
- javascript - 模拟 XMLHttpRequest 和窗口、文档
- reactjs - useState() 如何在这里更新我的数据?奇怪的
- javascript - javascript中的布尔值和字符串