UML OCL : Liaison avecUML -- 24

26
megaplanet.org/JeanMarieFavre OCL : Liaison avec UML OCL : Liaison avec UML Contexte Contexte Accès aux attributs et opérations Accès aux attributs et opérations Navigation via les associations Navigation via les associations Invariant, Propriété dérivée, Valeur d'initialisation Invariant, Propriété dérivée, Valeur d'initialisation Précondition, Postcondition, Corps de méthode Précondition, Postcondition, Corps de méthode

Transcript of UML OCL : Liaison avecUML -- 24

megaplanet.org/JeanMarieFavre

OCL : Liaison avec UMLOCL : Liaison avec UML

ContexteContexte

Accès aux attributs et opérationsAccès aux attributs et opérations Navigation via les associations Navigation via les associations

Invariant, Propriété dérivée, Valeur d'initialisationInvariant, Propriété dérivée, Valeur d'initialisation Précondition, Postcondition, Corps de méthode Précondition, Postcondition, Corps de méthode

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

2

Contexte d'une contrainteContexte d'une contrainte

� Contrainte toujours associée à un élément de modèle : Contrainte toujours associée à un élément de modèle : le le contextecontexte de la contrainte. de la contrainte. � Deux techniques pour spécifier le contexte : Deux techniques pour spécifier le contexte :

Client1..4 0..*

titulaires

Compte

numérosoldedMax

*

1

signataire1

0..*CarteBleue

coderetraitMax

context Compteinv: dmax >=0inv: solde > -dMax

context CarteBleueinv: Compte.titulaires->includes(self.signataire)inv: code>0 and code<=9999inv: retraitMax>10

context Compte::solde : integerinit: floor(depotInitial * 10 / 100)

{ init: 0 }

{ inv: Compte.titulaires->includes(self.signataire)}

{ inv: dMax >= 0inv: solde > -dMax }

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

3

Opérations spécifiques Opérations spécifiques au modèle objet d ’UMLau modèle objet d ’UML

� accès à un attribut, à une opérationaccès à un attribut, à une opération� navigation via les associationsnavigation via les associations

� VIA une associationVIA une association� VERS une classe associativeVERS une classe associative� DEPUIS une classe associative DEPUIS une classe associative � VIA un association qualifiéeVIA un association qualifiée

� accès au type et super typesaccès au type et super types� accès aux instances d’une classe (extension)accès aux instances d’une classe (extension)� accès à l'état d'un objet accès à l'état d'un objet � constructions pour les post conditionsconstructions pour les post conditions

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

4

Accès à un attribut Accès à un attribut Accès à une méthodeAccès à une méthode

objet . attributobjet . attribut� Accès à un attributAccès à un attribut

selfself.dateDeNaissance.dateDeNaissance

objet . méthodeobjet . méthode( ( expr1expr1 , , expr2expr2 , … ), … )� Accès à une méthode Accès à une méthode sans effet de bordsans effet de bord ( ( {query} {query} ) )

selfself.impôts(1998).impôts(1998)

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

5

Navigation VIA une associationNavigation VIA une association

X

Set(X)

OrderedSet(X)

Bag(X)

Sequence(X)

Personne Socié téemployés

* 0..2

sociétés

objet . roleobjet . role

X1 ou 0..1

X*

X{ordered} *

X*

X{ordered, nonunique} *

{nonunique}

typetype

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

6

ExempleExemple

Personne

Set(Voiture)

OrderedSet(Personne)

Sequence(Personne)

self.père

self.voitures

self.enfants

self.épouses

0..1

*

* {ordered}

* {ordered,nonunique}

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

7

Navigation VIA une associationNavigation VIA une association

� Rappel: élement converti en singleton Rappel: élement converti en singleton

selfself.père->.père->sizesize()() = 1 = 1

� Permet de tester si la valeur est définiePermet de tester si la valeur est définie

selfself.père->.père-> isEmptyisEmpty()()

selfself.épouse->.épouse->notEmptynotEmpty() () impliesimplies selfself.épouse.sexe = .épouse.sexe = Sexe::fémininSexe::féminin

� Association sans nom de rôle Association sans nom de rôle => nom de la classe destination (avec une minuscule) => nom de la classe destination (avec une minuscule)

père

épouse

0..1

0..1Personne

sexe

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

8

Personne Socié té

Navigation VERS une associationNavigation VERS une association

objet . associationobjet . association� Permet d ’accéder à l ’ensemble des liensPermet d ’accéder à l ’ensemble des liens

employés

* 0..2

Emploisalaire

augmenter()

sociétés

s.Emploip.Emplois.Emploi->collect(salaire)->sum()s.Emploi.salaire->forall(x | x>500 )

sp

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

