Chapitre4: Object Constraint Language
(OCL)
Cours Ing nierie Dirig e par les mod les
Cours Ing nierie Dirig e par les mod les
Niveau: II3 ILSI
Enseignante: Rim DRIRA
Bureau 215
AU: 2016/2017
Plan
1. Pourquoi OCL
2. Contexte dune contrainte
3. Syntaxe dOCL
2
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
OCL (Object Constraint Language)
UML permet dexprimer diff rents types de contraintes:
contraintes structurelles: les attributs, les diff rents types de relations
entre classes, cardinalit s, etc.
contraintes de type: le typage des attributs, etc.
contraintes pr d finies sur les associations: {subset}, {xor}, etc.
contraintes en langue naturelle (commentaires)
contraintes en langue naturelle (commentaires)
diverses autres contraintes comme les contraintes de visibilit , des
classes abstraites, etc.
TOUTEFOIS
Certaines contraintes ne peuvent pas tre formalis es avec UML.
Afin de combler cette lacune, lOMG a propos un langage dexpression
de contraintes appel OCL.
3
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Pourquoi OCL ? Illustration par l'exemple
Application bancaire qui manipulent les classes Compte,
Personne et Banque
1.
2.
3.
4.
5.
6.
7.
8.
Un client peut poss der plusieurs comptes
Un compte doit avoir un solde toujours positif.
Un client peut tre client de plusieurs banques
Un client d'une banque poss de au moins un compte dans cette
banque
banque
Les clients de la banque associ e un compte doivent contenir le
propri taire de ce compte
Une banque g re plusieurs comptes
Une banque poss de plusieurs clients
Les m thodes quon pourra appliquer sur Compte sont:
cr diter(int), d biter(int) et int getSolde()
Quelles sont les sp cifications non exprim es par le
diagramme de classe propos ??
4
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Pourquoi OCL ? Illustration par l'exemple
Le diagramme de classe ne permet pas dexprimer:
2. Un compte doit avoir un solde toujours positif
4. Un client d'une banque poss de au moins un compte dans cette
banque
5. Les clients de la banque associ e un compte doivent
5. Les clients de la banque associ e un compte doivent
contenir le propri taire de ce compte
5
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Pourquoi OCL ? Illustration par l'exemple
Diagramme d'objets coh rent avec le diagramme de classes et la
sp cification:
6
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Pourquoi OCL ? Illustration par l'exemple
Diagramme d'objets coh rent avec le diagramme de classes mais
qui ne respecte pas la sp cification attendue.
Une personne a un compte dans une banque o elle n'est pas cliente
Une personne est cliente d'une banque mais sans y avoir de compte
7
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Diagrammes UML insuffisants
Pour sp cifier compl tement une application
Diagrammes UML seuls sont g n ralement insuffisants
N cessit de rajouter des contraintes
Comment exprimer ces contraintes ?
Langue naturelle mais manque de pr cision, compr hension pouvant
tre ambig e
Langage formel avec s mantique pr cise : OCL
8
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
OCL, cest quoi?
Langage de description de contraintes d'UML, peut sappliquer sur
diff rents diagrammes UML
Standardis par l'OMG
Version 2.3.1: http://www.omg.org/spec/OCL/ISO/19507/PDF/
Version actuelle: 2.5 http://www.omg.org/spec/OCL/2.5
Objectif: Sp cifier des contraintes suppl mentaires importantes
qui n'ont pas pu tre sp cifi s avec les l ments de mod lisation
d'UML
S'applique aussi sur MOF
9
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Utilisation dOCL
OCL permet principalement d'exprimer deux types de contraintes sur l' tat
Publicité
d'un objet ou d'un ensemble d'objets:
Invariant de classe: une contrainte qui doit tre respect e en permanence
par toutes les instances d'une classe.
pr -condition et post-conditions l'ex cution d'une op ration:
Permet aussi dexprimer:
Permet aussi dexprimer:
contraintes sur la valeur retourn e par une m thode
r gles de d rivation des attributs
Gardes sur transitions de diagrammes d' tats ou de messages de diagrammes
de s quence/communication
Etc.
10
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Contexte dune contrainte OCL
Une contrainte OCL est toujours associ e un l ment dun
mod le, il est appel le contexte de la contrainte.
Exemple :
context Compte : l'expression OCL s'applique la classe Compte, c'est- -dire
toutes les instances de cette classe
toutes les instances de cette classe
. permet d'acc der une caract ristique d'un objet (m thode,
attribut, terminaison d'association)
Exemple : banque.clients donne lensemble dobjets de type client
associ une banque
11
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Retour lExemple
Exprimer le fait que le solde dun compte
doit tre positif ne peut pas tre fait avec
UML mais peut tre formalis avec la
contrainte OCL suivante :
Context Compte
Inv: solde>0
Exprimer le fait que les clients de la banque
associ e un compte doivent contenir le
propri taire du compte avec OCL:
Context Compte
Inv: banque.clients -> includes (propri taire)
12
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Pr et post conditions
Pour sp cifier une op ration
Pr condition : tat qui doit tre respect avant l'appel de l'op ration
Postcondition : tat qui doit tre respect apr s l'appel de l'op ration
Mots-cl s : pre et post
Dans la postcondition, deux l ments particuliers sont utilisables
Dans la postcondition, deux l ments particuliers sont utilisables
Attribut result : r f rence la valeur retourn e par l'op ration
mon_attribut@ pre : r f rence la valeur de mon_attribut avant l'appel de
l'op ration
Syntaxe pour pr ciser l'op ration
context ma_classe::mon_op(liste_param) : type_retour
13
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Pr et post conditions
Exemple1
context Compte::d biter(somme : Integer)
pre: somme > 0
post: solde = solde@pre somme
La somme d biter doit tre positive pour que l'appel de l'op ration soit valide
Apr s l'ex cution de l'op ration, l'attribut solde doit avoir pour valeur la diff rence de sa valeur
Apr s l'ex cution de l'op ration, l'attribut solde doit avoir pour valeur la diff rence de sa valeur
avant l'appel et de la somme pass e en param tre
avant l'appel et de la somme pass e en param tre
Exemple2
context Compte::getSolde() : Integer
post: result = solde
Le r sulat retourn doit tre le solde courant
Attention! On ne d crit pas comment l'op ration est r alis e mais des contraintes sur l' tat
avant et apr s son ex cution
14
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Conception par contrat pour op rations
Pre et postconditions permettent de faire une conception par
contrat
Contrat pass entre l'appelant d'une op ration et l'appel (celui qui
ex cute l'op ration)
Si l'appelant respecte les contraintes de la pr condition alors l'appel
Si l'appelant respecte les contraintes de la pr condition alors l'appel
s'engage respecter la post-condition
Si l'appelant ne respecte pas la pr condition, alors le r sultat de
l'appel est ind fini
Pour exemple pr c dent: Si l'appelant de l'op ration d biter passe une somme
positive en param tre, alors le compte est bien d bit de cette somme
15
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Invariant
Un invariant exprime une contrainte sur un objet ou un groupe
d'objets qui doit tre respect e en permanence
Mot-cl : inv
Exemple: context Compte inv: solde > 0
Pour toutes les instances de la classe Compte, l'attribut solde doit
toujours tre positif
16
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Acc s aux objets, navigation
Dans une contrainte OCL associ e un objet, on peut
Acc der l' tat interne de cet objet (ses attributs)
Naviguer dans le diagramme : acc der de mani re transitive tous les objets
(et leur tat) avec qui il est en relation
Nommage des l ments
Pour les attributs ou param tres d'une op ration, on utilise le nom
Pour les attributs ou param tres d'une op ration, on utilise le nom
directement
Pour le(s) objet(s) en association, on utilise le nom du r le d'association du
Publicité
c t de cette classe (dans les exemples, sil ny a pas de noms de r les, je
vais utiliser le nom en minuscule de la classe (comme OCL 2.2))
Si cardinalit de 1 ou 0..1 pour une association : r f rence un objet
Si cardinalit > 1 : r f rence une collection d'objets
17
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Acc s aux objets, navigation
Exemples, dans le contexte de la classe Compte
solde : attribut r f renc directement
banque : objet de la classe Banque (r f rence via le nom de la classe) associ
au compte
propri taire : objet de la classe Personne (r f rence via le nom de r le
d'association) associ e au compte
d'association) associ e au compte
banque.clients : ensemble des clients de la banque associ e au compte
(r f rence par transitivit )
banque.clients.age : ensemble des ges de tous les clients de la banque
associ e au compte
Le propri taire d'un compte doit avoir plus de 18 ans
context Compte inv: propri taire.age >= 18
18
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Navigation vers une classe association
Dans contexte Entreprise
Self.Contrat
Dans contexte Personne
Self.Contrat
Comment naviguer vers lobjet Encadrement de son responsable ?
o
self.Encadrement
Comment naviguer vers lobjet Encadrement de son agentSecr tariat ?
o
self.Encadrement
19
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Op rations sur objets et collections
OCL propose un ensemble de primitives utilisables sur les collections
size() : retourne le nombre d' l ments de la collection
isEmpty() : retourne vrai si la collection est vide
notEmpty() : retourne vrai si la collection n'est pas vide
includes(obj) : vrai si la collection inclut l'objet obj
excludes(obj) : vrai si la collection n'inclut pas l'objet obj
including(obj) : la collection r f renc e doit tre cette collection en incluant l'objet
including(obj) : la collection r f renc e doit tre cette collection en incluant l'objet
obj
excluding(obj) : idem mais en excluant l'objet obj
includesAll(ens) : la collection contient tous les l ments de la collection ens
excludesAll(ens) : la collection ne contient aucun des l ments de la collection ens
Sum(): addition de tous les l ments de la collection
count(obj) : retourne le nombre d'occurences d'un objet dans la collection
Syntaxe d'utilisation : objetOuCollection -> primitive
self: pseudo-attribut r f ren ant l'objet courant
20
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Op rations sur objets et collections
Exemples, invariants dans le contexte de la classe Compte
propri taire -> notEmpty() : il y a au moins un objet Personne
associ un compte
propri taire -> size() = 1 : le nombre d'objets Personne associ s
un compte est de 1
un compte est de 1
banque.clients -> size() >= 1 : une banque a au moins un client
banque.clients -> includes(propri taire) : l'ensemble des clients de
la banque associ e au compte contient le propri taire du compte
banque.clients.compte -> includes(self) : le compte appartient
un des clients de sa banque
21
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Op rations sur objets et collections
Autre exemple
context Banque :: creerCompte(p : Personne) : Compte
post: result.oclIsNew() and compte = compte@pre ->
including(result) and p.compte = p.compte@pre -> including(result) and
result.proprietaire = p and result.banque = self
Un nouveau compte est cr . La banque doit g rer ce nouveau compte.
Un nouveau compte est cr . La banque doit g rer ce nouveau compte.
Le client pass en param tre doit poss der ce compte. Le nouveau compte
est retourn par l'op ration.
OclIsNew()
Primitive indiquant qu'un objet doit tre cr pendant l'appel de l'op ration
( utiliser dans une postcondition)
22
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Relations ensemblistes entre collections
union: retourne l'union de deux collections
intersection: retourne l'intersection de deux collections
Exemples
(col1 -> intersection(col2)) -> isEmpty() renvoie vrai si les collections
(col1 -> intersection(col2)) -> isEmpty() renvoie vrai si les collections
col1 et col2 n'ont pas d' l ment en commun
col1 = col2 -> union(col3) La collection col1 doit tre l'union des l ments
de col2 et de col3
23
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Op rations sur les l ments d'une collection
OCL permet de v rifier des contraintes sur chaque l ment d'une collection
ou de d finir une sous-collection partir d'une collection en fonction de
certaines contraintes
Primitives offrant ces services et s'appliquant sur une collection col
select : retourne le sous-ensemble de la collection col dont les l ments respectent
la contrainte sp cifi e
reject : idem mais ne garde que les l ments ne respectant pas la contrainte
reject : idem mais ne garde que les l ments ne respectant pas la contrainte
collect : retourne une collection (de taille identique) construite partir des
l ments de col. Le type des l ments contenus dans la nouvelle collection peut
Publicité
tre diff rent de celui des l ments de col.
exists : retourne vrai si au moins un l ment de col respecte la contrainte sp cifi e
et faux sinon
forAll : retourne vrai si tous les l ments de col respectent la contrainte sp cifi e
(pouvant impliquer la fois plusieurs l ments de la collection)
24
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Op rations sur les l ments d'une collection
Syntaxe de ces op rations : 3 usages
collection -> primitive( expression )
La primitive s'applique aux l ments de la collection et pour chacun d'entre
eux, l'expression expression est v rifi e. On acc de aux attributs/relations
d'un l ment directement.
collection -> primitive( elt : type | expression)
On fait explicitement appara tre le type des l ments de la collection (ici
type). On acc de aux attributs/relations de l' l ment courant en utilisant elt
(c'est la r f rence sur l' l ment courant)
collection -> primitive(elt | expression)
On nomme l'attribut courant (elt) mais sans pr ciser son type
25
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Op rations sur les l ments d'une collection
Exemples dans le contexte de la classe Banque:
compte -> select( c | c.solde > 1000) Retourne une collection
contenant tous les comptes bancaires dont le solde est sup rieur 1000
compte -> reject( solde > 1000) Retourne une collection contenant
tous les comptes bancaires dont le solde n'est pas sup rieur 1000
compte -> collect( c : Compte | c.solde) Retourne une collection
compte -> collect( c : Compte | c.solde) Retourne une collection
contenant l'ensemble des soldes de tous les comptes
(compte -> select( solde > 1000 )) -> collect( c | c.solde)
Retourne une collection contenant tous les soldes des comptes dont le solde
est sup rieur 1000
inv: not( clients -> exists (age < 18) )
Il n'existe pas de clients de la banque dont l'age est inf rieur 18 ans
not Prend la n gation d'une expression
26
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Op rations sur les l ments d'une collection
Autre Exemple:
context Personne inv: Personne.allInstances() ->
forAll(p1, p2 | p1 <> p2 implies p1.nom <> p2.nom)
Il n'existe pas deux instances de la classe Personne pour lesquelles
l'attribut nom a la m me valeur : deux personnes diff rentes ont un
l'attribut nom a la m me valeur : deux personnes diff rentes ont un
nom diff rent
AllInstances()
Primitive s'appliquant sur une classe (et non pas un objet) et
retournant toutes les instances de la classe r f renc e (ici la classe
Personne)
27
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Types OCL : types de base
Exemples
context Personne inv:
if age < 18 -- v rifie age de la personne
then compte -> isEmpty() -- pas majeur : pas de compte
else compte -> notEmpty() -- majeur : doit avoir au moins un compte
Endif
context Personne inv: compte -> notEmpty() implies banque -> notEmpty()
-- Si une personne poss de au moins un compte bancaire, alors elle est cliente d'au
moins une banque
28
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Enum ration
Utilisation d'une valeur d'une num ration
NomEnum::valeur
Exemples:
context Homme
context Homme
inv: sexe = Gender::male
context Femme
inv: sexe = Gender::female
29
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Propri t s pr d finies en OCL
Pour objets
oclIsTypeOf(type) : l'objet est du type type
oclIsKindOf(type) : l'objet est du type type ou un de ses sous-types
oclInState( tat) : l'objet est dans l' tat tat
oclInState( tat) : l'objet est dans l' tat tat
oclIsNew() : l'objet est cr pendant l'op ration
oclAsType(type) : l'objet est cast en type type
oclIsUndefined() : la propri t (association par exemple) n'a pas
t initialis e ( quivalent d'un null )
30
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
R gles de pr c dence
Ordre de pr c dence pour les op rateurs/primitives du plus au moins prioritaire
@pre
. et ->
not et -
* et /
+ et -
+ et -
if then else endif
>, <, <= et >=
= et <>
and, or et xor
implies
Parenth ses permettent de changer cet ordre
31
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Variables
Publicité
Pour faciliter l'utilisation de certains attributs ou calculs de valeurs on peut
d finir des variables
Dans une contrainte OCL : let ... in ...
context Personne
inv: let argent = compte.solde -> sum() in age >= 18 implies argent > 0
Une personne majeure doit avoir de l'argent
Pour l'utiliser partout : def
context Personne
def: argent : Integer = compte.solde -> sum()
context Personne
inv: age >= 18 implies argent > 0
32
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
OCL: Bilan
Permet dexprimer des contraintes suppl mentaires quil nest pas
possible dexprimer avec UML
Langage formel mais simple utiliser, non ambigu, grammaire pr cise
Langage d claratif : les contraintes ne sont pas op rationnelles.
Une expression OCL d crit une contrainte respecter et non pas un code
Une expression OCL d crit une contrainte respecter et non pas un code
ex cuter
Langage sans effet de bord : les instances ne sont pas modifi es par
les contraintes.
Peut tre utilis au niveau M3 (sur Ecore, MOF, UML), M2(sur UML et
sur les m ta-mod les MOF et Ecore), M1 (diagrammes UML classe,
tat, etc.)
33
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Exercices
Exercices
34
Exercice1
Ajoutez un attribut m re de type Personne
dans la classe Personne.
Ecrivez une contrainte pr cisant que la m re
d'une personne ne peut tre cette personne
elle-m me et que l' ge de la m re doit tre
elle-m me et que l' ge de la m re doit tre
sup rieur celui de la personne
Solution:
context Personne inv:
self.mere <> self and self.mere.age > self.age
35
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Exercice2
Indiquez quune personne mari e est forc ment majeur
Solution: context Personne inv: mari implies majeur
Trouvez une version plus compacte de lexpression suivante
context Personne inv :
if age >=18 then majeur=vrai
else majeur=faux endif
Solution: context Personne inv: majeur = age >= 18
36
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Exercice3
Les deux contraintes suivantes sont-elles quivalentes ?
Contexte C1 inv: c2->forAll(c:C2| c.c3->notEmpty() implies c.attr2=c.c3.attr3)
Contexte C2 inv: C2.allInstances()->forAll(c:C2| | c.c3->notEmpty() implies
c.attr2=c.c3.attr3)
Solution
NON : la premi re dit que pour des instances de C2 et C3 li es avec une instance de
C1, les attributs attr2 et attr3 sont gaux, mais n'impose rien des instances de C2
et C3 non li es une instance de C1 (et il y en a cause de la multiplicit ).
La deuxi me dit que pour tout couple d'instances de C2 et C3 li es, ces deux
attributs sont gaux.
37
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Exercice4
Exprimer en OCL les contraintes suivantes:
1.
2.
3.
4.
38
Dans une compagnie, un manager doit travailler et avoir plus de 40 ans. Le nombre
d'employ d'une compagnie est non nul
Une personne consid r e comme au ch mage ne doit pas avoir de salaires et une
personne qui travaille doit avoir au moins un revenu de 500 DT par mois.
Dans le contexte de la classe Job: l ge de lemploy doit tre sup rieur 21.
Tous les enfants d'une personne ont bien cette personne comme parent et
inversement
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017
Exercice4
1. context Company
inv: self.manager.isUnemployed = false and self.manager.age > 40 and
self.job -> notEmpty()
2. context Person
Inv: let money : Real = self.job.salary->sum() in
if isUnemployed then money =0 else money >= 500
Endif
Endif
Ou bien
context Person inv:
if isUnemployed=true then self.job ->isEmpty() else self.job.salary->sum()
>= 500
3. context Job inv: self.employee.age > 21
4. context Person inv: children -> notEmpty() implies children -> forAll ( p :
Person |p.parents -> includes(self))
context Person inv: parents -> forAll ( p : Person |p.children -> includes (self))
39
R.DRIRA ENSI-II3 ILSI Chapitre4: OCL
2016-2017