OCL:
Reguła biznesowa jest stwierdzeniem, które definiuje lubogranicza pewne elementy/aspekty biznesu.Opisuje operacje definicje i ograniczenia, które stosuje się doorganizacji zapewniając osiągnięcie jej celów; jest abstrakcją politykii praktyk stosowanych w organizacji.
Kategorie reguł:
• Definicja terminów biznesowych (np. obywatelpolski, posiadający adres zam. w POLSCE…)
• Fakty pokazujące relacje między terminami (Czytelnik może wypozyczyćksiązkę)
• Ograniczenia (określenie zachowania, wartość; mozna miećwypozycz. max 5 ksiązek w jednym czasie.)
• Wnioskowania (wiedza z jednej postaci przekształcona w innąwiedzę- Czytelnik musi mieć PESEL)
stereotypy : Element klasyfikacyjny, używany do specjalizacji(uzupełnienia) semantyki elementu modelu jużzdefiniowanegow języku np.: (<<nazwa>>)
wartosci znakowane : Bezpośredni opis właściwości elementu modelu w postaci parynazwa – wartość (Name = Value ;Name)
Ograniczenia : Semantyczny warunek lub zawęzenienałozone na element modelu/restrykcja nałozona na jedną lub więcej wartości (części) modelu lubsystemu obiektowego
Składnia : Zdefiniowana przez OCL - Object Constraint Languagezapisywane w nawiasach klamrowych {ograniczenie}
Przykłady
{ subset } { x.a> 10 } { ordered }
Dzięki ograniczeniom uzyskuje się:
• poprawienie jakości dokumentacji
• zwiększenie precyzji diagramów
• polepszenie zrozumienia miedzy klientem a projektantami
Dowolne elementy modelu UML (klasy, atrybuty, operacje) mogąbyć opatrzone ograniczeniami, zapisywanymi w nawiasach {}.
Ograniczenia na model system mogą przyjąć postać:
1. niezmienników dla atrybutów klasy
2. niezmienników dla asocjacji klasy
3. określenia warunków początkowych i końcowych realizacji operacji
4. ograniczeń dla relacji generalizacji
5. precyzowania sposobu postępowania z kolekcjami
W UML są zdefiniowane 3 stereotypy odpowiadające pojęciom 1-3:
«invariant», «precondition» oraz «postcondition>>
Język OCL –podstawy
Charakterystyka języka OCL:
- język deklaratywny
- kontekstowy język wyrażeń
- silnie typizowany z rozbudowaną hierarchią typów
- bez tzw. efektów ubocznych (nie zmienia stanu modelu)
- prosty (zgodnie z deklaracją autorów)
Wyrazenia OCL są wykorzystywane m.in. do definicji:
1) inwariantów (niezmienników) klas,
2) warunków pre i post dla operacji
3) specyfikacji wyrażeń nawigacyjnych
Ograniczenie OCl jest wyrażeniem OCL typu Boolean.
WyrazenieOCl to wyrazenie napisane zgodnie z regułami języka OCL.
Typy predefiniowane:
• typy podstawowe
• typy kolekcyjne
Predefiniowanetypypodstawowe to:
Integer, Real, String i Boolean
• Boolean – true, false
• Integer -–…-1, 0, 1, …
• Real -– liczby rzeczywiste...
• String -– ‘ciąg znaków’
Uwaga:
UML dopuszcza stosowanie typu wyliczeniowego.Aby odwołać sie do wartości takiego typu w języku OCL należypoprzedzić go symbolem #.
Inwariant (niezmiennik) klasy – wyrazenie logiczne, które powinno byćspełnione w kazdym momencie przez wszystkie obiekty danej klasy.
context [nazwa_obiektu:]nazwa_klasy
inv [nazwa_inwariantu]: warunek_logiczny -- inwariant 1
inv [nazwa_inwariantu]: warunek_logiczny -- inwariant 2
Przykład: Osoba ma co najmniej 18 lat
context Osobainv:
self.wiek> 18
context Osoba inv:
wiek > 18 -- self opuszczony
context os: Osoba inv: -- os – jawna nazwa instancji klasy Osoba
self.wiek> 18
context Osoba invwiek_osoby: -- inwariant ma nazwę
self.wiek> 18
Ograniczenia początkowe dla atrybutów – wartościpoczątkowe atrybutu.
Przykład:
context Czytelnik Instytucjonalny::rzetelny:Wylicz
init: if self.nazwa==‘XXX’ then # wysoka else #niska
Definicja ograniczeń dla operacji
contextNazwaKlasy::NazwaOperacji(par1 : Typ1, ... ) : TypWyniku
pre [nazwa_warunku]: par1 > 0 ... -- warunki wstępne
post [nazwa_warunku]: result = par1 + …
-- result słowo zastrzeżone
-- do definiowania wyniku operacji
context Dziennik::srednia_osoby(o : Osoba):Real
post: result = 5
-- to tylko przykład
-- brak pre oznacza brak ograniczeń; pre : true
W warunku post mozliwe jest takze odwoływanie się do poprzednich(początkowych) wartości parametrów wywołania operacji poprzezuzycie operatora @pre.
Przykład:
ob.imie@pre oznacza wartość poprzednią (przed wykonaniem operacji)atrybutu imie obiektu ob.
Ograniczenia: Nawigowanie po modelu
Szczególnymi własnościami klas są związki (asocjacji, agregacji) zinnymi klasami.Opisując ograniczenia powiązań klasy za pomocą OCL można sięodwoływać do obiektów na drugim końcu powiązania poprzez nazwęroli.
Odwołanie do obiektu powiązanego przez nawigacjęza pomocą notacji kropkowej. Drugi koniec jest identyfikowany przez nazwę roli lub, gdy jej brak,przez nazwę klasy (pisaną małą literą).
context Rezerwacja
inv:czytelnik.nazwa<> ‘’
-- czytelnik musi mieć nazwę;
Ograniczenia: Nawigowanie po modelu - kolekcje
Jeśli występuje powiązanie obiektu z wieloma obiektami klasy, toodwołania dotyczą kolekcji obiektów.
Do własności kolekcji odwołuje się poprzez notację „->”,
np. jeżeli X jest kolekcją,to X->size() jest wywołaniem funkcji zwracającej rozmiarkolekcji.
Przykład:
context Czytelnik inv:
self.rezerwacja->size() < 3
-- czytelnik ma najwyżej 3 rezerwacje
Typy języka OCL (cd)
Predefiniowane typy kolekcyjne Collection(T) to
• zbiory – Set(T)
• ciągi – Sequence(T)
• wielozbiory – Bag(T)
Typy specjalne
• OclAny -- nadtyp wszystkich innych typów OCL, oclIsTypeOf(T:OclType):Boolean, oclIsKindOf(t: OclType): Boolean
• OclType, -- dowolny typ OCL,
Typy użytkownika modelowe:
Wszystkie klasy, interfejsy i inne typy utworzone przez użytkownika wmodelu UML
Kolekcja
Definicje kolekcji – wyrażenia typu kolekcja
Set{1, 2, 4, 5}
-- elementy zbioru nie są uporządkowane
Sequence{1, 2, 3, 2, 3}
-- elementy ciągu są uporządkowane
Sequence{1.. 3, 2 .. 3}
-- elementy ciągu są uporządkowane
Bag{1, 2, 3, 2, 3}
-- elementy wielozbioru nie są uporządkowane
Elementami kolekcji mogą być równieżkolekcje.
W przypadku zbioru zbiorów następuje automatyczne spłaszczeniedo jednego zbioru.Na przykład, podane zbiory są identyczne:
Set{Set{1,2},Set{3,4}} i Set{1..4}
Zgodność typów Typ t1 jest zgodny z typem t2 (jest podtypemtypu t2), gdy w dowolnym miejscu, w którym oczekiwana jestinstancja (wartość) typu t2, może ona zastąpiona przez instancjętypu t1.
Każdy typ jest zgodny ze swoim nadtypem.
Relacja zgodności typów jest przechodnia.
Typ jest zgodny zInteger Real
Set(T) Collection(T)
Sequence(T) Collection(T)
Bag(T) Collection(T)
Collection(T1) Collection(T2), gdy T1 jest podtypem T2
Operacje kolekcji
Podstawowe operacje dla kolekcji
collection->isEmpty() : Boolean
– sprawdza czy kolekcja jest pusta,
collection->size() : Integer
– zwraca rozmiar kolekcji (ilość jejelementów),
collection->includes(object : OclAny) : Boolean
– sprawdza czy obiektobject jest w danej kolekcji
collection->sum() : T
– zwraca sumę wszystkich elementów kolekcji,
collection->exists(expr : OclExpression) : Boolean
collection->forAll (expr : OclExpression) : Boolean
operacje reprezentujące kwantyfikatory ogólne dla kolekcji– jeżeli dla każdego elementu kolekcji wyrażenie expr jest prawdziwe to operacjaforAll zwraca True, jeżeli istnieje choć jeden element dla którego prawdziwe jestwyrażenie expr, to operacja exists zwraca TrueOperacja collect tworzy nową kolekcję na podstawie informacji z kolekcjipierwotnej, wstawiając do wynikowej kolekcji obliczone wyrażenia
collection->collect( expression )
collection->collect( v : Type | expression-with-v )
collection->collect( v : Type | expression-with-v )
Operacja select tworzy nową kolekcję będącą podkolekcjąkolekcji, dlaktórej wywołana została operacja.
collection->select( boolean-expression )
collection->select( v | boolean-expression-with-v )
collection->select( v : Type | boolean-expression-with-v)
Wynikiem tej operacji jest nowa kolekcja z tymi elementami zkolekcji źródłowej, dla których wyrażenie logiczne w operacji selectbyło prawdziwe.
Przykład
Rezerwacja.pozycja->select(k: pozycja.Książka | k.autor =”Pressman”)
Iteracja po elementach kolekcji
Operacja iterate – uniwersalna operacja dla kolekcji; za jej pomocąmozna zdefiniować inne operacje, np. collect, sum, average, itp.Ogólnapostaćoperacji iterate:
collection->iterate( elem : Type; acc : Type = <expression> |expression-with-elem-and-acc )
• Operacja ta przebiega całą kolekcję z iteratoremelem.
• Acc jest akumulatorem, który może być na początku zainicjowany wartościąpoczątkową (expression).
• Dla każdej wartości iteratora, czyli dla wszystkich elementów kolekcjiobliczane jest wyrażenie expression-with-elem-and-acc, a jego wynik jestpodstawiany do akumulatora.
Przykład:
operacja sumowania wartości kolekcji (elementy typu Integer)zdefiniowana jako iteracja mogłaby wyglądać następująca:
collection->iterate(x : Integer; acc : Integer = 0; acc + x)
OCL - podsumowanie
Modele UML mogą być doprecyzowane przez formalniewyrażone ograniczenia w OCL.
OCL jest językiem tekstowy, kontekstowym, silnietypizowanym.Istnieje wiele narzędzi, w tym generatory kodu (sprawdzające„w locie” ograniczenia) przeznaczone dla OCL.