0% found this document useful (0 votes)
482 views23 pages

Limbajul OCL: Object Constraint Language

The document discusses the Object Constraint Language (OCL), including its types, collections, navigation in UML models, examples of expressions, and context specification. It provides examples of using OCL to specify constraints and pre/post-conditions for operations. Key types include Integer, Real, Boolean, String, Enumeration, and OclAny. Collections include Set, Bag, and Sequence, with associated operations. Context and invariants can constrain classes and associations.

Uploaded by

elektro15
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
482 views23 pages

Limbajul OCL: Object Constraint Language

The document discusses the Object Constraint Language (OCL), including its types, collections, navigation in UML models, examples of expressions, and context specification. It provides examples of using OCL to specify constraints and pre/post-conditions for operations. Key types include Integer, Real, Boolean, String, Enumeration, and OclAny. Collections include Set, Bag, and Sequence, with associated operations. Context and invariants can constrain classes and associations.

Uploaded by

elektro15
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 23

Limbajul OCL

Object Constraint Language

Ingineria Sistemelor de Programe Anca Ionita

Tipuri OCL
Tipuri de baza Real Integer Boolean String

Tipuri colectii Collection Set Bag Sequence obiect->functie(parametri)


specificarea restrictiilor legate de digrame UML
Ingineria Sistemelor de Programe Anca Ionita

OCL Enumeration OclAny

Tipuri de baza

Real

=, <>, +, - (binar si unar), *, /, <, >, <=, >= abs(), floor(), round(), max(r:Real), min(r:Real) =, - (binar si unar), +, -, *, / abs(), div(i:Integer), mod(i:Integer), max(i:Integer), min(i:Integer) = size(), concat(s:String), toUpper(),toLower(), substring(Inferior:Interegr, Superior:Integer).

Integer

String

Boolean =, or, xor, and, not, implies.


Ingineria Sistemelor de Programe Anca Ionita

Alte tipuri OCL


OCL Enumeration

= , <>

OclAny = , <> oclIsKindOf(tip:OclType):Boolean, oclIsTypeOf(type:OclType):Boolean, oclAsType(tip:OclType):tip , oclInState(Stare:OclState):Boolean, oclIsNew():Boolean


Ingineria Sistemelor de Programe Anca Ionita

Tipuri colectii

Au la baza Collection Collection()T size():Integer, includes(Obiect:OclAny):Boolean excludes(Obiect:OclAny):Boolean count(Obiect:OclAny):Integer

Ingineria Sistemelor de Programe Anca Ionita

Set(T)

select(expresie:OclExpression):Set(T) reject(expresie:OclExpression):Set(T) collect(expresie:OclExpression):Bag(ex pr.evaluationType()) union(M2:Set(T)):Set(T) count(Obiect:T):Integer union(C:Bag(T)):Bag(T) asSequence():Sequence(T) =(M2:Set(T)):Boolean asBag():Bag(T) -(M2:Set(T)):Set(T) intersection(M2:Set(T)):Set(T) intersection(C:Bag(T)):Set(T) including(Obiect:T):Set(T) excluding(Obiect:T):Set(T) symmetricDifference(M2:Set(T)):Set(T)

Ingineria Sistemelor de Programe Anca Ionita

Bag(T)

union(C:Bag(T)):Bag(T) union(M2:Set(T)):Bag(T) =(C:Bag(T)):Boolean intersection(C:Bag(T)):Bag(T) intersection(M2:Set(T)):Set(T) including(Obiect:T):Bag(T) excluding(Obiect:T):Bag(T) select(e:OclExpression):Bag(T)

reject(e:OclExpression): Bag(T) collect(e:OclExpression): Bag(e.evaluationType()) count(Obiect:T):Integer asSequence():Sequence(T) asSet():Set(T)

Ingineria Sistemelor de Programe Anca Ionita

Sequence(T)

count(Obiect:T):Integer =(S2:Sequence(T)):Boolean union(S2:Sequence(T)): Sequence(T) append(Obiect:T): Sequence(T) prepend(Obiect:T):Sequence( T) subSequence(inferior:Integer, superior:Integer):Sequence(T) at(i:Integer):T first():T last():T

including(Obiect:T): Sequence(T) excluding(Obiect:T): Sequence(T) select(e:OclExpression): Sequence(T) reject(e:OclExpression): Sequence(T) collect(expresie:OclExpression): Sequence(expr.evaluationType()) iterate(expresie:OclExpression): expr.evaluationType() asBag():Bag(T) asSet():Set(T)

Ingineria Sistemelor de Programe Anca Ionita

Exemple de utilizare colectii


Interpretati !

Set{3,5,2,45,5} size() Sequence{1,2,45,9,3,9} count(9) Sequence{1,2,45,2,3,9} includes(45) Bag{1,9,9,1} count(9)


Ingineria Sistemelor de Programe Anca Ionita

Navigare in modelul UML


p:Persoana p.adresa p.copii p.parinti


obiect.NumeRol obiect.numeClasaAsociatie obiect.numeClasaAsociatie[numeRol]

Ingineria Sistemelor de Programe Anca Ionita

Exemple navigare
Interpretati !

p.copii exists(e1,e2|e1.varsta=e2.varsta) p.copii collect(varsta)=Bag{10,5,12} p.copii.prenume=Bag{Petre,Maria,Ion} p.copii select(varsta>8 and sex=Sex::Masculin) p.copii forall(varsta<11) p.copii isUnique(prenume) p.copii forall(varsta<p.varsta) p.copii one(varsta>=18)
Ingineria Sistemelor de Programe Anca Ionita

