Vous êtes sur la page 1sur 9

Problématique

 Les diagrammes UML expriment certaines contraintes


OCL : Object Constraint de 2 manières
Language  graphiquement
 Structurelles : attributs, relations entre classes, la

Une introduction cardinalité, la navigabilité …


 De type

 Autres : visibilité, méthodes et classes abstraites … via des

propriétés prédéfinies
 {abstract}, {ordered}, {frozen}, {subset}, {xor}, {addOnly}

 Expression des contraintes insuffisante

S. Mouline ­ 2

Problématique Remarque

 Attention aux contraintes Compt


e
1.
.4 0.
.*
supposées être évidentes ou Cl
i
ent
t
i
tul
ai
res
numér
o
vérifiée "naturellement" sol
de
{subset} dMax
1 si
gnat
air
e
1
{xor} :Car
teBl
eue
si
gnat
air
e 0.
.* Car
teBl
eue *

paul
:Cl
i
ent c1:Compt
e
t
it
ulai
res

t
it
ulai
res
Lesignat
air
ed'
unecart
ebl
eue
pi
err
e:Cl
i
ent
t
i
c2:Compt
e estt
i
tulai
redececompt
e.
t
ulai
res

t
it
ulai
res
mar
ie:Cl
i
ent c3:Compt
e

si
gnat
air
e
:Car
teBl
eue
t
it
ulai
res

j
ean:Cl
i
ent c2:Compt
e
t
it
ulai
res

S. Mouline ­ 3 S. Mouline ­ 4
Expression des contraintes en langue
naturelle Exemple
 Simple à mettre en oeuvre
Compt
e
 utilisation des notes en UML + texte libre 1.
.4 0.
.* 1.
.* 1 Banque 1.
.*
Cl
i
ent numér
o numér
o
t
i
tul
air
es
 compréhensible par tous sol
de
1 si
gnat
air
e dMax 0.
.*
 Indispensable ! 1
Consor
ti
um
 documenter les contraintes est essentiel Car
teBl
eue
0.
.* * 1
 détecter les problèmes le plus tôt possible code
ret
rai
tMax 0.
.*
Di
st
ri
but
eur
 Problèmes * 1.
.*

 ambigu, imprécis
 difficile d ’exprimer clairement des contraintes
complexes
 difficile de lier le texte aux éléments du modèle

S. Mouline ­ 5 S. Mouline ­ 6

La solution de l’OMG : OCL


L'une des bases d'UML

 OCL = Object Constraint Language  Sémantique d'UML écrite en OCL


 OCL est en pleine expansion
 Relativement simple à écrire et à comprendre  Nouvelle version avec UML2.0
context Vol  Essentiel pour avoir des modèles suffisemment précis
inv: nbPlacesPotentiellementLibres =  Largement utilisé pour la description des méta-models
avion.nbPlaces - reservations-  De plus en plus d'outils
>select(estConfirmée).nbPassager->sum()  édition, vérification
 génération (partielle) de code
 Syntaxe purement textuelle sans symboles "étranges"  …
context Vol
inv: estDéfini implies reservations->forAll( estConfirmée implies
estPayée)

S. Mouline ­ 7 S. Mouline ­ 8
Caractéristiques d’OCL Caractéristiques d’OCL

 Langage fonctionnel d'expressions  Points faibles


 Valeurs, expressions, types  Pas aussi rigoureux que VDM, Z ou B => pas de preuves
 Fortement typé possibles
 Pas d'effets de bords
 Puissance d'expression limitée

 Langage de spécification et non pas de programmation  Points forts


 Haut niveau d'abstraction
 Relativement simple à écrire et à comprendre
 Pas forcément exécutable
 Très bien intégré à UML
 Permet de trouver des erreurs beaucoup plus tôt dans le cycle
 Bon compromis entre simplicité et puissance d'expression
de vie  Passage vers différentes plateformes technologiques

S. Mouline ­ 9 S. Mouline ­ 10

Contexte d'une contrainte Où utiliser OCL


 Contrainte toujours associée à un élément de modèle : le
contexte de la contrainte.  OCL peut être utilisé pour décrire des prédicats
 Deux techniques pour spécifier le contexte :
 inv: invariants de classes inv: solde < decouvertMax
 pre: pré-conditions d ’opérations pre: montantARetirer > 0
 post: post-conditions d ’opérations post: solde > solde@pre
1.
.4 0.
.*
Compt
e context Compte
Cl
i
ent numér
o
t
i
tul
air
es
sol
de inv: dmax >=0
1 si
gnat
air
e
dMax

1 inv: solde > -dMax  OCL peut également être utilisé pour décrire des expressions
Car
teBl
eue
0.
.* *  def: déclarer des attributs ou des opérations def: nbEnfants:Integer
context CarteBleue
c
ode
r
etr
ait
Max
{ inv:
inv: Compte.titulaires->includes(self.signataire)
 init: spécifier la valeur initiale des attributs init: enfants->size()
retraitMax < { inv: dMax >= 0
= 2000 } inv: solde > -dMax } inv: code>0 and code<=9999  body: exprimer le corps de méthodes {query} body: enfants-
inv: retraitMax>10 >select(age< a )
nv: Compte.titulaires->includes(self.signataire)
inv: code>0 and code<=9999 context Compte::solde : integer
 derive: définir des élements dérivés (/) derive: age<18
