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
Employé
Exemple 2: toute personne a un nom
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 ;
<nom_attribut> avant 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


context Compte
inv : if self.solde < 100 Compte
then self.remuneration = 0.001 * self.solde Solde
else self.remuneration = 0.005 * self.solde remuneration
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
init : solde = 0
Compte
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 col 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 €


 Un enfant 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