Académique Documents
Professionnel Documents
Culture Documents
Modélisation et spécification
formelles des logiciels
Hiver 2017
Alexandre Terrasa
Département d’informatique, UQÀM
OCL
Collections
2
Rappels: Types OCL
Boolean true, false
Integer 1 ; -3 ; 12 ; 42
Real 1,5 ; 3,14 ; -10.3
String ‘Hello World!’
OCLVoid null ; invalid
Et les collections que nous allons voir...
maintenant 3
Collections
OCL définit 4 types de collections
● Set
● OrderedSet
● Bag
● Séquence
Collection
5
Set
Collection non-ordonnée d’éléments uniques
Set {1, 88, 5, 2}
Set {‘pomme’, ‘banane’, ‘fraise’}
7
Bag
Collection non ordonnée d’éléments non uniques
Bag {1, 3, 4, 3, 5}
8
Sequence
Collection ordonnée d’éléments non uniques
Sequence {1, 2, 3, 4}
9
Types et collections
Les collections OCL sont typées.
Collection(T)
Set(Integer) Set(Etudiant)
Bag(String) Bag(Cours)
Sequence(Boolean) Sequence(Resultat)
10
Opérations sur les collections
size(): Number
includes( objet: T ): Boolean
excludes( objet: T ): Boolean
count( objet: T ): Integer
includesAll( c: Collection(T) ): Boolean
excludeAll( c: Collection(T) ): Boolean
isEmpty(): Boolean
notEmpty(): Boolean
sum(): T 11
Opérations sur les sets et
bags
union( set: Set(T) ): Set(T)
12
Opérations pour séquences
et sets ordonnés
append( objet: T ): Sequence(T)
first(): T
last(): T
13
OCL
Naviguer via les relations
14
Naviguer via les associations
Naviguer vers un objet ou un groupe d’objets
depuis un contexte
● en suivant les associations
Dépend de la cardinalité de l’association
● 0 .. 1 association avec un objet
● 0 .. * association avec une collection
d’objets
15
Relations et cardinalités
Professeur Université
1..* 1
employés université
employés université
employés université
context Université
inv: self.employés
Contient des professeurs
Collection(Professeur)
18
Type des relations
Dépend du type impliqué dans la multiplicité:
Professeur Université
1..* 1
employés université
employés université
Résultat
session: String
note: Real
Étudiant Cours
nom: String cours sigle: String
codePerm: String 0..* titre: String
1
21
Naviguer via une classe
d’association
Résultat
résultats session: String
note: Real
0..* 0..*
cours
1 1
Étudiant Cours
nom: String sigle: String
codePerm: String titre: String
22
Naviguer via une classe
d’association
Naviguer vers la classe d’association
context Etudiant
inv: self.résultats->notEmpty()
24
Filtres
En logique mathématique, un filtre est une
opération définie sur un ensemble permettant
de retourner un sous-ensemble
Filtres OCL
● select
● reject
● collect
25
Opération select
Sélectionner les éléments d’une collection
satisfaisant une expression logique
select( [ <élément> [ : <Type> ] | ] <exp> )
26
Exemple select
Professeur
1 Université
1..*
age: Integer
employés université
context Université
inv: employés->select(prof | prof.age > 50)->notEmpty()
context Université
inv: employés->select(prof: Professeur | prof.age > 50)->notEmpty()
27
Opération reject
Sélectionner les éléments d’une collection ne
satisfaisant pas une expression logique
reject( [ <élément> [ : <Type> ] | ] <exp> )
Équivalent à
select(not exp)
28
Exemple reject
Professeur
1 Université
1..*
age: Integer
employés université
context Université
inv: employés->reject(prof | prof.age <= 50)->notEmpty()
context Université
29
inv: employés->reject(prof: Professeur | prof.age <= 50)->notEmpty()
Exercice 1
Tournoi
date: Date tournoi
pro: Boolean
1
tournois *
affronte
équipes matchs *
* *
Joueur Équipe Match
victoire: Boolean
nom: String joueurs équipe nom: String
pro: Boolean
age: Integer
1..5 1 30
*
Exercice 1
Contraintes:
● toutes les équipes doivent avoir au moins
un enfant
● toutes les équipes doivent avoir gagnées au
moins un match
● toutes les équipes professionnelles doivent
avoir participé à au moins un tournoi
professionnel
31
Solution 1
context Equipe
inv: matchs->select(victoire)->notEmpty()
32
Opération collect
Construire une nouvelle collection à partir des
valeurs des éléments d’une collection
collect( [ <élément> [ : <Type> ] | ] <exp>)
Exemple
employés->collect(age)
Notation abrégée
employés.age
33
Exemple collect
Tous les étudiants doivent suivre le cours ayant
pour sigle “INF1120”
Cours
Étudiants
* * sigle: String
cours
context Étudiant
inv: cours->collect(sigle)->includes('INF1120')
34
Exercice 2
Tournoi
date: Date tournoi
pro: Boolean
1
tournois *
affronte
équipes matchs *
* *
Joueur Équipe Match
victoire: Boolean
nom: String joueurs équipe nom: String
pro: Boolean
age: Integer
1..5 1 35
*
Exercice 2
Contraintes:
● Les équipes professionnelles ne peuvent
avoir que des joueurs majeurs.
36
Solution 2
context Equipe
37
Quantificateurs
En logique mathématique, un quantificateur est
une expression spécifiant la quantité d’
éléments satisfaisant une contrainte
Quantificateur universel
● “pour tout …” , “quel que soit…”
● Symbole mathématique ∀
Quantificateur existentiel
● “il existe au moins un …”
● Symbole mathématique ∃ 38
Opération forAll
Vraie si et seulement si <expression> est vraie
pour tous les éléments de la collection
forAll( [ <élément> [ : <Type> ] | ] <exp>)
39
Exemple forAll
Professeur
1 Université
1..*
age: Integer
employés université
context Université
inv: employés->forAll(prof | prof.age >= 18)
40
Exercice 3
Tournoi
date: Date tournoi
pro: Boolean
1
tournois *
affronte
équipes matchs *
* *
Joueur Équipe Match
victoire: Boolean
nom: String joueurs équipe nom: String
pro: Boolean
age: Integer
1..5 1 41
*
Exercice 3
Contraintes:
● Les équipes professionnelles ne peuvent
avoir de joueurs mineurs
● Tous les tournois professionnels ne
contiennent que des équipes
professionnelles
● Les équipes professionnelles ne peuvent
affronter que des équipes professionnelles
42
Solution 3
context Equipe
inv: pro implies joueurs->forAll(age >= 18)
context Tournoi
inv: pro implies equipes->forAll(pro)
43
Opération forAll étendue
Syntaxe étendue avec deux itérateurs
forAll( e1, e2 [ : <Type> ] | <exp>)
44
Exemple forAll
Professeur
1 Université
1..*
matricule: String
employés université
context Université
inv: employés->forAll(p1, p2 |
p1 <> p2 implies
p1.matricule <> p2.matricule) 45
Exemple forAll
context Université
inv: employés->forAll(p1, p2 |
p1 <> p2
implies p1.matricule <> p2.matricule)
Équivalent à
context Université
inv: self.employés->forAll(p1 |
self.employés->forAll(p2 | p1 <> p2
46
implies p1.matricule <> p2.matricule))
Exercice 4
Tournoi
date: Date tournoi
pro: Boolean
1
tournois *
affronte
équipes matchs *
* *
Joueur Équipe Match
victoire: Boolean
nom: String joueurs équipe nom: String
pro: Boolean
age: Integer
1..5 1 47
*
Exercice 4
Contraintes:
● Deux joueurs d’une même équipe ne
peuvent avoir le même nom
● Deux joueurs dans un même tournoi ne
peuvent avoir le même nom
48
Solution 4
context Equipe
inv: joueurs->forAll(j1, j2 |
j1 <> j2 implies j1.nom <> j2.nom)
context Tournoi
inv:
let joueurs = equipes.collect(joueurs)
in joueurs->forAll(j1, j2 |
j1 <> j2 implies j1.nom <> j2.nom)
49
Opération exists
Vraie si et seulement si <expression> est vraie
pour au moins un élément
exists( [ <élément> [ : <Type> ] | ] <exp>)
Équivalent à:
select(<exp>)->notEmpty() 50
Exemple exists
Tous les étudiants doivent suivre le cours ayant
pour sigle “INF1120”
Cours
Étudiants
* * sigle: String
cours
context Étudiant
inv: cours->exists(sigle = 'INF1120')
Équivalent à:
inv: cours->select(sigle = 'INF1120')->notEmpty()51
Exercice 5
Tournoi
date: Date tournoi
pro: Boolean
1
tournois *
affronte
équipes matchs *
* *
Joueur Équipe Match
victoire: Boolean
nom: String joueurs équipe nom: String
pro: Boolean
age: Integer
1..5 1 52
*
Exercice 5
Contraintes:
● toutes les équipes doivent avoir un enfant
inv: matchs->exists(victoire)
54
Conclusion
Naviguer dans des relations
● 0 .. 1 objet à objet
● 0 .. * objet à collection
Contraintes
● Filtres
● Quantificateurs
55
Ressources
● http://www.omg.org/spec/OCL/
● http://laurent-audibert.developpez.com/Cours-
UML/?page=object-constraint-langage-ocl
● Tremblay, G - Modélisation et spécification
formelle de logiciels - Loze-Dion Editeurs
Inc., 2004 (chap 12)
56