9

Navigation VERS une association réflexiveNavigation VERS une association réflexive

� association réflexive => indication du sens de parcours association réflexive => indication du sens de parcours (vers le role) (vers le role)

objet . associationobjet . association [ [ role role ]]

Personneage

chefs

employés*

*

Evaluationnote

paul.Evaluation [chefs ]paul.Evaluation [employés]paul.Evaluation [chefs].note -> sum()/paul.chefs->size()

paul.Evaluation ? marie

sophie

chefs

chefs

note=5

e1

note=15

e1

paulpablo chefs

note=5

e3

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

10

Personne Socié té

Emploisalaire

Navigation DEPUIS une association Navigation DEPUIS une association

lienlien . . rolerole� Accès aux objets à d'un lienAccès aux objets à d'un lien� toujours toujours un et un seulun et un seul objet objet

employés

* 0..2

sociétés

e.employése.sociétéss.Emploi->select(salaire<1000).employés

e

s

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

11

Navigation via une Association QualifiéeNavigation via une Association Qualifiée

Banque Comptenc0..1

lienlien . . role role [[valeurvaleur,,valeurvaleur, … ], … ]� Accès qualifiéAccès qualifié

b.compte[ 4029 ]b.compte[ 0 ]

compte

Gère

lienlien . . role role � codomainecodomaine

lienlien . . assoc . key assoc . key � domainedomaine

b.compte b.Gére.nc

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

12

Opérations concernant les typesOpérations concernant les types

objetobjet . . oclIsTypeOf( oclIsTypeOf( typetype ))� type direct type direct

objetobjet . oclIsKindOf( . oclIsKindOf( typetype ) )� type direct ou supertypestype direct ou supertypes

objetobjet . oclAsType( . oclAsType( typetype ))� Conversion de type (casting)Conversion de type (casting)

Figures

Cercles Polygones

Triangles Carrésc1

c2

c3

c4

t1

t2

ca1

ca2

p

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

13

Opérations concernant les typesOpérations concernant les types

� Contraintes sur les typesContraintes sur les typesp.enfantsp.enfants->select(oclIsTypeOf(->select(oclIsTypeOf(FemmeFemme))))

p.enfants->p.enfants->select(oclIsKindOf(select(oclIsKindOf(FemmeFemme))))

� Accès aux propriétés redéfinies Accès aux propriétés redéfinies f . f . oclAsType(oclAsType(PersonPerson)).nom.nom

� Typage dynamique Typage dynamique p.enfants-p.enfants->select(oclIsKindOf(>select(oclIsKindOf(FemmeFemme)).oclAsType(Set()).oclAsType(Set(FemmeFemme))))

->select(->select(nomDeJF <> nomnomDeJF <> nom))

Personne

nom enfants*

FemmenomDeJF

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

14

Opérations définies sur les classesOpérations définies sur les classes

Classe.propdeclasseClasse.propdeclasse� Permet d ’accéder aux propriétés de classesPermet d ’accéder aux propriétés de classes

Classe.Classe.allInstancesallInstances� Retourne l ’ensemble des instances de la classeRetourne l ’ensemble des instances de la classe

c ’est à dire l ’extension de cette classec ’est à dire l ’extension de cette classePersonne.allInstances->Personne.allInstances-> size() size() < 500< 500Personne.allInstances->Personne.allInstances-> forallforall(p1,p2 | (p1,p2 | p1<>p2 p1<>p2 impliesimplies p1.numsecu <> p2.numsecu) p1.numsecu <> p2.numsecu)Personne.allInstances-Personne.allInstances- >isUnique>isUnique(numsecu)(numsecu)

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

15

Où utiliser OCLOù utiliser OCL

� OCL peut être utilisé pour décrire des prédicatsOCL peut être utilisé pour décrire des prédicats

� inv: inv: invariants de classes invariants de classes inv: inv: solde < decouvertMaxsolde < decouvertMax� pre: pre: pré-conditions d ’opérationspré-conditions d ’opérations pre: pre: montantARetirer > 0montantARetirer > 0� post: post: post-conditions d ’opérationspost-conditions d ’opérations post: post: solde > solde@presolde > solde@pre

� OCL peut également être utilisé pour décrire des expressionsOCL peut également être utilisé pour décrire des expressions

� def: def: déclarer des attributs ou des opérations déclarer des attributs ou des opérations def: def: nbEnfants:Integer nbEnfants:Integer � init: init: spécifier la valeur initiale des attributs spécifier la valeur initiale des attributs init: init: enfants->size()enfants->size()� body: body: exprimer le corps de méthodes {query} exprimer le corps de méthodes {query} body: body: enfants->select(age< a )enfants->select(age< a )� derive: derive: définir des élements dérivés (/) définir des élements dérivés (/) derive: derive: age<18age<18

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

