我正在学习OCL(使用" USE"),我在这里提出了一个关于isUnique()约束的问题,以下示例:
我们希望通过完整的课程建立客户编号的唯一约束,如下所示
context Client
inv NoClientUnique : Client.allInstances -> isUnique(noClient)
但是这个表达式远非最优,因为有可能重复验证约束。任何人都可以在这种情况下解释我,为什么,如果你能给我另一种方式来表达Client.noClient使用最优的唯一约束,请。我会感激任何帮助。
答案 0 :(得分:0)
OCL是一种声明性语言。因此,您表达您想要发生的事情,而不是如何做。在最佳参考执行时间时,讨论OCL表达式的最佳性是没有意义的。然后,翻译引擎应该能够将此声明性表达式转换为对象图的最有效的命令式遍历,以便对其进行验证。
答案 1 :(得分:0)
今天,您可以通过将约束放置在中性作用域类(例如ClientManager中)中来避免效率低下,该类仅需要在所有我的客户都是唯一的之后就断言。
实际上,应该始终存在这样一个作用域类,因为如果您使用子系统并多次实例化它,那么所有客户端都是唯一的约束就是一个谬论。如果唯一性是由一组属性而不是对象标识定义的,那么没有理由为什么两个不同的公司不应该拥有相同的客户端。
(建议应该有Package约束,这样在这种情况下,您可以将Package用作中立位置。)