Académique Documents
Professionnel Documents
Culture Documents
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 ;
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
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:
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