Как перемещаться по классу ассоциации для создания ограничений с OCL? - PullRequest
0 голосов
/ 11 декабря 2018

Я изо всех сил пытаюсь найти способ перемещения по классу ассоциации, чтобы создать ограничения

Я проверил спецификацию здесь: https://www.omg.org/spec/OCL/About-OCL/

Это говорит: enter image description here

Допустим, у меня есть эта диаграмма классов: enter image description here

И эта диаграмма объектов: enter image description here

Как вы можете видеть, я создал ограничение в контексте класса A (чуть ниже имени класса), я попытался с нижним "c" и верхним "C", ни то, ни другое не работает ...

Context A:
inv: self.C[b].val.mod(2) = 0

(смысл ограничения не важен, я просто хотел бы заставить его работать)

Когда я выполняю процесс проверки, я получаю эту ошибку:

"Выражениеимеет ошибки: семантические ошибки в [0: 5]: нераспознанная переменная: (C) "

Это сообщение об ошибке выглядит логичным, поскольку я не вижу атрибута" c "или" C "либо в объекте типа A, но я не понимаю, почему это так.

Я что-то не так делаю?Я не понимаю, почему это не работает, так как соблюдаю синтаксис, описанный в спецификации.

Для информации: я использую:

  • magic draw: v18.5
  • OCL: 2.0

Заранее спасибо!

1 Ответ

0 голосов
/ 11 декабря 2018

Ты смотришь в очень темный угол.Мои первые попытки на самом деле протестировать эту функциональность привели к тому, что я не смог найти инструмент UML, который мог бы нарисовать рис.Как только я понял текст, я понял, что есть много проблем;потенциальный конфликт между двумя различными синтаксисами x [y], усугубляемый коротким замыканием QVTo.Существует проблема с расширением на более чем двоичные ассоциации.Абстрактный синтаксис OCL по-прежнему использует понятия UML 1.x для AssociationEnd, а не свойство UML 2.x.

Следовательно, наблюдаемая вами функциональность является результатом лучших попыток некоторых поставщиков инструментов понять смыслочень неадекватная спецификация.

В MagicDraw вы использовали Dresden OCL, но я понимаю, что MagicDraw переключился на Eclipse OCL, возможно, Classic Eclipse OCL.Похоже, NoMagic весьма сдержанно относится к программному обеспечению с открытым исходным кодом, которое они распространяют.

Для более новой версии Ocl Pivot Eclipse, где я создаю прототипы решений для многих проблем OCL OMG, загрузка UML в Pivot нормализует многие концепции UML, так чтоАссоциации являются избыточными, если только для явной навигации по Ассоциации не требуется, чтобы класс ассоциации был изменен.Классы AssociationClasses нормализованы для классов ассоциации с обычными свойствами для каждой вероятной навигации.

Я думаю, что ваше выражение неверно.

self.C [b] не может быть квалифицированной ассоциацией, поскольку неявная A:Свойство: C не имеет ключа.

self.C [b] может быть неоднозначной навигацией A :: C, где неоднозначность A :: C разрешается выбором противоположного C :: b.Но A :: C не является неоднозначным, и его противоположностью является C :: a.Так что self.C должно быть адекватным, self.C [a] избыточно, self.C [b] неправильно по отношению к b.К сожалению, ваш инструментарий не любит self.C, поэтому ваш инструментарий неисправен.

Я думаю, вам следовало написать self.C.val.mod (2) = 0.

Прописная буква C верна.Строчные буквы были ошибочно предложены OCL <= 2.2 в соответствии с руководством по стилю UML.См. Абзац с отступом в разделе «Отсутствующие конечные имена ассоциации» в 7.5.4 OCL 2.4. </p>

...