Object Constraint Language Naš život se sastoji uglavnom iz snova, iz nesvesnog,, i on se mora dovesti u vezu s akcijom. Oni moraju biti spojeni u jedno. Anais Nin 9.2.202 2/ / 45 Istorija OCL 996. OA&D Domain task force iz OMG objavio je zahtev za ponudama za objektno orijentisanu analizu i dizajn 997. IBM i ObjecTime Limited su zajedno kreirali ponudu u koju je uključen i OCL 997. Jos Warmer iz IBM-a je razvio OCL izdvajajući i ga iz Syntropy metoda čiji su autori Steve Cook i John Daniels,, a partneri koji su kreirali UML uključili su OCL u UML. OCL formalizuje semantiku UML i omogućava formalizaciju ograničenja u strukturi modela 9.2.202 3/ / 45 Specifikacije OMG OMG-ove specifikacije uključuju: MDA (Model Driven Architecture) UML (Unified Modeling Language) CORBA (Common Object Request Broker Architecture) CW (Common Warehouse Metamodel) specifične industijske standarde za brojna vertikalna tržišta 9.2.202 4/ / 45 Object Constraint Language OCL je dodatak UML-u u pomoću u kojeg se pišu izrazi u obliku predikata koji specificiraju poslovna pravila na nedvosmislen način Ograničen je na određeni broj konstrukcija,, ali može e biti iskorišćen i za opšta poslovna pravila Formalni, deklarativni jezik koji opisuje poslovna pravila na visokom nivou apstrakcije Dopunjuje dijagrame UML-a Manje detaljan od proceduralnog koda Kompletno dostupan na adresi: www.omg.org/cgi-bin/doc?formal/2006 bin/doc?formal/2006-05-00 9.2.202 5/ / 45 Karakteristike OCL Predstavlja deo UML standarda Jezik sa formalnim specifikacijama i preciznom semantikom Sintaksu je vrlo jednostavno čitati Pojavio se jer UML nije bio dovoljan za detaljnije opise ograničenja 9.2.202 6/ / 45 Osobine OCL ekspresivnost: : izrazi napisani u OCL-u u nemaju uticaj na model i stanje sistema, njime se može opisati kako će e se stanje menjati, ali ne u samom objektu modelovanje: : OCL je jezik za modelovanje, ne za programiranje, a svaki izraz je atomski i on ne menja stanje objekta formalizam: : svi elementi u izrazu imaju jasno značenje i uključeni su u UML specifikacije jednostavnost: : ovi izrazi su jednostavni za razumevanje 9.2.202 7/ / 45 Oblasti primene OCL OCL može e biti korišten u različite ite svrhe: za detaljnija specificiranja klasa i tipova modela klasa za specificiranja stereotipova za opise prethodnih i naknadnih uslova za operacije i metode za opis zaštite kao navigacioni jezik za specificiranje ograničenja u operacijama 9.2.202 8/ / 45 Osnovi primene OCL OCL se koristi za formulisanja osobina objekata, kao i prethodnih i naknadnih uslova operacija ovo čini UML dijagrame klasa preciznijim OCL izrazi koriste rečnik UML dijagrama klasa OCL atributi služe za navigaciju kroz UML dijagrame klasa reč označava koji se element opisuje OCL može opisivati skupove elemenata i operacija, selekcije, iteracije, upite i generalne postupke ( forall ) 9.2.202 9/ / 45
Ključne reči i u OCL and attr def else endif endpackage if implies in inv let not oper or package post pre then xor 9.2.202 0/ / 45 Oblik OCL izraza NazivTipa stereotip: OCL-izraz kontekst je obavezna službena reč na početku stereotip se navodi jednom od službenih reči: inv oznaka <<invariant invariant>> >>,, mora biti tačna za sve instance klase pre označava ava <<precondition precondition>> post označava ava <<postcondition postcondition>> službena reč self označava ava instancu tekućeg eg objekta, a result povratnu vrednost Umesto self može e biti korištena i druga reč 9.2.202 / / 45 Primer OCL izraza Invarijanta je ograničenje koje mora biti tačno u celom toku životnog ciklusa objekta Vlasnik vozila mora imati najmanje 8 godina : inv: self.. >= 8 9.2.202 2/ / 45 Primer zamene reči i self Kompanija mora imati više e od 50 zaposlenih c: Kompanija inv: c.brzaposl > 50 Kompanija brzaposl 9.2.202 3/ / 45 Vlasnik auta mora imati bar 8 godina Jedna osoba ne može imati više od 3 vozila Jedno lice može imati najviše crn auto Kako ih predstaviti u UML-u? Auto Bicikl 9.2.202 4/ / 45 Vlasnik auta mora imati bar 8 godina Auto inv: self.. >= 8 Auto Bicikl 9.2.202 5/ / 45 Jedna osoba ne može imati više od 3 vozila inv: self.vozni-park -> size <= 3 vozni-park Jedno lice može imati najviše crno vozilo inv: self.vozni-park -> select (v v. = #crna)->size <= Šta znači i sledeće e ograničenje? inv: self.vozni-park -> iterate(v; n:integer=0 if (v.=#crna) then n + else n endif) <=3 Jedna osoba ne može imati više od 3 vozila crne boje Auto Bicikl 9.2.202 6/ / 45 Auto Bicikl 9.2.202 7/ / 45 9.2.202 8/ / 45
Šta znači i sledeće e ograničenje? Auto inv: Auto.allInstances()->exists(c c.=#bela) Postoji beli auto Primeri prethodnih i naknadnih uslova Kontekst ograničenja se odnosi na operacije, tj. metode klasa Radnici u evidenciji moraju biti zaposleni, a obračunate plate veće e od 5000 Radnik::plata(zaposlen: Boolean): Real pre: : self.zaposlen = true post: self.plata > 5000 Primer dodele inicijalne vrednosti Broj radnika u odelenju postaviti inicijalno na nulu Odelenje::BrojRadnika init 0 9.2.202 9/ / 45 9.2.202 20/ / 45 9.2.202 2/ / 45 Primer izvedenih vrednosti PDV iznosi 20% naručene vrednosti Narudzba::Pdv derive: : Pdv = self.vrednost * 0.2 Primer kreiranja radnih atributa PDV iznosi 20% naručene vrednosti Narudzba::Pdv def: : Pdv: Real = self.vrednost * 0.2 Primeri operacija po tipovima podataka Integer: *, +, -, /, abs() Real: *, +, -, /, floor() Boolean: and, or, xor, not, implies, if-then-else String: concat(), size(), substring() 9.2.202 22/ / 45 9.2.202 23/ / 45 9.2.202 24/ / 45 Primer kreiranja operacija Sastaviti puno ime iz titule, imena i prezimena : ::PunoIme derive: titula.concat ( ( ).concat(ime).concat ( ( ).concat(prezime) Primer: nabrojivi tip podataka Kod ovog tipa podataka navodi se skup literala koji čini vrednost podatka inv: pol = Gender::male Primer: ograničenje vrednosti atributa mora imati više od nula godina inv: self. > 0 9.2.202 25/ / 45 9.2.202 26/ / 45 9.2.202 27/ / 45
Primer: korišćenje operacija U pozivu operacije ne moraju biti navedeni izlazni parametri iz operacije Primer: operacija zarada ima ulazni parametar datum i izlazni bonus.zarada(datum).bonus = 200.zarada(datum).result = 000 ::zarada(datum: Date): Integer post: result = osnova * 000 9.2.202 28/ / 45 Opis asocijacije u OCL-u u se asocijacija opisuje navođenjem polaznog objekta i krajnjeg odredišta korišćenjem asocijacije sa dijagrama klasa, navodi se odredišni element, tj. jedan ili više atributa ili objekata ovi elementi su opisani u ograničenju izraza 9.2.202 29/ / 45 Primer operacije sa asocijacijom Kompanija inv: self.menadžer.nezaposlen = false inv: self.zaposleni->notempty() u prvoj invarijanti rezultat je U drugoj invarijanti rezultat je skup nezaposlen: Boolean menadžer zaposleni Kompanija 9.2.202 30/ / 45 Opis realizacije upita Navodi se izraz iza službene reči body: Primer: pronađi sadašnju suprugu date osobe : ::NadjiAktivPartnera(): pre: self.ubraku = true body: self.brak->select(m m.kraj=false).partner 9.2.202 3/ / 45 Operacija select select je operacija nad kolekcijom oblik izraza: kolekcija->select(predikat) primer: pronađi radnike u kompaniji starije od 50 godina Kompanija inv: self.radnik->select(>50)->notempty() u ovom primeru pretražuje se klasa i ako je predikat tačan an taj se objekat stavlja u skup radnik 9.2.202 32/ / 45 Opšti oblik select kolekcija->select(v: tip predikat-sa-v) promenljiva v je u ovom slučaju iterator prethodni primer: Kompanija inv: self.radnik->select(p: p. > 50)->notEmpty() ovde se eksplicitno vidi da skup radnik čine objekti iz klase koji imaju više od 50 godina 9.2.202 33/ / 45 Operacija reject sintaksa je ista kao i za select, ali služi i za izdvajanje elemenata iz kolekcije kolekcija->reject(v: tip predikat-sa-v) izdvajaju se elementi za koje predikat nije tačan an primer: u skup radnika kompanije izdvojiti samo žene Kompanija inv: self.radnik->reject(p: p.pol=male)->isempty() Operacija collect ovom operacijom se izdvajaju objekti iz prethodno formiranog skupa (sa select ili reject), ali sa novim predikatom rezultat operacije se naziva bag u kojem se jedan element može e pojaviti više e puta collection->collect(v : tip predikat-sa-v) primer: sakupite sve datume rodjendana u kompaniji self.rodjendan->collect(lice : radnik lice.datumr) Tipovi kolekcija CollectionType: osnovni tip kolekcije, default ako nije definisan jedan od podtipova: SetType: matematički skup, bez ponavljanja elemenata OrderedSetType: uređeni skup,, tj. niz u kojem svaki element ima svoje mesto BagType: kolekcija u kojoj su dozvoljena ponavljanja elemenata SequenceType: uređena kolekcija u kojoj su dozvoljena ponavljanja elemenata 9.2.202 34/ / 45 9.2.202 35/ / 45 9.2.202 36/ / 45
Primer dodele tipa kolekcije sakupite sve datume rodjendana u kompaniji i dodelite redne brojeve upisa svakog u kolekciju self.rodjendan: SequenceType->collect(lice : radnik lice.datumr) Formiranje skupa bag može e sadržati ati isti element više e puta od njega se može e napraviti skup operacijom asset u skupu svaki se element pojavljuje samo jednom self.radnik->collect(datumr)->asset() skraćeni zapis collect: self.radnik.datumr Operacija forall koristi se kada ograničenje opisano predikatom treba da važi i za kompletnu klasu rezultat operacije je logička veličina: ina: tačno ako predikat važi i za sve elemente kolekcije collection->forall( v : tip predikat-sa-v ) Primer: svi zaposleni su mlađi od 65 godina Kompanija inv: self.radnik->forall(p : p. <= 65) 9.2.202 37/ / 45 9.2.202 38/ / 45 9.2.202 39/ / 45 Primer složenog forall svi zaposleni imaju raličita ita imena i prezimena I način: Kompanija inv: self.radnik->forall ( e, e2 : e <> e2 implies e.imeiprezime <> e2.imeiprezime) II način: Company inv: self.radnik->forall (e self.radnik->forall (e2 e <> e2 implies e.imeiprezime <> e2.imeiprezime)) 9.2.202 40/ / 45 Operacija exists koristi se da se utvrdi da li u kolekciji postoji bar jedan element koji ispunjava osobinu opisanu predikatom collection->exists (v : tip predikatsa-v ) primer: u kompaniji postoji osoba sa imenom Mile Company inv: self.radnik->exists(p: p.ime = Mile' ) 9.2.202 4/ / 45 Operacija iterate uopštena operacija kojom se mogu opisati sve prethodne sadrži i 2 promenljive, iterator i akumulator iterator uzima vrednosti iz kolekcije počev evši i sa datim izrazom u akumulatoru se nalaze sve vrednosti iteratora collection->iterate(el : tip; ac : tip = izraz424242 predikat-sa-el-i-ac) 9.2.202 42/ / 45 Kontekstne definicije u okviru paketa Konteksti koji važe e u granicama paketa navode se u obliku: package NazivPaketa::NazivDelaPaketa...... endpackage Komentari navode se u jednom redu, iza 2 uzastopne crtice (minusa) Sve što sledi u jednom redu iza ovih crtica smatra se komentarom primer: -- tekst u ovom redu je komentar 9.2.202 43/ / 45 9.2.202 44/ / 45 9.2.202 45/ / 45