Navigare catre clasa de asociatie


Interpretati !

p:Persoana c:Companie p.Evaluare[sefi] p.Evaluare[subalterni] p.Evaluare[sefi].punctaj sum()/p.sefi size() p.Functie c.Functie c.Functiecollect(salariu) sum()

Ingineria Sistemelor de Programe Anca Ionita

Conditionalitate in expresii OCL


Interpretati !

if-then else endif if varsta<40 then salariu>1000 else salariu > 2000 endif

salariu>(if varsta<40 then 1000 else 2000 endif)


Ingineria Sistemelor de Programe Anca Ionita

Specificarea contextului pentru expresii OCL Specificarea invariantilor


context NumeClasificator stereotip: Expresie OCL


clasei context NumeClasa inv: expresieOCL context obiect:NumeClasa inv: expresieOCL

Stereotipuri

<<precondition>> <<postcondition>> <<invariant>>

Pre- si post-conditii:

context NumeTip::NumeOperatie(parametru1:Tip1,...)TipReturnat pre: restrictie1 post: restrictie2


Ingineria Sistemelor de Programe Anca Ionita

Exemplu invarianti clasa Persoana


Interpretati !

context Persoana inv: copiiforall(c|c.varsta<self.varsta-7) inv: self.copii isUnique(prenume) def veri: Set(Persoana)=parinti.parinti.copii.copii excluding(parinti.copii) asSet()
Ingineria Sistemelor de Programe Anca Ionita

Restrictii in diagrama de clase UML


Universitate 1 1 1 Senat
{subset} {Rector= PresedinteSenat} {subset}

1 1 Consiliu Profesoral
{subset}

* 1

Facultate 1 1

* Catedra

{subset} {subset}

{Decan= PresedinteConsiliu}

{subset} {subset} {subset}

Presedinte Membru 1 Consiliu * Consiliu 1 Decan 3 Prodecan 1 Rector 3 Prorector * membru 1 Presedinte

Profesor

* MembruCatedra 1 SefCatedra

Ingineria Sistemelor de Programe Anca Ionita

Alternativa de exprimare a restrictiilor in Interpretati ! OCL 1/3


context Catedra inv: self.membruCatedra->includes(self.sefCatedra) context Facultate inv: self.consiliuProfesoral.membruConsiliu ->includes(self.catedra.sefCatedra) inv: self.consiliuProfesoral.membruConsiliu ->includes(self.prodecan) inv: self.consiliuProfesoral.presedinteConsiliu =self.decan inv: self.profesor=self.catedra.membruCatedra
Ingineria Sistemelor de Programe Anca Ionita

Alternativa de exprimare a restrictiilor in OCL 2/3


Interpretati !

context ConsiliuProfesoral inv: self.membruConsiliu ->includes(self.presedinteConsiliu) context Senat inv: self.membruSenat ->includes(self.pre]edinteSenat)
Ingineria Sistemelor de Programe Anca Ionita

Alternativa de exprimare a restrictiilor in OCL 3/3


context Universitate Interpretati ! inv: self.senat.membruSenat ->includes(self.prorector) inv: self.senat.membruSenat ->includes(self.facultate.decan) inv: self.senat.membruSenat ->includes(self.facultate.catedra.sefCatedra) inv: self.senat.pre]edinteSenat=self.rector
Ingineria Sistemelor de Programe Anca Ionita

Exemple preconditii / postconditii operatii


Interpretati !

context Persoana::salariu():integer post: return > 500 context Companie::angajare(p:Persoana) pre: neangajat: not(angajatiincludes(p)) post: angajat: angajati includes(p)
Ingineria Sistemelor de Programe Anca Ionita

Descrierea formala a interfetei Photo Library


@Sommerville, 2006

context addItem pre: PhotoLibrary.libSize() > 0 PhotoLibrary.retrieve(pid) = null libSize () = libSize()@pre + 1 PhotoLibrary.retrieve(pid) = p PhotoLibrary.catEntry(pid) = photodesc

post:

context delete pre: PhotoLibrary.retrieve(pid) <> null ; post: PhotoLibrary.retrieve(pid) = null PhotoLibrary.catEntry(pid) = PhotoLibrary.catEntry(pid)@pre PhotoLibrary.libSize() = libSize()@pre - 1
Ingineria Sistemelor de Programe Anca Ionita

Expresii let

Sa se initializeze venitul unei familii cu suma veniturilor membrilor familiei.

context Familie inv: let venit: Integer = self.membri.venit->sum() in


Exercitiu: Sa se scrie preconditiile pentru operatia getSotie()


Ingineria Sistemelor de Programe Anca Ionita

Expresia Implies

Daca o persoana are o sotie , sotia e de sex feminin. context Persoana inv: self.sotie->notEmpty() implies self.sotie.sex=Sex::feminin

Exercitii:

Daca o persoana are un sot, acesta e de sex masculin. Daca un barbat e casatorit, atunci are o sotie. Daca o femeie e casatorita atunci are un sot. Daca o persoana are o sotie, aceasta are peste 18 ani Daca o persoana are un sot, acesta are peste 18 ani.

Ingineria Sistemelor de Programe Anca Ionita

You might also like