首页 > 解决方案 > 我怎么能说数组中的所有元素都必须在 OCL 中具有某些属性?

问题描述

我有以下课程:

在此处输入图像描述

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

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

是否可以?我该怎么写?谢谢!!

Ps 写 ' ' 我的意思是一个空格。

标签: umlocl

解决方案


您在使用正式英语方面做得相当好,因此现在很容易音译为 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 变量。


推荐阅读