В приведенном вами примере используется Complete OCL;автономный текстовый документ, часто с расширением файла * .ocl, в котором выражению Essential OCL дается окружающий контекст, как указано в разделе 12 спецификации OCL: «Использование выражений OCL в моделях UML».Этот подход полезен, если вы хотите отделить свои ограничения и проблемы модели и / или использовать утилиту массового редактирования текста.
В качестве альтернативы вы можете использовать инструмент, предоставляющий текстовое поле для каждого ограничения UML.В этом случае вы часто вводите только выражение Essential OCL, которое инструмент соответствующим образом упаковывает как Constraint.body.
При работе с Ecore вы можете использовать OCLinEcore для встраивания выражений Essential OCL в *.ecore или * .oclinecore.
Ваш пример неверен в том, что вы должны использовать строчные буквы "context", а также ":" и, возможно, имя после "post".
Ваш примервероятно, неправильно, потому что вы используете «тикет» вместо «Билет» для имени класса.
Ваш пример нежелателен в том смысле, что вы используете allInstances, которых следует избегать везде, где это возможно, если вы действительно планируете выполнить OCL.
Однако, возможно, вы имели в виду «билет» как переменную члена коллекции, и в этом случае allInstances () является неправильным."ticket-> select (...)" достаточно, чтобы выбрать часть коллекции билетов.
Я подозреваю, что "result = ticket-> select (validFor = self) .price-> sum ()"сделал бы.Однако обратное тестирование validFor может быть избыточным, так как прямой навигации часто бывает достаточно с проверкой избыточной обратной навигации.