inv: retraitMax>10 init: floor(depotInitial * 10 / 100)

S. Mouline ­ 11 S. Mouline ­ 12
Opérations spécifiques au modèle objet
Accès à un attribut - Accès à une méthode
d ’UML
 accès à un attribut, à une opération objet . attribut
 navigation via les associations  Accès à un attribut
 VIA une association
self.dateDeNaissance
 VERS une classe associative
 DEPUIS une classe associative
 VIA une association qualifiée objet . méthode( expr1, expr2, … )
 accès au type et super types  Accès à une méthode sans effet de bord ( {query} )
 accès aux instances d’une classe (extension) self.impôts(1998)
 accès à l'état d'un objet
 constructions pour les post conditions

S. Mouline ­ 13 S. Mouline ­ 14

Navigation VIA une association


Exemple
empl
oyés soc
iét
és
Per
sonne 0.
.2
Soci
été
*

self.père Personne 0..1


objet . role type
self.voitures Set(Voiture) *
1 ou0.
.1
X X
* X (
SetX) self.enfants OrderedSet(Personne) * {ordered}
{
order
ed}*
X Or
der (
edSetX) self.épouses Sequence(Personne) * {ordered,nonunique}
{
nonuni
que}*
X Bag(
X)
{
order
ed,nonuni
que}*
X Sequence(
X)

S. Mouline ­ 15 S. Mouline ­ 16
Navigation VIA une association Navigation VERS une association

 Rappel: élement converti en singleton objet . association


self.père->AsSet() ->size() = 1  Permet d ’accéder à l ’ensemble des liens
père
empl
oyés s
oci
étés
Personne 0..1 p Per
sonne 0.
.2
Soci
été s
genre épouse *
 Permet de tester si la valeur est définie 0..1
self.père->AsSet() ->isEmpty()
Empl
oi
self.épouse->AsSet() ->notEmpty() implies self.épouse.genre = sal
ai
re
genre::féminin s.Emploi augmenter (
)
p.Emploi
 Association sans nom de rôle s.Emploi->collect(salaire)->sum()
=> nom de la classe destination (avec une minuscule) s.Emploi.salaire->forall(x | x>500 )

S. Mouline ­ 17 S. Mouline ­ 18

Navigation VERS une association réflexive


Navigation DEPUIS une association
 association réflexive => indication du sens de
parcours (vers le role) lien . role
 Accès aux objets à d'un lien
objet . association [ role ]  toujours un et un seul objet
Per
sonne chef
s empl
oyés soc
iét
és
age
*
Ev
aluat
i
on Per
sonne 0.
.2
Soci
été s
*
empl
oyés * not
e
Empl
oi
e.employés
paul.Evaluation ? chef
s mar
ie
e.sociétés
s
alai
re e
e1

chef
s not
e=5
pabl
o e3 paul
paul.Evaluation [chefs ] not
e=5 e1 s.Emploi->select(salaire<1000).employés
paul.Evaluation [employés] not
e=15
chef
s
sophi
e
paul.Evaluation [chefs].note -> sum()/paul.Evaluation [chefs]-
>size()
S. Mouline ­ 19 S. Mouline ­ 20
Navigation via une Association Qualifiée Opérations concernant les types

objet . oclIsTypeOf( type )


 type direct
Fi
gur
es
Banque compt
e
nc Compt
e
Gèr
e 0..
1 Pol
ygones
objet . oclIsKindOf( type ) Cer
cles
 type direct ou supertypes Tr
iangl
es Car
rés
c1
c2 t
1 ca1
objet . oclAsType( type )
lien . role [valeur,valeur, … ] lien . role lien . assoc . key  Conversion de type (casting) ca2
 Accès qualifié  codomaine  domaine c3 t
2

c4

b.compte[ 4029 ] b.compte b.Gére.nc p

b.compte[ 0 ]

S. Mouline ­ 21 S. Mouline ­ 22

Opérations concernant les types Opérations définies sur les classes

Personne
Classe.propdeclasse
 Contraintes sur les types *
p.enfants->select(oclIsTypeOf(Femme)) nom enfants
 Permet d ’accéder aux propriétés de classes
p.enfants->select(oclIsKindOf(Femme)) Personne
*
Cin enfants
Femme Classe.allInstances nom
 Accès aux propriétés redéfinies nomDeJF  Retourne l ’ensemble des instances de la classe
f . oclAsType(Person).nom
c ’est à dire l ’extension de cette classe
Personne.allInstances->size() < 500
 Typage dynamique
Personne.allInstances->forall(p1,p2 |
p.enfants-
>select(oclIsKindOf(Femme)).oclAsType(Set(Femme)) p1<>p2 implies p1.cin <> p2.cin)
->select(nomDeJF <> nom) Personne.allInstances->isUnique(cin)

