Papyrus中UML约束与Complete OCL文件使用问题咨询
1. Papyrus设置Bag、Set等OCL集合类型的方法
你需要先将OCL标准库导入当前Papyrus项目:右键项目→选择「导入」→找到「OCL Standard Library」元模型资源完成导入。导入后重新打开类型选择窗口,搜索Set/Bag/Sequence/OrderedSet即可找到对应的OCL集合类型。
如果你是和Ecore生态集成使用,也可以直接在属性面板的「OCL」标签页单独指定属性/操作的OCL集合类型,无需和Ecore默认的EList/EMap绑定,OCL校验时会优先读取你指定的OCL类型。
2. 跨类的操作定义方法
Complete OCL中直接用context关键字指定操作所属的上下文类,参数的类型直接引用对应类名即可,只要UML模型中存在该类定义,OCL解析器就能自动识别。
示例:假设要给Student类定义参数为Course类型的操作,写法如下:
-- 上下文是Student类,操作参数c是Course类实例 context Student::isEnrolledIn(c: Course) : Boolean post: result = self.enrolledCourses->includes(c)
3. 不同类之间的关联导航方法
直接使用UML类图中关联端的角色名导航即可,如果没有手动设置角色名,默认是关联对方类名的小写形式。
示例:假设Course和Student是多对多关联,Course端角色名为enrolledCourses,Student端角色名为enrolledStudents:
- 从Student实例导航到其选修的所有课程:
self.enrolledCourses - 从Course实例导航到选修该课程的所有学生:
self.enrolledStudents
导航得到的集合结果可以直接调用OCL的集合内置操作,比如->size()/->exists()等。
4. Complete OCL对def、let、if-then-else语法的支持情况
完全支持三类语法,用法示例如下:
def:用于在不修改UML模型的前提下,给指定类扩展辅助属性/操作
context Student def: totalCredits : Integer = self.enrolledCourses.credit->sum()
let:用于在约束/操作体内定义临时变量,缩小变量作用范围
context Student inv: let maxAllowedCredits: Integer = 20 in self.totalCredits <= maxAllowedCredits
if-then-else:标准条件分支语法,必须以endif收尾
context Course def: isCourseFull : Boolean = if self.enrolledStudents->size() >= self.capacity then true else false endif
内容的提问来源于stack exchange,提问作者Adalberto J. Brasaca
相关产品推荐
相关产品推荐

