Ограничение записи OCL для операции класса A и атрибута класса B

Следуя другому сообщению:

Я хотел бы знать, позволяет ли OCL следующее.

Представьте себе следующую диаграмму UML.

Как использовать ocl для моделирования: «человек может пить воду () только в том случае, если он из страны с названием« ABCD »И если население страны> = 1000000"

Конечно, пример чисто вымышленный.

================                  ================
|    Person    |                  |    Country   |
|--------------|                  |--------------|
|- name        |------------------|- id          |
|- age         |                  |- name        |
|--------------|                  |- population  |
|+ drinkWater()|                  ================
|+ drinkBeer() |                  
================                   

person S12000    schedule 06.05.2017    source источник


Ответы (1)


Вам нужно будет назвать роль Country (создайте именованный атрибут внутри Person). Итак, давайте назовем это country. Это, конечно, можно использовать "как обычно":

context Person::drinkWater()
pre Enough: self.country.name == "ABCD" and self.country.population >= 1000000
person qwerty_so    schedule 06.05.2017
comment
Привет Томас. Большое спасибо за ответ. Просто вопрос: что вы подразумеваете под достаточно? - person S12000; 06.05.2017
comment
Enough — это имя ограничения. Его можно было бы опустить, но я подумал, что это имя подойдет сюда. - person qwerty_so; 06.05.2017
comment
Полезно, но не обязательно явно указывать свойство Person::country. Все ассоциации всегда доступны для навигации в OCL (в обоих направлениях для объектов). В однозначных случаях целевой тип определяет неявную роль, поэтому просто обратитесь к свойству Country. В неоднозначных случаях двусмысленность может быть разрешена путем уточнения противоположности, которая в этом нереально полностью безымянном примере должна быть Country[Person] - person Ed Willink; 21.05.2018
comment
@EdWillink Спасибо за разъяснения. Должен признаться, что мои познания в самом OCL весьма рудиментарны. - person qwerty_so; 21.05.2018