S. Mouline ­ 23 S. Mouline ­ 24
Invariants (inv) Exemples d’invariants (inv)
ancêtre
 Prédicat associé à une classe ou une association Personne
*
 Doit être vérifié à tout instant context Personne cin enfants
age
 Le contexte est défini par un objet inv : age>0 and self.age<110 nom
 cet objet peut être référencé par self Personne
cin
*
enfants
inv mariageLégal : marié implies age > 18 filles *
 l ’objet peut être nommé explicitement age
 L ’invariant peut être nommé nom inv enfantsOk : enfants->size() > 0 Femme
nomDeJF
context Personne inv : not enfants-> includes(self)
inv mineur : age < 18 inv : enfants->includesAll(filles)
inv : self.age >= 0

S. Mouline ­ 25 S. Mouline ­ 26

Définitions additionnelles (def) Expression de propriétés dérivées (derive)


 Il est possible en OCL de définir dans une classe existante:  Préciser en OCL la valeur d'un attribut ou d'une association
 de nouveaux attributs dérivée
parent
de nouvelles opérations Complète la notation /
 
Personne Personne
* * 0..1
context Classe cin enfants  context Personne::estMarié : Boolean enfants cin conjoint
def: nomatt : type = expr age
derive : conjoint->notEmpty() age
nom Nom
def: nomop( … ) : type = expr
estMarié
 Utile pour décomposer des requêtes ou contraintes complexes Filles
 context Personne::filles : Set(Personne)
sexe
 Evite de "polluer" le modèle derive : enfants->select(sexe = ‘F’)
context Personne
def: ancestres() : Set(Personne)  context Personne::grandParents : Set(Personne)
= parents->union(parents.ancestres()->asSet()) derive: parents.parents->asSet()
inv: not ancestres()->includes(self)

S. Mouline ­ 27 S. Mouline ­ 28
Expression du corps d'une méthode (body) Pré-conditions et post-conditions (pre, post)
 Description en OCL d'une méthode sans effet de bord ({isQuery})  Prédicats associés à une opération
 Equivalent à une requête  les pré-conditions doivent être vérifiées avant l ’exécution
 les post-conditions sont vraies après l ’exécution
context Personne:acf( p : Personne ) : OrderedSet(Personne)
 self désigne l ’objet sur lequel l ’opération à lieu
body : self.ancestres()->intersection(p.ancestres())  Dans une post-condition :
->select(sexe = Sexe::’F’)->sortedBy(dateDeNaissance)  @pre permet de faire référence à la valeur avant l ’opération
 result designe le resultat
context Personne  ocsIsNew() indique si un objet n'existait pas dans l'état précédent
def: ancestres : Set(Personne) context Type::opération( param1 : Type1, …) : Type
pre nom1 : param1 < …
= parents->union(parents.ancestres->asSet())
pre nom2 : …
post nom2 : … result > …

S. Mouline ­ 29 S. Mouline ­ 30

Exemples
Exercices
context Personne::retirer( montant : Integer )  Spécifier une fonction qui retourne la racine carrée d'un réel
pre : montant > 0
context Math::Sqrt(x : Real) : Real
post : solde < solde@pre - montant
pre: x>=0
context Personne::salaire() : integer
post: result * result = x
post : result >= Legislation::salaireMinimum
context Compagnie::embaucheEmployé( p : Personne) :  Partie entière de la racine carrée d'un entier
Contrat
context Math::ISqrt( x : Integer ) : Integer
pre pasPrésent : not employés->includes(p)
post embauché : employés = employés@pre->including(p)
pre: x>=0
post : result.oclIsNew() post: result*result <= x and (result+1)*(result+1) > x
post : result.compagnie = self and result.employé = p

S. Mouline ­ 31 S. Mouline ­ 32
Contraintes sur l'état dans les post-conditions
Accès à l'état d'un objet
 @pre fait référence à la valeur d'une propriété dans l'état initial
 obj . oclInState( state )  result fait référence au résultat
 oclIsNew indique que l'objet n'existait pas dans l'état initial
 context Compte::virementInterne( dest : Compte, montant :
 Indique si l'objet est dans l'état spécifié integer )
 Si une machine à état a été associée à la classe de : Opération
pre: montant>0
l'objet
pre: montant<self.solde
 :: pour avoir accès aux états imbriqués pre: self.titulaire = dest.titulaire
pre: self.banque = dest.banque
post: self.solde < self.solde@pre - montant
 enfants->select( e | e.oclInState( Employé ) ) post: dest.solde = dest.solde@pre + montant
 livres->exists( l.oclInState( Rentré::ARanger ) ) post: self.operations = self.operations@pre->append(result)
post: result.oclIsNew and result.montant = montant

S. Mouline ­ 33 S. Mouline ­ 34

Contraintes sur l'échange de messages


 ^ indique qu'un message à été envoyé 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.

 context TreeModel::hasChanged()
post: getTreeListeners()@pre->forall( li | li ^ update() )
*
TreeModel TreeView
treeListeners
hasChanged() update()

S. Mouline ­ 35 S. Mouline ­ 36

Vous aimerez peut-être aussi