Ocl 为什么allInstance不是唯一的?

Ocl 为什么allInstance不是唯一的?,ocl,Ocl,我有一个属性为noClient的类客户机,我想验证没有具有相同noClient的客户机 我有下面的答案,但老师说这不合适。因为合同可能会重复。我不知道为什么。我需要找到另一个解决方案 context Client inv NoClientUnique: Client.allInstances -> isUnique (noClient) 我的问题是,我甚至不知道上面的代码有什么问题,无法找到另一个解决方案 context Client inv NoClientUnique: Client

我有一个属性为noClient的类客户机,我想验证没有具有相同noClient的客户机

我有下面的答案,但老师说这不合适。因为合同可能会重复。我不知道为什么。我需要找到另一个解决方案

context Client
inv NoClientUnique: Client.allInstances -> isUnique (noClient)
我的问题是,我甚至不知道上面的代码有什么问题,无法找到另一个解决方案

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

这是一个学校的问题。也许挑战还不够,但我花了几个小时试图理解。我被困在这里。

除了一些小的语法错误(应该是allInstances()->),我认为你的表达没有问题。确保你没有误解你的老师关于约束应该约束什么的观点

我刚才在一个例子中看到,我的老师创建了一个类Singleton,然后使用Singleton作为上下文,而不是客户机

class Singleton
-- nothing here.
end
...
context Singleton
inv SingletonisUnique : Singleton.allInstances -> size() = 1
inv noClientUnique : Client.allInstances -> isUnique(noClient)

我认为这是我问题的关键,但我不明白其中的机制是什么。

你的老师是正确的,使用典型的OCL工具,将对每个客户重复所有客户的评估

但是你的老师也错了,一个好的OCL工具应该优化无自不变量,以达到与伪单例相同的效果。工具应该帮助用户避免强迫用户手动优化


更现实地说,客户机的容器可能是业务,您可以更合理地表达业务实践,即noClient在业务中是唯一的,因为它不是真正的客户机约束。

据我所知,在键入视图中,OclExpr in参数应该是一个布尔表达式来计算,但事实并非如此


当然,不同OCL工具的结果会有所不同。

另一个选项是:

context Client
inv NoClientUnique: Client.allInstances()->forAll(c1, c2 : Client | c1 <> c2 implies c1.noClient <> c2.noClient)
上下文客户端
inv NoClientUnique:Client.allInstances()->forAll(c1,c2:Client | c1 c2表示c1.noClient c2.noClient)

对于在2020年寻找答案的其他人:

Client.allInstances().collect(noClient) -> count(noClient) = 1

我使用的是来自不莱梅大学的USE,isUnique()操作无法正常工作。我花了一段时间才想出一个替代方案。

但是
noClient
没有在
Singleton
的上下文中定义。您的示例(问题)意味着不能有两个具有相同编号的客户端实例。如果你老师的例子是一个操作的后置条件,
noClientUnique(noClient)
,那么它可以工作,但是它不能作为单例的不变量。嗨,我把它给了老师,我遵循他的例子。我稍后会问他这个问题。如果我能理解他所说的话,请在这里报道。:)谢谢你们两位的帮助。