uml - 我怎么能说数组中的所有元素都必须在 OCL 中具有某些属性?
问题描述
我有以下课程:
我想在 OCL 中表达以下约束:
pre 中的每个字符串都必须包含 ('not' 和一个 ' ') 或不包含 ' '
是否可以?我该怎么写?谢谢!!
Ps 写 ' ' 我的意思是一个空格。
解决方案
您在使用正式英语方面做得相当好,因此现在很容易音译为 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 变量。
推荐阅读
- mysql - Laravel - 雄辩的查询没有给出预期的结果
- javascript - 自动化 SAPUI5 应用程序 - 是否可以使用其 API?
- android - '如何使用带有“Content-Type”的 Volley 发送 Post 请求:“application/x-www-form-urlencoded”
- python - 在views.py中处理的字段上的非空约束错误
- android - Exo 播放器有时在 android 中花费太多时间开始播放音频
- php - EverNote API findNotesMetadata 不会返回每个带有过滤器创建时间的笔记
- javascript - pac 文件 SyntaxError: Unexpected number 问题
- vector - 在 Rust 中迭代向量时何时使用引用?
- bash - shell如何删除具有几乎相同名称对的列表模式的第一个文件/文件夹
- google-sheets - 对 Google 表格中特定工作表的特定权限