Vous êtes sur la page 1sur 19

OCL Object Constraint Language

contraintes utilisé par UML.


OCL permet de décrire des invariants dans un modèle, sous

Exemple 1:
Aucun employé ne peut avoir un âge inférieur à 18 ans

Exemple 2: toute personne a un nom Employé


Nom
Prenom
Age
...

35
OCL Object Constraint Language
Il existe deux façons pour modéliser une contrainte
OCL :
Mettre la contrainte entre accolades ({}) dans une note.
L'élément pointé par la note est alors le contexte de la
contrainte ;

Utiliser le mot-clef context dans un document accompagnant


le diagramme.
context Personne
inv : ( age age
--

36
OCL Object Constraint Language
Préconditions et postconditions (pre, post)
Une pré-condition permet de spécifier une contrainte
prédicative qui doit être vérifiée avant l'appel d'une
opération
vraie au moment de l'appel de l'opération
pas obligatoire à mettre.
Une post-condition est une condition booléenne
devant être vraie au moment où l'appel de l'opération
retourne.
Exemple1:
context Personne::setAge(a :entier)
pre : (a <= 140) and (a >=0) and (a >= age)
post : age = a
-- on peut également écrire a=age

37
OCL Object Constraint Language
Exemple 2
context Compte :: débiter ( somme : int )
pre : somme > 0
post : solde = solde @ pre somme
Dans l'expression de la contrainte de
la post-condition, deux éléments
particuliers sont utilisables :
<nom_attribut> @ pre qui désigne

<nom_attribut> après l'appel de


l'opération

38
OCL Object Constraint Language
result désigne la valeur retournée par l'opération ;
Exemple 1:
context Personne::getAge()
post : result=age
Exemple 2
context Compte::getSolde() : Integer
post: result = solde
Le résultat retourné doit être le solde courant
On ne décrit pas comment l'opération est réalisée mais des
contraintes sur l'état avant et/ou après son exécution

39
OCL Object Constraint Language
Les conditionnelles
On utilise soit l'opérateur booléen , soit le then .

au compte.
- pas de rémunération en dessous d'un certain seuil :
context Compte
inv : solde < 100 implies remuneration = 0.001 * solde

- ou bien le taux de rémunération est variable Compte


context Compte Solde
inv : if solde < 100 then remuneration
remuneration = 0.001 * solde
else
remuneration = 0.005 * solde
endif

40
OCL Object Constraint Language
Définition d'attributs et de méthodes
def est un type de contrainte qui permet de
déclarer et de définir la valeur d'attributs. On
écrit:

Exemple: Pour définir un attribut majeur dans la


classe Personne, on écrit :
context Personne Personne
def: majeur : Boolean = (age >= 18) Nom
Age
...

41
OCL Object Constraint Language
Initialisation (init)
Le type de contrainte init permet de préciser la
valeur initiale d'un attribut.
Exemple: le solde est initialisé à 0 pour tout
nouveau compte

context Compte
init : solde = 0
Compte
Solde

42
OCL Object Constraint Language
Le type de contrainte derive permet de préciser
comment la valeur de certains attributs change ; la
valeur de tels éléments est toujours déterminée en
fonctions d'autres éléments du diagramme
L'âge d'une personne est la différence entre la date
courante et la date de naissance de la personne :
context Personne::age
derive : Date::current() - date_de_naissance
l'élément dérivé doit toujours avoir la valeur imposée
par l'expression de la contrainte derive. Mais la
contrainte init ne s'applique qu'au moment de la
création d'une instance précisée par le contexte de la
contrainte.

43
OCL Object Constraint Language

context Homme
inv: sexe = Gender::male
context Femme
inv: sexe = #female

44
OCL Object Constraint Language
Types de base OCL :
Integer, Boolean (true, false) ; and, or, not, implies, if then else),
Real, String.
Collections OCL :
size():Integer, retourne le nombre d'éléments (la cardinalité) de
self.
isEmpty(), vrai si vide.
notEmpty(), vrai si non vide.

Exemple:
Une société possède exactement
un directeur :
context Société
inv : self.directeur->size()=1
Une société a au moins un employé :
context Société
inv : self.employé->notEmpty()

45
OCL Object Constraint Language
Collections OCL :
includes(objet:T):Boolean, vrai si contient l'objet T.
excludes(objet:T):Boolean, vrai si ne contient pas l'objet T.
count(objet:T):Integer, retourne le nombre d'occurrences de

Exemple

employés contient le directeur) :


context Société
inv : self.employé->includes(self.directeur)
Une société possède exactement un directeur :
context Société
inv : self.employé-> count(self.directeur)=1

46
OCL Object Constraint Language
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 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

47
OCL Object Constraint Language

( ) : retourne le sous-ensemble de la
collection respectent la contrainte
spécifiée
Exemple:

retourne une collection contenant


tous les comptes bancaires dont
le solde est supérieur à 1000 dhs

48
OCL Object Constraint Language

: idem mais ne garde que les


éléments ne respectant pas la contrainte
Exemple:

retourne une collection contenant


tous les comptes bancaires
dont le solde n'est pas
supérieur à 1000 dhs

49
OCL Object Constraint Language
: retourne vrai si au moins un
élément de respecte la contrainte spécifiée et
faux sinon
Exemple:
context Banque
inv: not( self.clients ->
exists (c | c.age < 18) )
Il n'existe pas de clients de la
banque
à 18 ans

50
OCL Object Constraint Language
: retourne vrai si tous les
éléments de spécifiée
Exemple:
context Banque
inv: self.clients ->
forAll(c | c.age < 18)

Tous les clients de la banque ont


un âge supérieur à 18 ans

51
Exercice - OCL

addEmployee(Person)

52
Exercice
Dans une compagnie, un manager doit travailler et avoir
plus de 40 ans
Le nombre d'employés d'une compagnie est non nul
Une personne considérée comme au chômage ne doit
pas avoir des revenus supérieurs à 500
Une personne a un père et une mère
Tous les enfants d'une personne ont bien cette
personne comme parent et inversement
Pour être marié, il faut avoir plus de 18 ans
Un homme est marié avec une femme et une femme
avec un homme
Un employé qui est embauché n'appartenait pas déjà à
la compagnie

53

Vous aimerez peut-être aussi