Тема_7 (1122352), страница 10
Текст из файла (страница 10)
Кузнецов. Базы данных.124Проектирование РБДДиаграммы классов языка UML(45)Операция floorвырабатываетОграниченияцелостностии язык OCL (14) Инвариант класса (5)наибольшее значение целого типа,меньшее или равное значениюпараметра операции Операция concat конкатенирует двестроки-аргументы size выдает целое значение, равноедлине строки-аргумента substring выдает подстроку строки-аргумента с заданными начальнойпозицией и длиной29.10.2009С.Д. Кузнецов. Базы данных.125Проектирование РБДДиаграммы классов языка UML(46)ОграниченияцелостностиOCL (15) Инвариант класса (6) Операциинади языкобъектамиВ OCL определены три операции надобъектами:получение значения атрибута;переход по экземпляру ассоциации,вызов операции класса (последняя операциядля целей проектирования «традиционных»реляционных БД несущественна)Для обозначения всех трех этих операцийиспользуется «точечная нотация»29.10.2009С.Д.
Кузнецов. Базы данных.126Проектирование РБДДиаграммы классов языка UML(47)Ограниченияцелостностии языкOCLРезультатомвыражениявида(16) Инвариант класса (7)объект>.<имя атрибута>является текущее значение атрибута с именем имяатрибута, если объект имеет такой атрибутЕсли атрибут типизирован именем некоторого класса, торезультатом вызова операции является некоторый объектэтого класса (объектный идентификатор), к которому такжеприменимы операции над объектами.В противном случае использование подобного выраженияприводит к возникновению ошибки типа29.10.2009С.Д.
Кузнецов. Базы данных.127Проектирование РБДДиаграммы классов языка UML(48)Ограниченияцелостностии язык OCL (17)Инвариант класса(8)Результатомпримененияк объектуоперацииперехода по экземпляру связи-ассоциацииявляется коллекция, содержащая все объекты,которые ассоциированы с данным объектомчерез указываемый экземпляр ассоциацииЭтот экземпляр ассоциации идентифицируетсяименем роли, противоположной по отношению кданному объектуТаким образом, синтаксис выражения переходапо соединению следующий:<объект>.<имя роли, противоположеннойпо отношению к объекту>29.10.2009С.Д. Кузнецов.
Базы данных.128Проектирование РБДДиаграммы классов языка UML(49)Ограниченияцелостностии язык OCLОперациинад множествами,(18) Инвариант класса (9)мультимножествамиипоследовательностямиВ OCL поддерживается обширный набор операций надзначениями коллекционных типов данныхОбсудим только те из них, которые являются уместными вконтексте данного разделаСинтаксически вызовы операций над коллекциямизаписываются в нотации, аналогичной точечной, но вместоточки используется стрелка (→)Общий синтаксис применения операции к коллекциивыглядит следующим образом:<коллекция> → <имя операции> (<списокфактических параметров>)29.10.2009С.Д. Кузнецов. Базы данных.129Проектирование РБДДиаграммы классов языка UML(50)ОграниченияцелостностиОперацияselect и язык OCL (19) Инвариант класса (10)В OCL определены три одноименных операцииselect, которые обрабатывают заданноемножество, мультимножество илипоследовательность на основе заданногологического выражения над элементамиколлекцииРезультатом каждой операции является новоемножество, мультимножество илипоследовательность, соответственно, из техэлементов входной коллекции, для которыхрезультатом вычисления логического выраженияявляется true29.10.2009С.Д.
Кузнецов. Базы данных.130Проектирование РБДДиаграммы классов языка UML(51)ОграниченияОперацияцелостностиcollectи язык OCL (20) Инвариант класса (11)В OCL определены три операции collect, параметрамикоторых являются множество, мультимножество илипоследовательность и некоторое выражение надэлементами соответствующей коллекцииРезультатом является мультимножество для операцийcollect, определенных над множествами имультимножествами, и последовательность для операцииcollect, определенной над последовательностьюПри этом результирующая коллекция соответствующеготипа (коллекция значений или объектов) состоит изрезультатов применения выражения к каждому элементувходной коллекции29.10.2009С.Д.
Кузнецов. Базы данных.131Проектирование РБДДиаграммы классов языка UML(52)Ограниченияцелостностиязык OCL (21) Инварианткласса (12) Операцияcollectииспользуется,главнымобразом, в тех случаях, когда от заданнойколлекции объектов требуется перейти кнекоторой другой коллекции объектов, которыеассоциированы с объектами исходной коллекциичерез некоторый экземпляр ассоциацииВ этом случае выражение над элементомисходной коллекции основывается на операцииперехода по экземпляру ассоциации29.10.2009С.Д.
Кузнецов. Базы данных.132Проектирование РБДДиаграммы классов языка UML(53)Операции целостностиexists, forAll,иcountОграниченияязык OCL (22) Инвариант класса (13)В OCL определены три одноименных операции exists надмножеством, мультимножеством и последовательностью;дополнительным параметром этих операций является логическоевыражениеВ результате каждой из этих операций выдается true в том и только втом случае, когда хотя бы для одного элемента входной коллекциизначением логического выражения является trueВ противном случае результатом операции является falseОперации forAll отличаются от операций exist тем, что в результатекаждой из них выдается true в том и только в том случае, когда длявсех элементов входной коллекции результатом вычислениялогического выражения является trueВ противном случае результатом операции будет falseОперация count применяется к коллекции и выдает числосодержащихся в ней элементов29.10.2009С.Д.
Кузнецов. Базы данных.133Проектирование РБДДиаграммы классов языка UML(54)Операциицелостностиunion, intersect, symmetricDifferenceОграниченияи языкOCL (23) Инвариант класса (14)Параметрами двуместных операций union (объединение),intersect (пересечение), symmetricDifference (симметричноевычитание) являются две коллекции, причем в OCLоперации определены почти для всех возможныхкомбинаций типов коллекцииНе будем рассматривать все определения этих операций икратко упомянем только две из нихРезультатом операции union, определенной над множествоми мультимножеством, является мультимножество, т. е.
изрезультата объединения таких двух коллекций дубликаты неисключаютсяРезультатом же операции union, определенной над двумямножествами, является множество, т. е. в этом случаевозможные дубликаты должны быть исключены29.10.2009С.Д. Кузнецов. Базы данных.134Проектирование РБДДиаграммы классов языка UML(55) Примеры инвариантовОграниченияцелостностии язык OCL (24) Инвариант класса (15)Определитьограничение«возрастслужащих должен быть больше 18 именьше 100 лет»context Служащий inv:self.возраст >18 andself.возраст < 100 Условие инварианта накладывает ограничение на значения атрибутавозраст класса Служащий self обозначает текущий объект класса-контекста инварианта При проверке данного условия будут перебираться существующие объектыкласса Служащий, и для каждого объекта будет проверяться, что значенияатрибута возраст находятся в пределах заданного диапазона Ограничение удовлетворяется, если условное выражение принимаетзначение true для каждого объекта класса-контекста29.10.2009С.Д.
Кузнецов. Базы данных.135Проектирование РБДДиаграммы классов языка UML(56)Выразить на языке OCL ограничение, вОграниченияцелостностии языксоответствиис которымв отделахс OCL (25) Инвариант класса (16)номерами больше 5 должны работатьсотрудники старше 30 летcontext Отдел inv:self.номер > 5 orself.служащий → select (возраст≤ 30) → count () = 0 Условное выражение инварианта будет вычисляться для каждого объекта классаОтдел Подвыражение справа от операции or вычисляется слева направо Сначала вычисляется подвыражение self.служащий, значением которогоявляется множество объектов, соответствующих служащим, которые работают втекущем отделе Далее к этому множеству применяется операция select (возраст > 30), врезультате которой вырабатывается множество объектов, соответствующихслужащим текущего отдела, возраст которых превышает 30 лет29.10.2009С.Д.
Кузнецов. Базы данных.136Проектирование РБДДиаграммы классов языка UML(57)Выразить на языке OCL ограничение, вОграниченияцелостностии языксоответствиис которымв отделахс OCL (26) Инвариант класса (17)номерами больше 5 должны работатьсотрудники старше 30 летcontext Отдел inv:self.номер ≤ 5 orself.служащий → select (возраст≤ 30) → count () = 0 Значением операции count () является число объектов в этоммножестве Все выражение принимает значение true, если последняя операциясравнения «=0» вырабатывает значение true, т.
е. если в текущем отделенет сотрудников младше 31 года Ограничение в целом удовлетворяется только в том случае, еслизначением условия инварианта является true для каждого отдела29.10.2009С.Д. Кузнецов. Базы данных.137Проектирование РБДДиаграммы классов языка UML(58)Тот же инвариант можноОграничения целостностиязык OCL (27) Инвариант класса (18)сформулироватьв контекстеиклассаСлужащий:context Служащий inv:self.возраст > 30 orself.отдел.номер ≤ 5 Здесь следует обратить внимание на подвыражение self.отдел.номер ≤ 5 Поскольку отдел – это имя роли ассоциации, значением подвыраженияself.отдел является коллекция (множество) Но кратность роли отдел равна единице, т.
е. каждому объекту служащегосоответствует в точности один объект отдела Поэтому в OCL допускается сокращенная запись операции self.отдел.номер,значением которой является номер отдела текущего служащего29.10.2009С.Д. Кузнецов. Базы данных.138Проектирование РБДДиаграммы классов языка UML(59) Определить ограничение, что у каждогоотделадолжен иметьсяменеджер,иОграниченияцелостностии языкOCLлюбой отдел должен быть основан нераньше соответствующей компании(28) Инвариант класса (19)context Отдел inv:self.служащий → exists (должность= “manager”) andself.компания.годОснования ≥self.годОснования Здесь должность – атрибут класса Служащий, а атрибуты с именемгодОснования имеются и у класса Отдел, и у класса Компания В условном выражении этого инварианта подвыражение self.служащий→ exists (должность = “manager”) эквивалентно выражению self.служащий→ select (должность = “manager”) → count () > 129.10.2009С.Д.