OCL связь по работе между двумя классами - PullRequest
0 голосов
/ 05 октября 2018

У меня есть диаграмма классов, и мне нужно написать о ней OCL, но я не уверен насчет правильного синтаксиса.Я много искал, но я нашел много разных способов, поэтому я хотел бы знать, правильный ли способ, которым я собираюсь их написать.Например, на моем CD есть классы Ticket и Event, связанные ролью 'ticket validFor event'.Билет имеет ценовой атрибут float.Правильно ли это написать OCL для расчета общего количества поступивших событий?

CONTEXT Event::totalIncoming():float
post result=ticket.allInstances()->select(t : t.validFor=self)->collect(price)->sum()

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

1 Ответ

0 голосов
/ 06 октября 2018

В приведенном вами примере используется 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 может быть избыточным, так как прямой навигации часто бывает достаточно с проверкой избыточной обратной навигации.

...