我有以下课程:
我想在OCL中表达以下约束:
pre中的每个字符串都必须包含(' not'和'')或不包含' '
有可能吗?我怎么写呢? 谢谢!!
P.S。写作' '我的意思是一个空白。
答案 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变量。