![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
OCL предназначен для записи различного рода ограничений и условий. Ориентирован на ОО среду во всех направлениях.
Основные элементы выражений языка – классы, объекты, типы.
Автор языка – Joss Warrence (IBM). Язык является формальным, строго типизируемым, но не интерпретируемый (программы писать нельзя). Позволяет строго и точно записать различные условия и ограничения по классам, атрибутам, методам, имеет понятный синтаксис.
Основной конструкцией языка является выражение (context –ключевое слово).
В выражении и записывается все условия и ограничения, действующие в системе.
Каждое выражение языка является контекстно-зависимым – привязанным к окружающей обстановке или к некоторому типу, классу, который указывается после слова context.
Имеется 3 типа ограничений:
Inv – инвариант
Pre - предусловие
Post – постусловие
Инвариант – некоторое условие, которое сохраняется в определенном контексте. Условий может быть много.
Пред и пост условия – используется для записи ограничений по использованию определенных методов и классов.
Pre – условие, которое должно быть выполнено перед операцией.
Post – условие, которое должно быть выполнено после операции.
Self. – разыменование - ссылка на тот тип или класс, который оговорен в контексте (на экземпляр).
Выражение может формулировать некоторое ограничение или запрос. Но никакое выражение не изменяет состояние контекста. Носит только информативный характер.
Выражение не расширяет семантику UML, может лишь ограничить.
Пример:
Context компания (класс) inv:
Self.numberOfEmp (атрибут) >0 или
Context b: компания inv:
b.numberOfEmp>0 или
Context b: компания 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}
· упорядоченное множество без повторов (ordered set): {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(пусто) – т.е. компания состоит только из семейных сотрудников;
2) Context b:Банк inv:
b.клиент -> forall(счет>=100$) – т.е. для любого клиента счет должен быть >100;
3) Context В: банк inv:
B. клиент ->forAll(x1,x2:Клиент| X1<>x2 implies X1.имя <>x2.имя) – условие уникальности имен клиента. Если х1 их2 –клиенты, и х1<>х2, то имена должны быть различны.
4) context x: Компания inv контроль_пакет_акций:
x.акционер ->exists(a: Акционер | а. количество_акций>=50% ‘от общего числа’) – т.е. если у акционера > 50% акций, то он акционер.
5) Определение возраста сотрудника:
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 – дата рождения
Дата публикования: 2015-02-18; Прочитано: 1083 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!