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

时间:2018-05-25 15:00:39

标签: uml ocl

我有以下课程:

enter image description here

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

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

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

P.S。写作' '我的意思是一个空白。

1 个答案:

答案 0 :(得分:3)

您在使用正式英语方面做得相当不错,因此现在很容易对OCL进行音译。但是您使用了List<>这不是一个UML或OCL设施,所以没有提供其操作谁知道?因此,我假设你使用某种形式的Collection,可能是Sequence。 (在UML中,通过指定大于1的uopper绑定来自动获取集合。)

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

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变量。