Как я могу сказать, что все элементы в массиве должны иметь какое-то свойство в OCL? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть следующий класс:

enter image description here

, и я хотел бы выразить в OCL следующее ограничение:

Каждая строка в pre должна содержать ('not' and one '') или не содержать ''

Возможно ли это?Как я могу написать это?Спасибо !!

Ps Под словом '' я имею в виду пробел.

1 Ответ

0 голосов
/ 25 мая 2018

Вы отлично поработали, используя формальный английский, поэтому транслитерация в OCL теперь проста.Но вы использовали List <>, который не является средством UML или OCL, поэтому, не предоставляя свои операции, кто знает?Поэтому я предполагаю, что вы используете какую-то форму Коллекции, возможно, Последовательность.(В 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 :: match (), любой из которых может быть использован.Но в Стандартном OCL нам, вероятно, придется прибегнуть к символам (), чтобы создать Последовательность строк, каждый из которых содержит один символ.

For s.contains('not') use s.indexOf('not') >= 0
For s.count(' ') use s.characters->count(' ')

и чтобы избежать вычисления s.characters-> count ('') дважды приплохой инструмент OCL, введите переменную let.

...