16

Invariants Invariants (inv)(inv)

� Prédicat associé à une classe ou une associationPrédicat associé à une classe ou une association

� Doit être vérifié à tout instantDoit être vérifié à tout instant

� Le contexte est défini par un objetLe contexte est défini par un objet� cet objet peut être référencé par cet objet peut être référencé par selfself� l ’objet peut être nommé explicitement (possibilité supprimée en UML2.0?)l ’objet peut être nommé explicitement (possibilité supprimée en UML2.0?)

� L ’invariant peut être nomméL ’invariant peut être nommé

contextcontext Personne Personne invinv pasTropVieux : age < 110 pasTropVieux : age < 110

invinv : self.age >= 0 : self.age >= 0

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

17

Exemples d’invariants Exemples d’invariants (inv)(inv)

contextcontext Personne Personneinvinv : age>0 : age>0 andand selfself.age<110.age<110invinv mariageLégal : marié mariageLégal : marié impliesimplies age > 16 age > 16invinv enfantsOk : enfants-> enfantsOk : enfants-> sizesize () < 20() < 20invinv : not enfants-> : not enfants-> includesincludes((selfself))invinv : enfants-> : enfants-> includesAllincludesAll(filles)(filles)invinv : enfants-> : enfants-> forallforall( e | ( e | selfself.age - e.age < 7 ).age - e.age < 7 )

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

18

Définitions additionnelles Définitions additionnelles (def)(def)

� Il est possible en OCL de définir dans une classe existante:Il est possible en OCL de définir dans une classe existante:� de nouveaux attributs de nouveaux attributs � de nouvelles opérationsde nouvelles opérations

contextcontext Classe Classedefdef: nomatt : type = expr: nomatt : type = exprdefdef: nomop( … ) : type = expr : nomop( … ) : type = expr

� Utile pour décomposer des requetes ou contraintes complexesUtile pour décomposer des requetes ou contraintes complexes� Eviter de "polluer" le modèleEviter de "polluer" le modèlecontextcontext Personne Personne

defdef: ancestres() : : ancestres() : SetSet(Personne) (Personne) = parents-> = parents-> unionunion(parents.ancestres()->(parents.ancestres()-> asSetasSet())())invinv: : notnot ancestres()-> ancestres()-> includesincludes((selfself))

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

19

Expression de propriétés dérivées Expression de propriétés dérivées (derive)(derive)

� Préciser en OCL la valeur d'un attribut ou d'une association Préciser en OCL la valeur d'un attribut ou d'une association dérivéedérivée

� Complète la notation Complète la notation //

� contextcontext Personne::estMarié : Boolean Personne::estMarié : Booleanderivederive : conjoint-> : conjoint->notEmpty()notEmpty()

� contextcontext Personne::filles : Personne::filles : SetSet(Personne)(Personne)derivederive : enfants-> : enfants->selectselect(sexe = Sexe::Feminin)(sexe = Sexe::Feminin)

� contextcontext Personne::grandParents : Personne::grandParents : SetSet(Personne)(Personne)derivederive: parents.parents->: parents.parents-> asSetasSet()()

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

20

Expression du corps d'une méthode Expression du corps d'une méthode (body)(body)

� Description en OCL d'une méthode sans effet de bord Description en OCL d'une méthode sans effet de bord (( {isQuery}{isQuery}))

� Equivalent à une requêteEquivalent à une requête

contextcontext Personne:acf( p : Personne ) : Personne:acf( p : Personne ) : OrderedSetOrderedSet(Personne)(Personne)bodybody : self.ancestres()-> : self.ancestres()-> intersectionintersection(p.ancestres())(p.ancestres()) ->select(sexe = Sexe::Feminin)- ->select(sexe = Sexe::Feminin)->>sortedBysortedBy(dateDeNaissance)(dateDeNaissance)

contextcontext Personne Personnedefdef: ancestres : : ancestres : SetSet(Personne) (Personne)

= parents->= parents->unionunion(parents.ancestres->(parents.ancestres-> asSetasSet())())

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

21

Pré-conditions et post-conditions Pré-conditions et post-conditions (pre, post)(pre, post)

� Prédicats associés à une opérationPrédicats associés à une opération� les pré-conditions doivent être vérifiées avant l ’exécution les pré-conditions doivent être vérifiées avant l ’exécution � les post-conditions sont vraies après l ’exécutionles post-conditions sont vraies après l ’exécution� selfself désigne l ’objet sur lequel l ’opération à lieu désigne l ’objet sur lequel l ’opération à lieu

