Upload
megaplanet20
View
238
Download
1
Tags:
Embed Size (px)
Citation preview
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()