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


Примеры инвариантов - часть 2


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

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 (служащие) для каждого объекта-отдела по соединению с объектами класса СЛУЖАЩИЕ будет образовано множество объектов-служащих данного отдела, а в результате будет образовано множество объектов, соответствующих всем служащим всех отделов компании, т. е. всем служащим компании.




Начало  Назад  Вперед



Книжный магазин