我遇到了一些关于OCL表达的问题。在阅读了一些大学幻灯片并用谷歌搜索后,我仍然无法理解它。
我想知道你们中是否有人知道我应该阅读的任何好资源来理解这些东西。
困扰我的限制因素:
对于第一个我有:
上下文部门
inv self.stuff - > forAll(manager = self.staff.manager)
第二个:
上下文公司
inv self.employee - > select(manager = manager.manager) - >的isEmpty()
第3名:
上下文公司
inv self.employee - > select(salary> manager.salary) - >的isEmpty()
但我不认为这些是正确的。我最不确定的是,在实例2和实验3中,我是否将每个员工与他们的实际经理/经理薪水进行比较。
答案 0 :(得分:5)
答案 1 :(得分:4)
对于初学者,我会推荐这本书:对象约束语言:让你的模型为MDA做好准备,由Jos Warmer和Anneke Kleppe(Jos是OCL的主要创造者之一)。
还有这个免费OCL tutorial(pdf +幻灯片)
我也非常喜欢你已经找到的官方规范(特别是提供该语言的非正式描述的章节)。
答案 2 :(得分:4)
@Artur发布的PDF文件链接已更改,这是新链接 http://www.omg.org/spec/OCL/2.0/PDF/
答案 3 :(得分:3)
快速解决约束问题:
context Department inv: self.staff - > forAll(s1,s2 | s1.manager = s2.manager)
context公司信息: self.employee-> forAll(e | e.manager<> e)
context公司信息: self.employee-> forAll(e | e.salary< = e.manager.salary)
顺便说一句,我真的没有看到公司课的需要(你在系统中有多少公司类型的对象?)。如果所有公司的约束二和三都是真的,则可以使用Person作为上下文以这种方式表达(例如,使用数字2):context Person inv:self.manager<> self)
我们还可以在进行比较之前添加检查以查看员工是否有经理