Vous êtes sur la page 1sur 18

OCL – Object Constraint Language

 C’est un langage informatique d'expression des


contraintes utilisé par UML.
 OCL permet de décrire des invariants dans un modèle, sous
forme d’un langage formel volontairement simple
Exemple 1:
Aucun employé ne peut avoir un âge inférieur à 18 ans
context Employe
inv: age >=18
Exemple 2: toute personne a un nom Employé
Nom
Prenom
Age
...
context Personne context Personne
inv : nom <> '‘'‘ inv : self.nom <> '‘'‘

44
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 ≤ 140 ) and ( age ≥ 0 )
-- l’âge est compris entre 0 et 140 ans

45
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. C’est une condition booléenne devant être
vraie au moment de l'appel de l'opération.
◦ Une postcondition 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

46
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
la valeur de l'attribut avant l’appel de
l’opération ;
<nom_attribut> après l'appel de
l'opération

47
OCL – Object Constraint Language
L’attribut 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

48
OCL – Object Constraint Language
 Les conditionnelles
On utilise soit l'opérateur booléen implies, soit le if then else.
Exemple : on suppose qu’un attribut rémunération est ajouté
au compte.
- pas de rémunération en dessous d'un certain seuil :
context Compte
inv : self.solde < 100 implies self.remuneration = 0.001 * self.solde

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


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

49
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:
def : nom_attribut : <type> = <requête>
Exemple: Pour définir un attribut majeur dans la
classe Personne, on écrit :
context Personne Personne
def: majeur : Boolean = (age >= 18) Nom
Age
...

50
OCL – Object Constraint Language
 let permet de déclarer et de définir
la valeur initiale d'un attribut qui
pourra être utilisé dans l'expression qui suit le in. On
écrit:

let <déclaration> = <requête> in <expression>

Exemple: on écrit pour imposer qu'une


personne majeure ait de l’argent sur
son compte:

context Personne
inv : let argent=compte.solde->sum() in (age>=18 implies
argent>0 )

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

context Compte
Compte
init : solde = 0 Solde

52
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.

53
OCL – Object Constraint Language
 L’énumération
context Homme
inv: sexe = Gender::male
context Femme
inv: sexe = #female

54
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.
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
l’objet T.
includesAll(c:Collection(T)):Boolean, vrai si T contient tous
les éléments de la collection c.
excludesAll(c:Collection(T)):Boolean, vrai si T ne contient
aucun élément de la collection c.
isEmpty(), vrai si vide.
notEmpty(), vrai si non vide.

55
OCL – Object Constraint Language
 Exemple
 Une société a au moins un employé :
context Société
inv : self.employé->notEmpty()
 Une société possède exactement un directeur :
context Société
inv : self.directeur->size()=1
 Le directeur est également un employé (l’ensemble des
employés contient le directeur) :
context Société
inv : self.employé->includes(self.directeur)

56
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

57
OCL – Object Constraint Language
 Opérations sur éléments d'une collection
select(condition) : retourne le sous-ensemble de la
collection dont les éléments respectent la contrainte
spécifiée
Ex: compte -> select( c | c.solde > 1000)
retourne une collection contenant tous les comptes
bancaires dont le solde est supérieur à 1000 dhs
Reject(condition) : idem mais ne garde que les
éléments ne respectant pas la contrainte
Ex: compte -> reject( solde > 1000)
retourne une collection contenant tous les comptes
bancaires dont le solde n'est pas supérieur à 1000 dhs
58
OCL – Object Constraint Language
Exists(condition) : retourne vrai si au moins un
élément de col respecte la contrainte spécifiée et
faux sinon
Ex: context Banque
inv: not( clients -> exists (age < 18) )
Il n'existe pas de clients de la banque dont l’âge est
inférieur à 18 ans
forAll(contrainte) : retourne vrai si tous les
éléments de col respectent la contrainte spécifiée

59
Exercice - OCL

addEmployee(Person)

60
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

61

Vous aimerez peut-être aussi