2. Définition
2
une condition ou une restriction sémantique exprimée sous forme
d’instruction dans un langage textuel.
Une contrainte:
Peut être attachée à n’importe quel élément de modèle ou liste
d’éléments de modèle.
Désigne une restriction qui doit être appliquée par une
implémentation correcte du système.
Sari Meriem Contraintes UML 1ére Année Master GL
3. Les Contraintes
3
Une contrainte peut être un corps écrit dans un langage de
contrainte qui peut être:
Naturel.
Dédié, comme OCL.
Issu d’un langage de programmation.
Sari Meriem Contraintes UML 1ére Année Master GL
4. Les Contraintes
4
Nous avons déjà vu comment exprimer certaines formes de
contraintes avec UML :
Contraintes structurelles : les attributs dans les classes, les
différents types de relations entre classes, la cardinalité, etc.
Contraintes de type : typage des propriétés, etc.
Contraintes diverses : les contraintes de visibilité, les méthodes et
classes abstraites, etc.
Sari Meriem Contraintes UML 1ére Année Master GL
5. Représentation d’une Contrainte
5
Une contrainte est représenté sous la forme d’une chaîne de texte
placée entre accolades ({}).
Une contrainte peut possédé un nom.
Le nom est présenté sous forme d’une chaîne suivie d’un double
point (:).
Le tout précédant le texte de la contrainte.
Sari Meriem Contraintes UML 1ére Année Master GL
6. Contraintes et contraintes prédéfinies
6
UML permet d’associer une contrainte à un, ou plusieurs, élément(s)
de modèle de différentes façons :
Sari Meriem Contraintes UML 1ére Année Master GL
7. Types de Contraintes
7
Invariant de Classe: une contrainte qui doit être satisfaite par
toutes les instances de la classe.
Pré-condition d’une opération: une contrainte qui doit toujours
être vrai avant l’exécution de l’opération.
Post-condition d’une opération: une contrainte qui doit toujours
être vrai après l’exécution de l’opération.
Sari Meriem Contraintes UML 1ére Année Master GL
8. OCL
8
un langage formel textuel d’expression de contraintes bien adapté
aux diagrammes d’UML.
Acronyme de: Object Constraint Language.
Existe depuis la version 1.1 d’UML.
Peut s’appliquer sur la plupart des diagrammes d’UML et en
particulier au diagramme de classes.
Simple à utiliser et non ambigüe.
Sari Meriem Diagrammes de Classes 1ére Année Master GL
9. Intérêt du OCL
9
C’est un langage formel volontairement simple d’accès.
Peut être interprété par des outils.
Représente un juste milieu entre le langage naturel et un langage
très technique (langage mathématique, informatique, …).
Il permet ainsi de limiter les ambiguïtés, tout en restant
accessible.
Une expression OCL décrit une contrainte à respecter et ne décrit
absolument pas l’implémentation d’une méthode.
Sari Meriem Contraintes UML 1ére Année Master GL
10. Typologie des contraintes OCL
10
1. Contexte (context).
2. Invariants (inv).
3. Préconditions et postconditions (pre, post).
4. Résultat d’une méthode (body).
5. Définition d’attributs et de méthodes (def et let…in).
6. Initialisation (init) et évolution des attributs (derive).
Sari Meriem Contraintes UML 1ére Année Master GL
11. Contexte (context)
11
Une contrainte est toujours associée à un élément de modèle.
C’est cet élément qui constitue le contexte de la contrainte.
Syntaxe: context <élément>
<élément> peut être une classe:
Exemple: context Compte
<élément> peut être une opération:
Exemple: context Compte::getSolde()
Sari Meriem Contraintes UML 1ére Année Master GL
12. Invariants (inv)
12
Un invariant exprime une contrainte prédicative sur un objet qui
doit être respectée en permanence.
Syntaxe: inv : <expression_logique>
Exemple: Le solde d’un compte doit toujours être positif.
context Compte
inv : solde > 0
Sari Meriem Contraintes UML 1ére Année Master GL
13. Préconditions & postconditions (pre, post)
13
Une précondition permet de spécifier une contrainte prédicative
qui doit être vérifiée avant l’appel d’une opération.
Une postcondition permet de spécifier une contrainte prédicative
qui doit être vérifiée après l’appel d’une opération.
Syntaxe:
Précondition : pre : <expression_logique>
Postcondition : post : <expression_logique>
Exemple:
context Compte::getSolde() : Real
pre : somme > 0
post : result = solde
Sari Meriem Contraintes UML 1ére Année Master GL
14. Résultat d’une méthode (body)
14
Permet de définir directement le résultat d’une opération.
Syntaxe: body : <requête>
Exemple: le résultat de l’appel de l’opération getSolde doit être
égal à l’attribut solde.
context Compte::getSolde() : Real
body : solde
Sari Meriem Contraintes UML 1ére Année Master GL
15. Définition d’attributs et de méthodes (def et let…in)
15
let permet de déclarer et de définir la valeur (i.e. initialiser) d’un
attribut qui pourra être utilisé dans l’expression qui suit le in.
def permet également de déclarer et de définir la valeur
retournée par une opération interne à la contrainte.
Syntaxe:
let <déclaration> = <requête> in <expression>
def : <déclaration> = <requête>
Sari Meriem Contraintes UML 1ére Année Master GL
16. Initialisation et évolution des attributs (init, derive)
16
init permet de préciser la valeur initiale d’un attribut.
derive précise comment la valeur de ce type d’élément évolue.
Syntaxe:
init : <requête>
derive : <requête>
Exemple:
context Personne::marié : Boolean
init : false
context Personne::age : Integer
derive : date_de_naissance - Date::current()
Sari Meriem Contraintes UML 1ére Année Master GL
17. Types et opérations utilisables dans OCL
17
I. Types et opérateurs prédéfinis
II. Types du modèle UML
III. Collections
1. Ensemble (Set)
2. Ensemble ordonné (OrderedSet)
3. Sac (Bag)
4. Séquence (Sequence) :
Sari Meriem Contraintes UML 1ére Année Master GL
19. Types du modèle UML
19
Une contrainte OCL peut référencer une valeur de type
énuméré.
Syntaxe: <nom_type_enuméré>::valeur
Exemple: la classe Personne possède un attribut genre de type
Genre. On peut donc écrire la contrainte :
context Personne
inv : genre = Genre::femme
Sari Meriem Contraintes UML 1ére Année Master GL
20. Collections
20
Il existe plusieurs sous-types du type abstrait Collection :
Ensemble (Set): collection non ordonnée d’éléments
uniques.
Ensemble ordonné (OrderedSet): collection ordonnée
d’éléments uniques.
Sac (Bag) :collection non ordonnée d’éléments
identifiables (pouvant comporter des doublons).
Séquence (Sequence): collection ordonnée d’éléments
identifiables.
Sari Meriem Contraintes UML 1ére Année Master GL
21. Accès aux attributs et aux opérations (self)
21
L’objet désigné par le contexte est également accessible par
l’expression self.
Syntaxe: self.<propriété>
Exemple: dans le contexte de la classe Compte, on peut utiliser les
expressions suivantes :
solde
self.solde
getSolde()
self.getSolde()
débiter(1000)
self.débiter(1000)
Sari Meriem Contraintes UML 1ére Année Master GL
22. Opération sur les classes
22
Toutes les opérations que nous avons décrites jusqu’ici
s’appliquaient sur des instances de classe.
OCL dispose d’une opération prédéfinie sur les classes, les
interfaces et les énumérations qui retourne l’ensemble de toutes les
instances.
Exemple:
Personne.allInstances()
Sari Meriem Contraintes UML 1ére Année Master GL
23. Opérations sur les collections
23
OCL a un grand nombre d'opérations prédéfinies sur les
collections.
Syntaxe: collection->operation
collection->collect(elem | expr) Retourne la collection des
valeurs obtenues par application de expr aux éléments de collection.
collection->select(elem | expression) Retourne le sous
ensemble des éléments pour lesquels expression est vrai.
collection->reject(elem | expression) Retourne le sous
ensemble des éléments sauf lesquels que pour eux l’expression est
vrai.
collection->forAll(elem | expr) Retourne vrai si expr est vrai
pour tous les éléments de collection.
Sari Meriem Contraintes UML 1ére Année Master GL
24. Opérations sur les collections
24
collection->exists(elem | expr) Retourne vrai si il existe au
moins un élément de collection pour lequel expr est vrai.
Autre opérations:
isEmpty: vrai si self est vide.
notEmpty: vrai si self n’est pas vide.
size(): retourne le nombre d’éléments (la cardinalité) de self.
count(elem):retourne le nombre d’occurrences de objet dans self.
includes(elem): vrai si elem dans collection
excludes(elem): vrai si self ne contient pas l’objet objet.
sum(): etourne la somme des éléments de self.
Sari Meriem Contraintes UML 1ére Année Master GL
25. Héritage de contraintes
25
Partout où une instance d'une classe est attendue, une instance
d'une sous classe peut lui être substituée.
C’est le concepte de Liskov’s Substitution Principle (LSP).
Sari Meriem Contraintes UML 1ére Année Master GL
26. Consequences de LSP
26
Pour les invariants:
Un invariant est toujours hérité par ses sous classes.
Les sousclasses peuvent renforcer l'invariant.
Les preconditions et postconditions:
Une precondition peut être weakened (contravariance).
Une postcondition peut être strengthened (covariance).
Sari Meriem Contraintes UML 1ére Année Master GL
28. Exemple
28
Dans une société, le directeur est un employé, n’est pas un
chômeur et doit avoir plus de 40 ans. De plus, une société possède
exactement un directeur et au moins un employé.
context Société inv : self.directeur->size()=1 and
not(self.directeur.chômeur) and self.directeur.age > 40 and
self.employé->includes(self.directeur)
Une personne possède deux parents, l’un est une femme et l’autre
un homme.
context Personne inv : parent->size()=2 implies
( parent->exists(genre=Genre::homme) and
parent->exists(genre=Genre::femme) )
Sari Meriem Contraintes UML 1ére Année Master GL