7

我遇到了几个关于 OCL 表达式的问题。在阅读了一些大学幻灯片并在谷歌上搜索后,我仍然无法正确理解它。

我想知道你们中是否有人知道我应该阅读以理解这些东西的任何好资源。


困扰我的约束:

  1. 在部门工作的每个人都有同一个经理。
  2. 公司里没有人是他/她自己的经理。
  3. 公司里没有人比他的经理挣得更多。

对于第一个我有:

背景部门

inv self.stuff -> forAll(manager = self.staff.manager)

第二个:

背景公司

inv self.employee -> select(manager = manager.manager) -> isEmpty()

第三个:

背景公司

inv self.employee -> select(salary > manager.salary) -> isEmpty()

但我不认为这些是正确的。我最不确定的是,在示例 2 和示例 3 中,我是否真的将个别员工与他们的实际经理/经理工资进行了比较。

4

4 回答 4

5

终于有好东西了!

这是来自 Object Management Group (OMG) 的内容丰富的文档 (PDF):

对象约束语言规范

我喜欢回答我自己的问题:)

于 2009-05-23T19:56:50.567 回答
4

对于初学者,我会推荐这本书:对象约束语言:让您的模型为 MDA 做好准备,作者是 Jos Warmer 和 Anneke Kleppe(Jos 是 OCL 的主要创建者之一)。

还有这个免费的OCL 教程(pdf + 幻灯片)

我也很喜欢你已经找到的官方规范(特别是提供语言的非正式描述的章节)。

于 2009-05-23T21:41:17.253 回答
4

@Artur 发布的 PDF 文件的链接已更改,这是新链接 http://www.omg.org/spec/OCL/2.0/PDF/

于 2010-09-16T10:00:58.410 回答
3

关于约束的快速解决方案:

上下文部门 inv: self.staff -> forAll(s1,s2| s1.manager = s2.manager)

上下文公司 inv: self.employee->forAll(e| e.manager<>e)

上下文公司 inv: self.employee->forAll(e| e.salary<=e.manager.salary)

顺便说一句,我真的不认为需要 Company 类(系统中有多少 company 类型的对象?)。如果约束二和三对所有公司都成立,那么它们可以以这种方式使用 Person 作为上下文来表达(例如,使用数字 2): context Person inv: self.manager<>self)

我们还可以在进行比较之前添加检查以查看员工是否有经理

于 2009-05-23T23:02:27.540 回答