Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Операции union, intersect, symmetricDifference




Операции exists, forAll, size

 

В OCL определены три одноименных операции exists над множеством, мультимножеством и последовательностью, дополнительным параметром которых является логическое выражение. В результате каждой из этих операций выдается true в том и только в том случае, когда хотя бы для одного элемента входной коллекции значением логического выражения является true. В противном случае результатом операции является false. Операции forAll отличаются от операций exist тем, что в результате каждой из этих операций выдается true в том и только в том случае, когда для всех элементов входной коллекции результатом вычисления логического выражения является true. В противном случае результатом операции является false. Операция size применяется к коллекции и выдает число содержащихся в ней элементов.

 

 

Параметрами двуместных операций union, intersect, symmetricDifference являются две коллекции, причем в OCL операции определены почти для всех возможных комбинаций типов коллекции. Не будем рассматривать все определения этих операций и кратко упомянем только две из них. Результатом операции union, определенной над множеством и мультимножеством, является мультимножество, то есть из результата объединения таких двух коллекций дубликаты не исключаются. Результатом же операции union, определенной над двумя множествами, является множество, т.е. в этом случае возможные дубликаты должны быть исключены.

 

Примеры инвариантов

 

В заключение обзора языка OCL приведем примеры четырех инвариантов, выраженных на этом языке. Будем основываться на диаграмме классов, показанной на рис. 10.14.

 

 
 

 

 


Рис. 10.14. Диаграмма классов, используемая для примеров на языке OCL

 

Пример 10.1

 

Определить ограничение “возраст служащих должен быть больше 18 и меньше 100 лет”.

 

context Служащий inv:
self.возраст >18 and self.возраст < 100

 

Условие инварианта накладывает требуемое ограничение на значения атрибута возраст, определенного в классе Служащий. В условном выражении инварианта ключевое слово self обозначает текущий объект класса-контекста инварианта. Можно считать, что при проверке данного условия будут перебираться существующие объекты класса Служащий, и для каждого объекта будет проверяться, что значения атрибута возраст находятся в пределах заданного диапазона. Ограничение удовлетворяется, если условное выражение принимает значение true для каждого объекта класса-контекста.

 

Пример 10.2

 

Выразить на языке OCL то ограничение, что отделах с номерами больше 5 должны работать сотрудники старше 30 лет.

 

context Отдел inv:
self.номер £ 5 or
self.служащий ® select (возраст £ 30) ® size () = 0

 

В этом случае условное выражение инварианта будет вычисляться для каждого объекта класса Отдел. Подвыражение справа от операции or вычисляется слева направо. Сначала вычисляется подвыражение self.служащий, значением которого является множество объектов, соответствующих служащим, которые работают в текущем отделе. Далее к этому множеству применяется операция select (возраст £ 30), в результате которой вырабатывается множество объектов, соответствующих служащим текущего отдела, возраст которых не превосходит 30 лет. Значением операции size () является число объектов в этом множестве. Все выражение принимает значение true, если последняя операция сравнения “=0” вырабатывает значение true, т.е. если в текущем отделе нет сотрудников младше 31 года. Ограничение в целом удовлетворяется тогда и только тогда, если значением условия инварианта является true для каждого отдела.

 

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

 

context Сотрудник inv:
self.возраст £ 30 or self.отдел.номер > 5

 

Здесь следует обратить внимание на подвыражение self.отдел.номер > 5. Поскольку отдел – это имя роли соединения, то значением подвыражения self.отдел является коллекция (множество). Но кратность роли отдел равна единице, т.е. каждому объекту служащего соответсвует с точности один объект отдела. Поэтому в OCL допускается сокращенная запись операции self.отдел.номер, значением которой является номер отдела текущего служащего.

 

Пример 10.3

 

Определить то ограничение, что у каждого отдела должен иметься менеджер, и что любой отдел должен быть основан не раньше основания соответствующей компании:

 

context Отдел inv:
self.служащий ® exists (должность = “manager”) and
self.компания.годОснования £ self.годОснования

 

Здесь должность – атрибут класса Сотрудники, а атрибуты с именем годОснования имеются и у класса Отдел, и у класса Компания. В условном выражении этого инварианта подвыражение self.служащий ® exists (должность = “manager”) эквивалентно выражению self.служащий ® select (должность = “manager”) ® size () > 1. Если в ограничении мы потребовали, чтобы у каждого отдела имелся в точности один менеджер, то следовало бы написать … size () > 1, и это было бы не эквивалентно варианту с exists.

 

Обратите внимание, что в этом случае снова законным является подвыражение self.компания.годОснования, поскольку кратность роли компания в ассоциации классов Отдел и Компания равна единице.

 

Пример 10.4

 

Условие четвертого инварианта ограничивает максимально возможное количество сотрудников компании числом 1000:

 

context Компания inv:
self.отдел ® collect (служащие) ® size () < 1000

 

Здесь полезно обратить внимание на использование операции collect. Проследим за вычислением условного выражения. В нашем случае в классе Компания всего один объект, и он сразу становится текущим. В результате выполнения операции self.отдел будет получено множество объектов, соответствующих всем отделам компании. При выполнении операции collect (служащие) для каждого объекта-отдела по соединению с объектами класса СЛУЖАЩИЕ будет образовано множество объектов-служащих данного отдела, а в результате будет образовано множество объектов, соответствующих всем служащим всех отделов компании, т.е. всем служащим компании.

 




Поделиться с друзьями:


Дата добавления: 2014-01-03; Просмотров: 260; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.032 сек.