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

Uml 我怎么能说数组中的所有元素在OCL中都必须具有某些属性?,uml,ocl,Uml,Ocl,我有以下课程: 我想在OCL中表达以下约束: pre中的每个字符串必须包含('not'和一个“”)或不包含“” 可能吗?我怎么写呢? 谢谢 注:写“我是指空白。你在使用正式英语方面做得相当好,所以现在OCL的音译很容易。但您使用的列表不是UML或OCL工具,所以不提供其操作,谁知道呢?因此,我假设您使用某种形式的集合,可能是序列。(在UML中,通过指定大于1的uopper界限,可以自动获取集合。) 理想情况下,您可以将其音译为: pre->forAll(s | (s.contains

我有以下课程:

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

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

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


注:写“我是指空白。

你在使用正式英语方面做得相当好,所以现在OCL的音译很容易。但您使用的列表不是UML或OCL工具,所以不提供其操作,谁知道呢?因此,我假设您使用某种形式的集合,可能是序列。(在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变量。

我不太了解OCL,但从您的回答中我了解到OCL依赖于一些实现(这里是Eclipse)。我以为OMG有一个“标准”。重读我的答案。我明确表示,最终答案是标准OCL。是的。但我解释了第一部分,即可能存在提供非标准内容的实现,如
String::tokenize()
@EdWillink我修改了类的UML图。这样我应该得到一个集合,并且用标准OCL编写的约束应该可以工作,不是吗?谢谢你的帮助@托马斯基利安。不幸的是,OMG OCL规范远远不够完美,因此工具供应商必须尽最大努力理解它。EclipseOCL原型化了一些解决方案,在OCL语言和OCL标准库之间引入了明确的区别,当然可以对其进行有益的扩展。