Кто-нибудь знает хороший учебник Object Constraint Language (OCL)? - PullRequest
6 голосов
/ 23 мая 2009

Я столкнулся с парой вопросов о выражениях OCL. После прочтения некоторых университетских слайдов и поиска в Google я все еще не могу правильно понять.

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


Ограничения, которые меня беспокоят:

  1. Все работающие в отделе имеют одного и того же менеджера.
  2. Никто в компании не является его менеджером.
  3. Никто в компании не зарабатывает больше, чем его менеджер.

Для 1-го у меня есть:

отдел контекста

inv self.stuff -> forAll (manager = self.staff.manager)

2-й:

context Компания

inv self.employee -> select (manager = manager.manager) -> isEmpty ()

3-й:

context Компания

inv self.employee -> select (salary> manager.salary) -> isEmpty ()

но я не думаю, что это правильно. Больше всего я не уверен, сравниваю ли я в примерах 2 и 3 отдельных сотрудников с их реальной зарплатой менеджера / менеджера.

Ответы [ 4 ]

5 голосов
/ 23 мая 2009

Наконец-то есть что-то хорошее!

Это очень информативный документ (PDF) от Object Management Group (OMG):

Спецификация языка ограничения объекта

Я люблю отвечать на свои вопросы:)

4 голосов
/ 16 сентября 2010

Изменена ссылка на файл PDF, опубликованный @Artur, вот новая ссылка http://www.omg.org/spec/OCL/2.0/PDF/

4 голосов
/ 24 мая 2009

Для начинающих я бы порекомендовал эту книгу: Язык ограничений объектов: подготовка моделей к MDA от Джоса Уормера и Аннеке Клеппе (Джос был одним из главных создателей OCL).

Существует также это бесплатное OCL учебное пособие (pdf + слайды)

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

3 голосов
/ 24 мая 2009

Быстрое решение по ограничениям:

контекстный отдел инв: self.staff -> forAll (s1, s2 | s1.manager = s2.manager)

context Компания inv: self.employee-> forAll (e | e.manager <> e)

context Компания inv: self.employee-> forAll (e | e.salary <= e.manager.salary) </p>

Кстати, я действительно не вижу необходимости в классе Company (сколько объектов типа company у вас есть в системе?). Если ограничения два и три выполняются для всех компаний, то они могут быть выражены с использованием Person в качестве контекста следующим образом (например, с номером 2): context Person inv: self.manager <> self)

Мы также можем добавить проверки, чтобы увидеть, есть ли у сотрудника менеджер, прежде чем делать сравнение

...