Zotero avancé - support de formation doctorants SHS 2024
UML OCL : Liaison avecUML -- 24
1. 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 associationsNavigation 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éthodePrécondition, Postcondition, Corps de méthode
2. 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 :
lele contextecontexte de la contrainte.de la contrainte.
Deux techniques pour spécifier le contexte :Deux techniques pour spécifier le contexte :
Client
1..4 0..*
titulaires
Compte
numéro
solde
dMax
*
1
signataire1
0..*
CarteBleue
code
retraitMax
context Compte
inv: dmax >=0
inv: solde > -dMax
context CarteBleue
inv: Compte.titulaires->includes(self.signataire)
inv: code>0 and code<=9999
inv: retraitMax>10
context Compte::solde : integer
init: floor(depotInitial * 10 / 100)
{ init: 0 }
{ inv: Compte.titulaires->includes(self.signataire)}
{ inv: dMax >= 0
inv: solde > -dMax }
3. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
3
Opérations spécifiquesOpé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 associativeDEPUIS 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 objetaccès à l'état d'un objet
constructions pour les post conditionsconstructions pour les post conditions
4. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
4
Accès à un attributAccè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éthodeAccès à une méthode sans effet de bordsans effet de bord (( {query}{query} ))
selfself.impôts(1998).impôts(1998)
7. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
7
Navigation VIA une associationNavigation VIA une association
Rappel: élement converti en singletonRappel: é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ôleAssociation 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
8. 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
Emploi
salaire
augmenter()
sociétés
s.Emploi
p.Emploi
s.Emploi->collect(salaire)->sum()
s.Emploi.salaire->forall(x | x>500 )
sp
9. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
9
Navigation VERS une association réflexiveNavigation VERS une association réflexive
association réflexive => indication du sens de parcoursassociation réflexive => indication du sens de parcours
(vers le role)(vers le role)
objet . associationobjet . association [[ rolerole ]]
Personne
age
chefs
employés
*
*
Evaluation
note
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
11. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
11
Navigation via une Association QualifiéeNavigation via une Association Qualifiée
Banque Comptenc
0..1
lienlien .. rolerole [[valeurvaleur,,valeurvaleur, … ], … ]
Accès qualifiéAccès qualifié
b.compte[ 4029 ]
b.compte[ 0 ]
compte
Gère
lienlien .. rolerole
codomainecodomaine
lienlien .. assoc . keyassoc . key
domainedomaine
b.compte b.Gére.nc
12. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
12
Opérations concernant les typesOpérations concernant les types
objetobjet .. oclIsTypeOf(oclIsTypeOf( typetype ))
type directtype 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és
c1
c2
c3
c4
t1
t2
ca1
ca2
p
13. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
13
Opérations concernant les typesOpérations concernant les types
Contraintes sur les typesContraintes sur les types
p.enfantsp.enfants->select(oclIsTypeOf(->select(oclIsTypeOf(FemmeFemme))))
p.enfants->p.enfants->select(oclIsKindOf(select(oclIsKindOf(FemmeFemme))))
Accès aux propriétés redéfiniesAccès aux propriétés redéfinies
f .f . oclAsType(oclAsType(PersonPerson)).nom.nom
Typage dynamiqueTypage dynamique
p.enfants-p.enfants->select(oclIsKindOf(>select(oclIsKindOf(FemmeFemme)).oclAsType(Set()).oclAsType(Set(FemmeFemme))))
->select(->select(nomDeJF <> nomnomDeJF <> nom))
Personne
nom enfants
*
Femme
nomDeJF
14. 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 classe
Personne.allInstances->Personne.allInstances->size()size() < 500< 500
Personne.allInstances->Personne.allInstances->forallforall(p1,p2 |(p1,p2 |
p1<>p2p1<>p2 impliesimplies p1.numsecu <> p2.numsecu)p1.numsecu <> p2.numsecu)
Personne.allInstances-Personne.allInstances->isUnique>isUnique(numsecu)(numsecu)
15. 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 classesinvariants 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érationsdéclarer des attributs ou des opérations def:def: nbEnfants:IntegernbEnfants:Integer
init:init: spécifier la valeur initiale des attributsspé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
16. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
16
InvariantsInvariants (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é parcet 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 PersonnePersonne
invinv pasTropVieux : age < 110pasTropVieux : age < 110
invinv : self.age >= 0: self.age >= 0
18. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
18
Définitions additionnellesDé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 attributsde nouveaux attributs
de nouvelles opérationsde nouvelles opérations
contextcontext ClasseClasse
defdef: nomatt : type = expr: nomatt : type = expr
defdef: 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èle
contextcontext PersonnePersonne
defdef: ancestres() :: ancestres() : SetSet(Personne)(Personne)
= parents->= parents-> unionunion(parents.ancestres()->(parents.ancestres()->asSetasSet())())
invinv:: notnot ancestres()->ancestres()->includesincludes((selfself))
19. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
19
Expression de propriétés dérivéesExpression de propriétés dérivées (derive)(derive)
Préciser en OCL la valeur d'un attribut ou d'une associationPréciser en OCL la valeur d'un attribut ou d'une association
dérivéedérivée
Complète la notationComplète la notation //
contextcontext Personne::estMarié : BooleanPersonne::estMarié : Boolean
derivederive : 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()()
20. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
20
Expression du corps d'une méthodeExpression du corps d'une méthode (body)(body)
Description en OCL d'une méthode sans effet de bordDescription 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 PersonnePersonne
defdef: ancestres :: ancestres : SetSet(Personne)(Personne)
= parents->= parents->unionunion(parents.ancestres->(parents.ancestres->asSetasSet())())
21. megaplanet.org/JeanMarieFavremegaplanet.org/JeanMarieFavre
21
Pré-conditions et post-conditionsPré-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écutionles 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 à lieudé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érationpermet de faire référence à la valeur avant l ’opération
resultresult designe le resultatdesigne 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, …) : TypeType::opération( param1 : Type1, …) : Type
prepre nom1 : param1 < …nom1 : param1 < …
prepre nom2 : …nom2 : …
postpost nom2 : …nom2 : … resultresult > …> …
23. 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éel
context Math::Sqrt(x : Real) : Realcontext Math::Sqrt(x : Real) : Real
pre: x>=0pre: x>=0
post: 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 entier
context Math::ISqrt( x : Integer ) : Integercontext Math::ISqrt( x : Integer ) : Integer
pre: x>=0pre: x>=0
post: result*result <= x and (result+1)*(result+1) > xpost: result*result <= x and (result+1)*(result+1) > x
24. 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éspour 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 ) )
25. 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 initialfait référence à la valeur d'une propriété dans l'état initial
resultresult fait référence au résultatfait référence au résultat
oclIsNewoclIsNew indique que l'objet n'existait pas dans l'état initialindique 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ération
pre: montant>0pre: montant>0
pre: montant<self.soldepre: montant<self.solde
pre: self.titulaire = dest.titulairepre: self.titulaire = dest.titulaire
pre: self.banque = dest.banquepre: self.banque = dest.banque
post: self.solde < self.solde@pre - montantpost: self.solde < self.solde@pre - montant
post: dest.solde = dest.solde@pre + montantpost: dest.solde = dest.solde@pre + montant
post: 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
26. 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 étatsindique qu'un message à été envoyé entre les deux états
^^^^ dénote l'ensemble des messages envoyés entre les deux étatsdé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 TreeView
treeListeners
*
update()hasChanged()