0

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

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

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

我的问题是,我什至不知道上面的代码有什么问题才能找到另一个解决方案。

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

4

6 回答 6

1

除了小的语法错误(应该是 allInstances()-> )我看不出你的表达有问题。确保你没有误解你的老师关于约束应该约束什么

于 2014-02-27T10:10:22.623 回答
0

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

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

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

于 2014-02-27T12:23:50.557 回答
0

另一种选择是:

context Client
inv NoClientUnique: Client.allInstances()->forAll(c1, c2 : Client | c1 <> c2 implies c1.noClient <> c2.noClient)
于 2018-11-10T19:58:55.590 回答
0

据我所知,在打字视觉中,参数中的 OclExpr 应该是一个要计算的布尔表达式,这里不是这种情况。

当然,结果会因一种 OCL 工具而异。

于 2017-09-05T12:20:45.050 回答
0

您的老师是正确的,因为使用典型的 OCL 工具,所有客户的评估将针对每个客户重复进行。

但是你的老师也错了,一个像样的 OCL 工具应该优化自少不变量以达到与虚假 Singleton 相同的效果。工具应该帮助用户不要强迫用户手动优化。

更现实地说,Client 的容器可能是 Business,您可以更明智地表达业务实践,即 noClient 在 Business 中是唯一的,因为它并不是真正的 Client 约束。

于 2017-07-25T10:23:44.780 回答
0

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

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

我正在使用不来梅大学的 USE 并且 isUnique() 操作无法按预期工作。我花了一段时间才想出一个替代方案。

于 2020-11-26T15:38:14.203 回答