我怎么能说一个数组中的所有元素在 OCL 中必须有一些 属性?

How can I say that all elements in an array must have some property in OCL?

我有以下 class:

我想在 OCL 中表达以下约束:

pre 中的每个字符串必须包含('not' 和一个 ' ')或不包含 ' '

可能吗?我怎么写呢? 谢谢!!

P.s。通过写 ' ' 我的意思是一个空格。

您在使用正式英语方面做得相当不错,因此现在可以轻松音译为 OCL。但是您使用的 List<> 不是 UML 或 OCL 工具,所以如果不提供它的操作谁知道呢?因此,我假设您使用某种形式的 Collection,可能是 Sequence。 (在 UML 中,您可以通过指定大于 1 的上界来自动获取集合。)

理想情况下,您可以音译为:

pre->forAll(s |
  (s.contains('not') and (s.count(' ') = 1)) or (s.count(' ') = 0))

但是标准 OCL 没有 String::contains() 或 String::::count() 所以我们必须更加努力地工作。 Eclipse OCL 有 String::tokenize()、String:lastIndexOf() 和 String::matches() 中的任何一个都可以使用。但是在标准 OCL 中,我们可能不得不求助于 characters() 来创建一个字符串序列,每个字符串包含一个字符。

For s.contains('not') use s.indexOf('not') >= 0
For s.count(' ') use s.characters->count(' ')

并且为了避免在糟糕的 OCL 工具上计算 s.characters->count(' ') 两次,引入一个 let 变量。