430 likes | 586 Views
Object Constraint Language. Objectivs. OCL Introducere. OCL = Object Constraint Language OCL este un limbaj expresiv de asertiuni non-executabile A fost definit pentru prima oara în 1997 de catre IBM A fost adoptat de catre UML în 2003 Descrie toate aspectele semantice ale UML
E N D
OCL Introducere • OCL = Object Constraint Language • OCL este un limbaj expresiv de asertiuni non-executabile • A fost definit pentru prima oara în 1997 de catre IBM • A fost adoptat de catre UML în 2003 • Descrie toate aspectele semantice ale UML • Are o sintaxa apropiata de Eiffel (aceleasi notiuni – pre,post, invariant ) • OCL este compatibil cu modelele OMG : ODMG,CORBA
Locul constrângerilor în UML • UML este un limbaj grafic,deci asertiunile sunt asociate figurilor cu ajutorul clauzelor de tip context • Fiecare clasificator (tip,clasa,interfata, asociere) al modelului UML reprezinta un tip OCL • Exista un ansamblu de tipuri predefinite care permit normalizarea descrierii
1. Context • Notatia self.nrMuncitori > 50 este una ambigua • Pentru a înlatura aceasta ambiguitate folosim un context pentru care constrângerea de mai sus este clar definita • Mai multe constrângeri pot fi grupate în acelasi context
Exemplu context Company inv: self.nrAngajati >50
Alte forme de exprimare a contextului (V1) context Companie inv : nrAngajati>50 (V2) context c: Companie inv: c.nrAngajati>50 (V3) context c: Companie inv destuiAngajati: c.nrAngajati >50
2. Tipuri de constrângeri • Invarianti Exprima anumite conditii pe care trebuie sa le îndeplineasca atributele claselor. • Pre-conditii Exprima anumite constrângeri care trebuie sa fie îndeplinite pentru executarea operatiilor cerute de corpul unei functii • Post-conditii Exprima anumite conditii care trebuie îndeplinte la iesirea din corpul unei functii
Exemplu context numeTip : numeOperatie (p1:Tip1,…) : tipReturnat pre: param1> post: result=… context Persoana::venit(d:Date) : Integer post: result= 800
3. Tipuri • Tipuri • Atribuiri (expresia LET)
3.1 Tipuri de baza foarte clasic,minimum vital
3.2 Tipul enumerare • Declarare enum{ valoare1, valoare2,…} • Utilizare într-o expresie valoare1 -- daca nu exista nici o ambiguitate #valoare1 -- daca exista ambiguitati
Exemplu context Persoana inv sex : enum{ masculin, feminin }
3.3 Tipuri speciale • Collection : un ansamblu de elemente • Bag : este o colectie de elemente cu posibilitatea de a avea un acelasi element de mai multe ori • Set : este o colectie de elemente,dar fiecare element apare o singura data.Este echivalentul matematic al notiunii de multime • Sequence : este o multime ordonata de elemente
3.4 Conformitatea tipurilor Colectie Bag Set Sequence
Exemplu Transport Biciceta Masina Tramvai
… • Set(Bicicleta) conform cu Set(Transport) • Set(Bicicleta) conform cu Collection(Bicicleta) • Set(Bicicleta) conform cu Collection(Transport) • Set(Bicicleta) nu este conform cu Bag(Bicicleta) Deci conformitatea tipurilor este la fel ca si în Java 5
Cast Fie T2 un sub-tip al lui T1, si obj1 o variabila de tip T2,obj2 o variabila de tip T1. obj1.oclAsType(T2) -- este legal obj1.oclAsType(T1) -- este legal obj2.oclAsType(T2) -- este ilegal
Valori nedefinite Toti operanzii sau argumentele pot avea valori « non-defnite ».Rezultatul unei astfel de expresii este de asemeni « nedefinit ». Exceptii • Or returneaza true daca unul din argumente este true. • And returneaza false daca unul din argumente este fals.
3.5 Metaconcepte • Tipul OclType t.allInstances -- t o instanta a OclType -- returneaza un ansamblu al tututor obiectelor de tipul Type -- nume definit pentru tipurile Integer,Real,String Exemplu : context Person inv : Person.allInstances->forAll(p1,p2 | p1<>p2 implies p1.name<>p2.name )
4. Accesul la obiecte si proprietati Fiecare espresie OCL se poate referi la • Clasificatori : tipuri,clase, interfete,asocieri • Proprietati : atribute, extremitati ale unei asocieri,metode,operatii,metode Accesul la o proprietate se face cu ajutorul notatiei cu punct.
Notatia cu punct context ATp inv : self.proprietate Exemplu de acces la un atribut context Persoana inv : self.vârsta>18 context Companie inv : self. pretStoc( ) > 0
Accesul la roluri obiect.numeRol obiect.numeRol->proprietate
Navigarea cu ajutorul rolurilor • Cardinalitati simple : 0 sau 1 => returneaza un obiect • Cardinalitati multiple,fara ordine => returneaza un Set • Cardinalitati multiple,cu ordine => returneaza un Sequence
Exemplul 1 context Company inv: self.manager.isUnemployed=false inv: self.employee->notEmpty
Exemplul 2 context Persoana -- nu mai mult de 3 manageri pentru aceeasi persoana inv : self.angajator->size < 3
Asocieri de cardinalitate 0..1 Atunci când o asociere conduce la un obiect,acesta poate fi considerat ca un ansamblu de tip singleton. context Company inv : self.manager-> size=1
Combinarea proprietatilor context Company inv : self.employee->size >=50 -- companiile au minim 50 de angajati context Person inv : self.wife->notEmpty implies self.wife.age>18 or self.husband->notEmpty implies self.husband.age>18 -- persoanele casatorite au vârsta mai mare de 18 ani
Asocieri si cardinalitate * Persoana Rang sef Self.Rang [ sef ]->sum > 0
OCL Type • Toate tipurile OCL sunt de tipul OclType • Carcateristici - t.name : String -- numele tipului t - t.attributes : Set (String) -- numele tuturor atributelor - t.operations : Set (String) -- numele tuturor operatiilor pentru tipul t - t.superTypes : Set( OclType) -- numele tuturor tipurilor pe care le mosteneste tipul T
Primitive OCL • Primitive de tip Collection • Primitive de tip Set • Primitive de tip Sequence • Primitive de tip Integer • Primitive de tip Real • Primitive de tip String • Primitive de tip Boolean • Primitive de tip Enumeration
1 Primitive de tip Collection • a->union(s:Set(T) ) : Bag(T) • a->intersection(b:Bag(T)) : Bag(T) • a->intersection(b:Set(T)) : Set(T) • a->including (el : T) :Bag(T) • a->excluding (el : T) :Bag(T) • a->asSet : Set(T) • a->asSequnce : Sequence(T)
Alte primitive de tip Collection • c->size :Integer -- numarul de elemente dintr-o colectie • c->isEmpty : Boolean -- spune daca o multime este sau nu vida • c->notEmpty : Boolean • c->count(x : OclAny) : Integer -- numara aparitiile lui x în colectie • c->includes(x : OclAny) : Boolean -- true daca x apartine colectiei c • c->excludes(x:OclAny) :Boolean • c->select(e|boolean-expr-with-e): Collection(c.oclType.generic(1)) • c->select(e|boolean-expr-with-e): Collection(c.oclType.generic(1)) • c->sum : T -- suma tuturor elementelor din colectia C
2 Primitive de tip Set Multimea în sens informatic este un ansamblu finit de elemente,fara duplicare. • a->union(s:Set(T) ) : Set(T) • a->union(s:Bag(T) ) : Bag(T) • a->intersection(b:Set(T)) : Set(T) • a->including (el : T) :Set(T) • a->excluding (el : T) :Set(T) • a->count(el : T) :Integer
3 Primitive de tip Sequence • s->count(el:T) : Integer • s=(s2 : Sequence (T) ) : Boolean • s->union(s:Sequence(T) ) : Sequnce(T) • s->intersection(b:Sequnce(T)) : Sequnce(T) • s->including (el : T) :Sequence(T) • s->excluding (el : T) :Sequnce(T) • s->asBag ( ) :Bag(T) • s->asSet( ) :Set(T) • s->at(i : Integer) : T • s->first : T • s->last : T • s->append(el : T) : Sequence (T) -- adauga la sfârsitul secventei • s->prepend( el : T) : Sequnce (T) -- adauga la începutul secventei • s->subSequnce( a,b : Integer) : Sequnce(T) – returneaza subsecventa de elemente dintre elementul de indice a si de indice b,inclusiv capetele
4 Primitive de tip Real • r1=(r2:Real) : Boolean • r1<>(r2:Rreal): Boolean • r1 – (r2:Real) : Real • r1 * (r2:Real) : Real • r1 / (r2:Real) : Real • r1.abs : Integer-- modullul lui r1 • r1.floor : Integer -- partea întreaga a lui r1 • r1.round : Integer • r1.max(r2 : Real) : Integer • r1.min(r2 : Real) : Integer • r1< (r2 : Real) : Boolean • r1<= (r2 : Real) : Boolean • r1> (r2 : Real) : Boolean • r1>= (r2 : Real) : Boolean
5 Primitive de tip Întreg • z1=(z2: Integer) : Boolean • z1<>(z2: Integer): Boolean • z1 – (z2: Integer) : Integer • z1 * (z2: Integer) : Integer • z1 / (z2: Real) : Integer • z1.abs : Integer-- modullul lui z1 • z1.max(z2 : Integer) : Integer • z1.min(z2 : Integer) : Integer • z1< (z2 : Integer) : Boolean • z1<= (z2 : Integer) : Boolean • z1> (z2 : Integer) : Boolean • z1>= (z2 : Integer) : Boolean
6 Primitive de tip String • s1=(s2 : String ) : Boolean • s1.size : Integer • s1.substring(lower,upper :Integer) : String • s1.concat(s2 : String ) : String • s1.toUpper : String • s1.toLower : String
7 Primitive de tip Boolean • b1=(b2 : Boolean ) : Boolean • b1 or (b2 : Boolean ) :Boolean • b1 xor (b2 : Boolean ) :Boolean • b1 and (b2 : Boolean ) :Boolean • b1 implies (b2 : Boolean ) :Boolean • not b1 : Boolean
8 Primitive de tip Enumeration • e1=(e2 : Enumeration ) :Boolean • e1 <> (e2 : Enumeration) : Boolean