Базы данных. Вводный курс


              

Тот же инвариант можно сформулировать


Тот же инвариант можно сформулировать в контексте класса Сотрудник:
context Сотрудник inv: self.возраст > 30 or self.отдел.номер
5
Здесь следует обратить внимание на подвыражение self.отдел.номер
5. Поскольку отдел – это имя роли соединения, значением подвыражения self.отдел является коллекция (множество). Но кратность роли отдел равна единице, т. е. каждому объекту служащего соответствует в точности один объект отдела. Поэтому в OCL допускается сокращенная запись операции self.отдел.номер, значением которой является номер отдела текущего служащего.
Пример 11.3. Определить ограничение, в соответствии с которым у каждого отдела должен быть менеджер, и любой отдел должен быть основан не раньше соответствующей компании:
context Отдел inv: self.служащий
exists (должность = "manager") and self.компания.годОснования
self.годОснования
Здесь должность – атрибут класса Служащий, а атрибуты с именем годОснования имеются и у класса Отдел, и у класса Компания. В условном выражении этого инварианта подвыражение self.служащий
exists (должность = "manager") эквивалентно выражению self.служащий
select (должность = "manager")
size () > 1. Если бы в ограничении мы потребовали, чтобы у каждого отдела был только один менеджер, то следовало бы написать ... size () = 1, и это было бы не эквивалентно варианту с exists.
Обратите внимание, что в этом случае снова законным является подвыражение self.компания.годОснования, поскольку кратность роли компания в ассоциации классов Отдел и Компания равна единице.
Пример 11.4. Условие четвертого инварианта ограничивает максимально возможное количество служащих компании числом 1000:
context Компания inv: self.отдел
collect (служащие)
size ( ) < 1000
Здесь полезно обратить внимание на использование операции collect. Проследим за вычислением условного выражения. В нашем случае в классе Компания всего один объект, и он сразу становится текущим. В результате выполнения операции self.отдел будет получено множество объектов, соответствующих всем отделам компании.При выполнении операции collect (служащие) для каждого объекта-отдела по соединению с объектами класса СЛУЖАЩИЕ будет образовано множество объектов-служащих данного отдела, а в результате будет образовано множество объектов, соответствующих всем служащим всех отделов компании, т. е. всем служащим компании.

Содержание  Назад  Вперед