� Dans une post-condition :Dans une post-condition :� @pre@pre permet de faire référence à la valeur avant l ’opération permet de faire référence à la valeur avant l ’opération� resultresult designe le resultat designe le resultat� ocsIsNewocsIsNew() () indique si un objet n'existait pas dans l'état précédentindique si un objet n'existait pas dans l'état précédent

contextcontext Type::opération( param1 : Type1, …) : Type Type::opération( param1 : Type1, …) : Typeprepre nom1 : param1 < … nom1 : param1 < …

prepre nom2 : … nom2 : …postpost nom2 : … nom2 : … resultresult > … > …

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

22

ExemplesExemples

contextcontext Personne::retirer( montant : Integer ) Personne::retirer( montant : Integer )

prepre : : montant > 0montant > 0postpost : solde < solde : solde < solde@pre @pre - montant - montant

contextcontext Personne::salaire() : integer Personne::salaire() : integer

postpost : result >= Legislation::salaireMinimum : result >= Legislation::salaireMinimum

contextcontext Compagnie::embaucheEmployé( p : Personne) : Contrat Compagnie::embaucheEmployé( p : Personne) : Contratprepre pasPrésent : pasPrésent : notnot employés-> employés-> includesincludes(p)(p)

postpost embauché : employés = employés embauché : employés = employés@pre@pre->->includingincluding(p)(p)postpost : : result.oclIsNewresult.oclIsNew()()postpost : : resultresult.compagnie = .compagnie = selfself andand resultresult.employé = p.employé = p

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

23

ExercicesExercices

� Spécifier une fonction qui retourne la racine carrée d'un réelSpécifier une fonction qui retourne la racine carrée d'un réelcontext Math::Sqrt(x : Real) : Realcontext Math::Sqrt(x : Real) : Realpre: x>=0pre: x>=0post: result * result = xpost: result * result = x

� Partie entière de la racine carrée d'un entierPartie entière de la racine carrée d'un entiercontext Math::ISqrt( x : Integer ) : Integercontext Math::ISqrt( x : Integer ) : Integerpre: x>=0pre: x>=0post: result*result <= x and (result+1)*(result+1) > xpost: result*result <= x and (result+1)*(result+1) > x

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

24

Accès à l'état d'un objetAccès à l'état d'un objet

� obj . oclInState( state )obj . oclInState( state )

� Indique si l'objet est dans l'état spécifiéIndique si l'objet est dans l'état spécifié� Si une machine à état a été associée à la classe de l'objetSi une machine à état a été associée à la classe de l'objet� :::: pour avoir accès aux états imbriqués pour avoir accès aux états imbriqués

� enfants->select( e | e.oclInState( Employé ) )enfants->select( e | e.oclInState( Employé ) )� livres->exists( l.oclInState( Rentré::ARanger ) )livres->exists( l.oclInState( Rentré::ARanger ) )

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

25

Contraintes sur l'état dans les post-conditionsContraintes sur l'état dans les post-conditions

� @pre@pre fait référence à la valeur d'une propriété dans l'état initial fait référence à la valeur d'une propriété dans l'état initial� resultresult fait référence au résultat fait référence au résultat� oclIsNewoclIsNew indique que l'objet n'existait pas dans l'état initial indique que l'objet n'existait pas dans l'état initial

� context Compte::virementInterne( dest : Compte, montant : integer )context Compte::virementInterne( dest : Compte, montant : integer ) : Opération : Opérationpre: montant>0pre: montant>0pre: montant<self.soldepre: montant<self.soldepre: self.titulaire = dest.titulairepre: self.titulaire = dest.titulairepre: self.banque = dest.banquepre: self.banque = dest.banquepost: self.solde < self.solde@pre - montantpost: self.solde < self.solde@pre - montantpost: dest.solde = dest.solde@pre + montantpost: dest.solde = dest.solde@pre + montantpost: self.operations = self.operations@pre->append(result)post: self.operations = self.operations@pre->append(result)post: result.oclIsNew and result.montant = montantpost: result.oclIsNew and result.montant = montant

megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre

26

Contraintes sur l'échange de messagesContraintes sur l'échange de messages

� ^̂ indique qu'un message à été envoyé entre les deux états indique qu'un message à été envoyé entre les deux états� ^^^^ dénote l'ensemble des messages envoyés entre les deux états dénote l'ensemble des messages envoyés entre les deux états

� Utile pour l'expression de protocoles, de patrons de conception, etc.Utile pour l'expression de protocoles, de patrons de conception, etc.

� context TreeModel::hasChanged()context TreeModel::hasChanged()post: getTreeListeners()@pre->forall( li | li ^ update() )post: getTreeListeners()@pre->forall( li | li ^ update() )

TreeModel TreeViewtreeListeners

*

update()hasChanged()