Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_proektirovanie_2012.docx
Скачиваний:
58
Добавлен:
16.03.2015
Размер:
2.03 Mб
Скачать

16. Язык объектных ограничений ocl.Назначение и основные конструкции.

OCLпредназначен для записи различного рода ограничений и условий. Ориентирован на ОО среду во всех направлениях.

Основные элементы выражений языка – классы, объекты, типы.

Автор языка – Joss Warrence (IBM). Язык является формальным, строго типизируемым, но не интерпретируемый (программы писать нельзя). Позволяет строго и точно записать различные условия и ограничения по классам, атрибутам, методам, имеет понятный синтаксис.

Основной конструкцией языка является выражение(context–ключевое слово).

В выражении и записывается все условия и ограничения, действующие в системе.

Каждое выражение языка является контекстно-зависимым – привязанным к окружающей обстановке или к некоторому типу, классу, который указывается после слова context.

Имеется 3 типа ограничений:

Inv– инвариант

Pre- предусловие

Post– постусловие

Инвариант – некоторое условие, которое сохраняется в определенном контексте. Условий может быть много.

Пред и пост условия – используется для записи ограничений по использованию определенных методов и классов.

Pre– условие, которое должно быть выполнено перед операцией.

Post– условие, которое должно быть выполнено после операции.

Self. – разыменование - ссылка на тот тип или класс, который оговорен в контексте (на экземпляр).

Выражение может формулировать некоторое ограничение или запрос. Но никакое выражение не изменяет состояние контекста. Носит только информативный характер.

Выражение не расширяет семантику UML, может лишь ограничить.

Пример:

Contextкомпания(класс)inv:

Self.numberOfEmp(атрибут)>0 или

Contextb: компанияinv:

b.numberOfEmp>0 или

Contextb: компанияinvОгрПоПерсоналу(имя ограничения):

b.numberOfEmp>0

На диаграммах строки выражений OCLмогут привязываться к элементам диаграмм пунктирной линией. В языке определены все основные типы данных:

Boolean,Integer,Real,String

Основные операции:

Boolean : And, or, xor, not, implies(импликация), if-then-else-endif

Integer: +,-,*,/, div, abs, mod,max, min

Real: +,-,*, abs,floor, round, max, min

String: concat, size(), toUpper, toLower(переход в верхний, нижний регистр)

Используются: ( ), <,>,<>,=,<=,>=.

/-при условии

Приоритеты операций:

@pre– ссылка на предыдущее условие

. или -> для выражений и работы с коллекциями

Not или унитарный

*, /

+, -

If _ then_ else_endif

>,<,>=, <=

=,<>

And,or,xor

Implies

-- комментарий

Операция может быть записана в 2 формах:

- обычной : a+b,

Инфиксной : a.+(b),

Пример:

b1 xor b2 b1.xor b2

true=b1=true,b2=false; false =b1=true,b2= true;

нельзя смешивать разные типа данных. Исключение IntegerиReal.

Работа с коллекциями:

  • Неупорядоченное множество без повторов (set): {1,5,7,3,9}

  • упорядоченное множество без повторов (orderedset): {1,3,5,7,9}

  • Мультимножество (Bag) – неупорядоченное с повторами: {1,5,7,1,3,3}

  • Последовательность (sequence)- упорядоченное мультимножество: {1,1,3,3,6,7}

Операции с коллекциями:

  • Select– отбор элементов для которых условие выполняется

  • reject- отбор элементов для которых не выполняется

  • Exists– проверка на существование того или иного элемента.

Пример записи выражения:

  1. Contextкомпанияinv:

selfсотрудник ->reject(имеет семью) ->empty(пусто) – т.е. компания состоит только из семейных сотрудников;

  1. Context b:Банк inv:

b.клиент ->forall(счет>=100$) – т.е. для любого клиента счет должен быть >100;

  1. Context В: банк inv:

B. клиент ->forAll(x1,x2:Клиент|X1<>x2impliesX1.имя <>x2.имя) – условие уникальности имен клиента. Если х1 их2 –клиенты, и х1<>х2, то имена должны быть различны.

  1. contextx: Компанияinvконтроль_пакет_акций:

x.акционер ->exists(a: Акционер | а. количество_акций>=50% ‘от общего числа’) – т.е. если у акционера > 50% акций, то он акционер.

  1. Определение возраста сотрудника:

Set возраст: integer = t.Date – Self.b_Date

Context Сотрудник.возраст()

Post: if t_Date>=b_Date then

Возраст=возраст@pre +1

Else возраст = возраст@pre end if

t_date– текущая дата

b_date– дата рождения