-- - komentarz jednolinijkowy /* */
Transkrypt
-- - komentarz jednolinijkowy /* */
-/* */ - package komentarz jednolinijkowy komentarz pakiet, określa pakiet(przestrzeń nazw) w której znajduje się dany kontekst package Package::Firma … endpackage context kontekst, określa obiekt do którego się odnosimy coś definiując if then else endif słowa używane w wyrażeniach warunkowych inv context Pracownik:: plec:Plec init: if( plec == “M” ) then … else … endif - inwariant, niezmiennik – ustala zakres wartości, ogranicza daną wielkość context Pracownik inv: nazwa <> ”” inv: stawka > 0 init - inicjalizacja atrybutu – ustala wartość początkową danego atrybutu context Pracownik:: godziny:Integer init: 0 -- ustawia godziny wyrobione przez pracownika na 0 derive - ustala wartość atrybutu pochodnego na podstawie atrybutu bazowego – atrybut pochodny jest oznaczony jako „/atrybut” na diagramie klas w UMLu context Pracownik:: nadGodziny:Integer derive: if(godziny > 200) then godziny-200 else 0 endif def - definiuje zmienną globalną w danym kontekście context Pracownik def: pensjaPodstawowa:Real = 1200 self - odniesienie do obiektu na którym jest wywoływana dana operacja – analogiczny do this w językach programowania context Integer:: dodaj(drugi:Integer):Integer body: self + drugi pre - warunek początkowy operacji wywoływanej na rzecz danego obiektu context Integer:: Silnia():Integer pre: body - self >= 0 konstruktywnie definiuje operacje, NIE zmienia wartości żadnego z atrybutów obiektu, wynik operacji MUSI być znany context Pracownik:: wyplata():Real body: pensjaPodstawowa + dodatekStazowy – podatek() -- gdzie, obie zmienne są globalne, a podatek to zdefiniowana funkcja post - opisowo definiuje operacje, MOŻE zmieniać wartości atrybutów, wynik NIE musi być jednoznaczny context Pracownik:: dodajGodziny(ile:Integer):Integer pre: ile > 0 post: godziny = godziny@pre + ile and result = godziny -- gdzie „result” jest wynikiem zwracanym przez funkcję let … in- definiuje zmienną lokalną dla danego wyrażenia context Pracownik:: wyplata():Real body: let dodatek:Real = if( stanowisko = Stanowiska::Kierownik ) then 200 * stawka else 0,5*stawka + nadGodziny Endif in stawka * godziny + dodatek Tuple - złożony typ wyniku, potrafiący skumulować więcej niż jeden wynik, jeżeli rezultat funkcji ma być związany z parametrem, to parametr musi być typu wyjściowego(out) lub wejściowo-wyjściowego(inout). Context Pracownik:: wyplata(out podatek:Real):Real post: result = Tuple{ result:Real = podstawowaPensja + dodatek – podatek() pod:Real = podatek } -- i przykładowe odwołanie prac.wyplata(pod).result prac.wyplata(pod).pod Aksjomaty: true false false undefined or and implies implies undefined undefined undefined true ≡ ≡ ≡ ≡ true false true true Priorytety: najwyższy najniższy :: @pre . -> -(unarny) not * / + if-then-else-endif < > <= => = <> and or xor implies ↓ Predefiniowane typy w OCL: Typ Boolean Integer Real String Wartość true, false 1, -5, 2, 34, 26524, ... 1.5, 3.14, ... “To be or not to be...” Operacje na typach predefiniowanych: Typ Integer Real Boolean String Operacja *, +, -, /, abs() *, +, -, /, floor() and, or, xor, not, implies, if-then-else concat(), size(), substring() Element Collection Set(T) OrderedSet(T) Bag(T) Sequence(T) isUnique (element niepowtarzalny) Tak Tak Nie Nie isOrdered (element uporządkowany) Nie Tak Nie Tak