Vous êtes sur la page 1sur 56

INF3143

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

Toutes ces classes sont des sous-types du


types abstrait Collection. 4
Hiérarchie des collections OCL

Collection

Set OrderedSet Bag Sequence

5
Set
Collection non-ordonnée d’éléments uniques
Set {1, 88, 5, 2}
Set {‘pomme’, ‘banane’, ‘fraise’}

Égalité sur les sets


Set {1, 2} <> Set {1, 3}
Set {1, 2, 3} = Set {3, 2, 1}
Set {1, 2, 1, 2, 3} = Set {1, 2, 3} 6
OrderedSet
Collection ordonnée d’éléments uniques
OrderedSet {1, 2, 5, 88}

Égalité sur les sets ordonnés


OrderedSet {1, 2, 3} = OrderedSet {1, 2, 3, 3}
OrderedSet {1, 2, 3} <> OrderedSet {1, 2, 2}

7
Bag
Collection non ordonnée d’éléments non uniques
Bag {1, 3, 4, 3, 5}

Égalité sur les sacs


Bag {1, 2, 1, 2, 3} = Bag {1, 1, 2, 2, 3}
Bag {1, 2, 1, 2, 3} <> Bag {1, 2, 3}

8
Sequence
Collection ordonnée d’éléments non uniques
Sequence {1, 2, 3, 4}

Égalité sur les séquences


Sequence {1, 2, 3} = Sequence {1, 2, 3}
Sequence {1, 2, 3} <> Sequence {1, 2, 3, 4}
Sequence {1, 2, 3} <> Sequence {3, 2, 1}

9
Types et collections
Les collections OCL sont typées.
Collection(T)

Avec les types OCL Avec les types du diagramme

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)

union( bag: Bag(T) ): Bag(T)

intersection( set: Set(T) ): Set(T)

intersection( bag: Bag(T) ): Bag(T)

including( objet: T ): Set(T)

excluding( objet: T ): Set(T)

-(set: Set(T)): Set(T)

12
Opérations pour séquences
et sets ordonnés
append( objet: T ): Sequence(T)

at( index: Number ): T

first(): T

indexOf( object: T ): Number

insertAt( index: Number, object: T ): Sequence(T)

last(): T

prepend( objet: T ): Sequence(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é

Une seule université associée à un professeur:


● association entre deux objets
context Professeur
inv: self.université <> null
16
Relations et cardinalités
Professeur Université
1..* 1

employés université

Plusieurs professeurs dans une université


● association entre un objet (université) et
une collection d’objets (employés)
context Université
inv: self.employés->notEmpty() 17
Type des relations
Dépend du type impliqué dans la multiplicité:
Professeur Université
1..* 1

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é

Quel type de Collection(Professeur)?

=> par défaut: Set(Professeur)


19
Type des relations
Dépend du type impliqué dans la multiplicité:
Professeur Université
1..* {ordered} 1

employés université

Quel type de Collection(Professeur)?

=> Si {ordered}: OrderedSet(Professeur)


20
Naviguer via une classe
d’association

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()

Naviguer depuis la classe d’association


context Résultat
inv: self.cours.sigle <> null
23
OCL
Filtres et quantificateurs

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> )

Retourne une sous-collection de self ne


contenant que les éléments satisfaisant <exp>

26
Exemple select
Professeur
1 Université
1..*
age: Integer
employés université

Ces 3 exemples sont équivalents


context Université
inv: employés->select(age > 50)->notEmpty()

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é

Ces 3 exemples sont équivalents


context Université
inv: employés->reject(age <= 50)->notEmpty()

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: joueurs->select(age < 18)->notEmpty()

inv: matchs->select(victoire)->notEmpty()

inv: pro implies


tournois->select( t | t.pro )->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

def: ages = joueurs->collect(age)

inv: pro implies


ages->select(age | age < 18)->isEmpty()

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>)

Pour vérifier qu’une contrainte est bien


respectée par tous les éléments de la collection

39
Exemple forAll
Professeur
1 Université
1..*
age: Integer
employés université

Tous les professeurs doivent être majeurs

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)

inv: pro implies


matchs->forAll(affronte.pro)

context Tournoi
inv: pro implies equipes->forAll(pro)

43
Opération forAll étendue
Syntaxe étendue avec deux itérateurs
forAll( e1, e2 [ : <Type> ] | <exp>)

Pour vérifier des invariants sur le produit


cartésien d’une collection avec elle-même.

44
Exemple forAll
Professeur
1 Université
1..*
matricule: String
employés université

Deux professeurs d’une même université ne


peuvent partager le même matricule.

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>)

Vérifier qu’au moins un élément de la collection


respecte la contrainte

É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

● toutes les équipes doivent avoir gagnées au


mois un match

● toutes les équipes professionnelles doivent


avoir participées à un tournoi professionnel
53
Solution 5
context Equipe

inv: joueurs->exists(age < 18)

inv: matchs->exists(victoire)

inv: pro implies tournois->exists(t | t.pro)

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

Vous aimerez peut-être aussi