Académique Documents
Professionnel Documents
Culture Documents
Chapitre 1 :
Le langage de contraintes OCL
Responsables du cours :
Héla Hachicha
Sommaire
1
17/02/2019
Exemple d'application :
• Application bancaire :
▫ Des comptes bancaires
▫ Des clients
▫ Des banques
• Spécification
▫ Un compte doit avoir un solde toujours positif
▫ Un client peut posséder plusieurs comptes
▫ Un client peut être client de plusieurs banques
▫ Un client d'une banque possède au moins un compte dans cette
banque
▫ Une banque gère plusieurs comptes
▫ Une banque possède plusieurs clients
2
17/02/2019
Manque de précision
Diagramme d'instances
3
17/02/2019
Diagramme d'instances
4
17/02/2019
Le langage OCL
• Norme de l'OMG
▫ Version courante : version 2.0
▫ Peut s'appliquer sur tout type de modèle, indépendant d'un
langage de modélisation donné
• OCL permet principalement d'exprimer deux types de contraintes
sur l'état d'un objet ou d'un ensemble d'objets
▫ Des invariants qui doivent être respectés en permanence
▫ Des pré et post-conditions pour une opération
Précondition : doit être vérifiée avant l'exécution
Postcondition : doit être vérifiée après l'exécution
• Attention
▫ Une expression OCL décrit une contrainte à respecter et non pas
le « code » d'une méthode
10
5
17/02/2019
11
12
• Syntaxe :
inv : <expression_logique>
• L’expression logique doit être toujours vraie
• Exemple
context Compte
inv: solde > 0
• Pour toutes les instances de la classe Compte, l'attribut
solde doit toujours être positif
6
17/02/2019
13
14
7
17/02/2019
15
16
8
17/02/2019
17
18
9
17/02/2019
19
adresse
20
10
17/02/2019
21
context Poste
inv : self.employe.age>21
(ou aussi, self.personne.age>21)
age
22
Type opérateurs
11
17/02/2019
23
24
Exercice 1 :
12
17/02/2019
25
Exercice 1 :
Q2 :
Indiquez qu’une personne mariée est
forcément majeur
Q3 :
Indiquez qu’une personne majeur doit avoir l’âge
supérieur à 18 ans
26
Exercice 2
13
17/02/2019
27
Exercice 2
28
Exercice 2
14
17/02/2019
29
30
15
17/02/2019
31
32
• 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
16
17/02/2019
33
34
17
17/02/2019
35
36
context Personne
inv: Personne.allInstances() -> forAll(p1, p2 |
p1 <> p2 implies p1.nom <> p2.nom)
18
17/02/2019
37
Exercice 3 :
Q1 : Donnez une contrainte OCL qui assure les dates d’assurances des véhicules
sont bien postérieurs à l’ adhésion de la personne qui les assure. On
considère que l’on peut comparer les dates avec les opérateurs de
comparaison classique
Q2 : Donnez une contrainte OCL qui spécifie que l’adhérent est au moins
conducteur des véhicules qu’il assure
38
Exercice 3 :
Q1:
context v:Vechicule
inv : dateDebutAssurance < v.adherent.dateAdhesion
Q2:
context a:Adherent
inv : (a.Vehicules -> collect(conducteurs))->exists(a)
19
17/02/2019
39
Conditionnelles
40
Conditionnelles
20
17/02/2019
41
Variables
• Pour faciliter l'utilisation de certains attributs ou calculs
de valeurs on peut définir des variables
• Dans une contrainte OCL : let ... in ...
context Personne
inv: let argent = compte.solde -> sum() in
age >= 18 implies argent > 0
• Une personne majeure doit avoir de l'argent
• sum() : fait la somme de tous les objets de la collection
• Pour l'utiliser partout : def
42
Requête
21
17/02/2019
43
Valeur initiales
44
Valeur dérivées
22
17/02/2019
45
Exercice 4
46
23
17/02/2019
47
48
24
17/02/2019
49
50
25
17/02/2019
51
52
26
17/02/2019
53
54
Conclusion
• OCL est un langage formel de requête
▫ Une requête est exprimée en terme des éléments de la syntaxe du modèle
(diagramme de classe ou meta-modele)
▫ OCL est utilise partout une expression est utile :
programmation par contrat
attribut dérives, corps d'une méthode, garde sur une transition, ...
• OCL ne remplace pas les explications en langage naturel.
▫ Les deux sont complémentaires !
▫ Comprendre (informel)
▫ Lever les ambigüités (OCL)
• Eviter les expressions OCL trop compliquées
▫ éviter les navigations complexes
▫ bien choisir le contexte (associer l'invariant au bon type !)
▫ éviter d'utiliser allInstances () :
rend souvent les invariants plus complexes
souvent difficile d'obtenir toutes les instances dans un système (sauf BD!)
▫ décomposer une conjonction de contraintes en plusieurs (inv, post, pre)
▫ Toujours nommer les extrémités des associations (indiquer le rôle des objets)
27
17/02/2019
55
Bibliographie
28