Collections OCL

Transcription

Collections OCL
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
1..*
employés
1
Université
université
Une seule université associée à un professeur:
● association entre deux objets
context Professeur
inv: self.université <> null
16
Relations et cardinalités
Professeur
1..*
employés
1
Université
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
1..*
employés
1
Université
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
1..*
employés
1
Université
université
Quel type de Collection(Professeur)?
=> par défaut: Set(Professeur)
19
Type des relations
Dépend du type impliqué dans la multiplicité:
Professeur
1..*
employés
{ordered}
1
Université
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
codePerm: String
sigle: String
0..* titre: String
cours
1
21
Naviguer via une classe
d’association
Résultat
résultats
0..*
1
Étudiant
nom: String
codePerm: String
session: String
note: Real
0..*
cours
1
Cours
sigle: 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
age: Integer
1
1..*
employés
Université
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é
27
inv: employés->select(prof: Professeur | prof.age > 50)->notEmpty()
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
age: Integer
1
1..*
employés
Université
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
pro: Boolean
tournois
tournoi
1
*
affronte
équipes
Joueur
nom: String
age: Integer
*
matchs
*
Match
Équipe
joueurs
1..5
victoire: Boolean
équipe nom: String
pro: Boolean
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
pro: Boolean
tournois
tournoi
1
*
affronte
équipes
Joueur
nom: String
age: Integer
*
matchs
*
Match
Équipe
joueurs
1..5
victoire: Boolean
équipe nom: String
pro: Boolean
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
age: Integer
1..*
employés
1
Université
université
Tous les professeurs doivent être majeurs
context Université
inv: employés->forAll(prof | prof.age >= 18)
40
Exercice 3
Tournoi
date: Date
pro: Boolean
tournois
tournoi
1
*
affronte
équipes
Joueur
nom: String
age: Integer
*
matchs
*
Match
Équipe
joueurs
1..5
victoire: Boolean
équipe nom: String
pro: Boolean
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
matricule: String
1
1..*
employés
Université
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
implies p1.matricule <> p2.matricule))
46
Exercice 4
Tournoi
date: Date
pro: Boolean
tournois
tournoi
1
*
affronte
équipes
Joueur
nom: String
age: Integer
*
matchs
*
Match
Équipe
joueurs
1..5
victoire: Boolean
équipe nom: String
pro: Boolean
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
pro: Boolean
tournois
tournoi
1
*
affronte
équipes
Joueur
nom: String
age: Integer
*
matchs
*
Match
Équipe
joueurs
1..5
victoire: Boolean
équipe nom: String
pro: Boolean
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/CoursUML/?page=object-constraint-langage-ocl
● Tremblay, G - Modélisation et spécification
formelle de logiciels - Loze-Dion Editeurs
Inc., 2004 (chap 12)
56

Documents pareils