0

我正在学习 OCL(使用“USE”),我对 isUnique() 约束有疑问,下面是以下示例:

  • 我们想通过full类建立客户编号的唯一性约束如下

    context Client
    inv NoClientUnique : Client.allInstances -> isUnique(noClient)
    

但是这个表达式远非最优,因为约束可能会被重复验证。请任何人都可以向我解释这种情况以及原因,如果您能给我另一种方式来表达 Client.noClient 的唯一约束,请使用最优解。我会很感激任何帮助。

4

2 回答 2

0

OCL 是一种声明性语言。因此,你表达你想要发生的事情,而不是如何去做。当最优指的是执行时间时,讨论 OCL 表达式的最优是没有意义的。然后,翻译引擎应该能够将此声明性表达式翻译成对象图的最有效的命令式遍历,以便对其进行验证。

于 2015-11-01T17:17:44.533 回答
0

今天,您可以通过将约束放置在中性范围类中来避免效率低下,例如可能只需要断言 all-my-clients 是唯一的 ClientManager。

实际上应该总是有这样一个作用域类,因为如果您使用您的子系统并多次实例化它,那么所有客户端都是唯一的约束是一个谬误。如果唯一性是由一组属性而不是对象身份定义的,那么两家不同的公司就没有理由不拥有相同的客户。

(有人建议应该可以有 Package 约束,以便在这种情况下您可以使用 Package 作为中性位置。)

于 2018-09-21T14:48:28.220 回答