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