CSC4002 : Introduction à la conception et à la programmation
Transcription
CSC4002 : Introduction à la conception et à la programmation
CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA Denis Conan et Jean-Luc Raffy CSC 4002 Octobre 2015 CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 -1 CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 0 CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA Table des matières CSC4002 : Introduction à la conception et à la programmation orientées objet avec UML et JAVA 9 1 Objectifs de CSC4002 10 2 Démarche 10 3 Découpage du module 10 4 Prérequis 11 5 Évaluation 11 6 Résultats, statistiques 12 7 Comment réussir CSC4002 12 8 Site Web et adresses courriel 13 Introduction au langage de modélisation UML 15 Sommaire 19 1 Objectifs de ce cours de modélisation orientée objet 20 2 Généralités sur la modélisation orienté objet et sur UML 2.1 Principes de la modélisation . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Pourquoi et comment modéliser en orienté objet . . . . . . . . . . . . . 2.3 Unified Modelling Language (UML) . . . . . . . . . . . . . . . . . . . . 2.3.1 UML, un langage . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.2 Les 10 principaux diagrammes UML . . . . . . . . . . . . . . . . 2.4 Cinq façons de voir un système informatique : les 4+1 vues de Kruchten 2.5 Phases de la modélisation, cycle en V . . . . . . . . . . . . . . . . . . . 2.6 Rôle de l’expression des besoins . . . . . . . . . . . . . . . . . . . . . . . 2.6.1 Exemple de cahier des charges : Studs . . . . . . . . . . . . . . . 2.6.2 Règles de gestion et contraintes de l’application Studs . . . . . . 2.7 Rôle de l’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.8 Rôle de la conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 22 23 24 25 26 28 29 30 31 32 33 34 35 3 Analyse, vues cas d’utilisation et processus 3.1 Modèle de l’analyse . . . . . . . . . . . . . . . . . . . . . . . 3.2 Diagrammes de cas d’utilisation . . . . . . . . . . . . . . . . 3.2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2 Acteur . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3 Relation de généralisation spécialisation entre acteurs 3.2.4 Cas d’utilisation, lien de communication et système . . 3.2.5 Exemple de diagramme de cas d’utilisation . . . . . . 3.2.6 Éléments de méthodologie . . . . . . . . . . . . . . . . 3.3 Diagrammes d’activité * . . . . . . . . . . . . . . . . . . . . . 3.3.1 Scénarios d’un cas d’utilisation * . . . . . . . . . . . . 3.3.2 Actions et choix * . . . . . . . . . . . . . . . . . . . . 3.3.3 Concurrence * . . . . . . . . . . . . . . . . . . . . . . 3.3.4 Autres notations du diagramme d’activité * . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 37 38 39 40 41 42 44 45 46 47 48 49 50 51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 1 CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA 4 Analyse et conception, aspects statiques de la vue logique 4.1 Diagrammes communs à l’analyse et à la conception . . . . . . . . . . . 4.2 Diagramme de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Modéliser la structure logique du système dans un diagramme de 4.2.2 Classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 Instanciation : création d’un objet d’une classe . . . . . . . . . . 4.2.4 Attributs et opérations de classe . . . . . . . . . . . . . . . . . . 4.2.5 Attribut dérivé . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.6 Association entre classes . . . . . . . . . . . . . . . . . . . . . . . 4.2.7 Nom de rôle et multiplicité . . . . . . . . . . . . . . . . . . . . . 4.2.8 Généralisation spécialisation ou héritage . . . . . . . . . . . . . . 4.2.9 Généralisation spécialisation : vision ensembliste . . . . . . . . . 4.2.10 Généralisation spécialisation : vision encapsulation . . . . . . . 4.2.11 Généralisation et redéfinition d’opérations . . . . . . . . . . . . 4.2.12 Méthode Polymorphique et liaison dynamique . . . . . . . . . . 4.2.13 Agrégation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.14 Exemple de diagramme de classes . . . . . . . . . . . . . . . . . 4.2.15 Éléments de méthodologie . . . . . . . . . . . . . . . . . . . . . 4.3 Diagramme d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 Concepts avancés du diagramme de classes . . . . . . . . . . . . . . . . 4.4.1 Navigabilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.2 Classe d’association . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.3 Composition : agrégation forte . . . . . . . . . . . . . . . . . . . 4.4.4 Classe abstraite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.5 Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.6 Classe paramétrée / générique * . . . . . . . . . . . . . . . . . . 4.4.7 Exemple de diagramme de classes avancé . . . . . . . . . . . . . . . . . . . . . classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 53 54 55 56 57 58 59 60 61 62 64 65 66 67 69 70 71 73 74 75 76 77 78 79 80 82 83 5 Analyse et conception, aspects dynamiques de la vue logique 5.1 Rappel : diagrammes communs à l’analyse et à la conception . . 5.2 Modélisation des aspects dynamiques . . . . . . . . . . . . . . . 5.2.1 Algorithme : orientations procédurale et objet . . . . . . . 5.2.2 Modèle dynamique de l’analyse et de la conception . . . . 5.3 Diagramme de séquence . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 Modéliser l’ordre des interactions . . . . . . . . . . . . . . 5.3.2 Participant, temps et message . . . . . . . . . . . . . . . . 5.3.3 Exemple de diagramme de séquence « Ouvrir un scrutin » 5.3.4 Syntaxe et types de messages . . . . . . . . . . . . . . . . 5.3.5 Création et suppression d’objets . . . . . . . . . . . . . . 5.3.6 Fragments de séquence « ref » et « opt » . . . . . . . . . 5.3.7 Fragment de séquence « loop » . . . . . . . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Diagramme de communications . . . . . . . . . . . . . . . . . . . 5.4.1 Modéliser les liens d’interactions . . . . . . . . . . . . . . 5.4.2 Participant, lien d’interaction, message . . . . . . . . . . . 5.4.3 Message conditionné, messages en séquence . . . . . . . . 5.4.4 Messages emboîtés . . . . . . . . . . . . . . . . . . . . . . 5.4.5 Itération de messages . . . . . . . . . . . . . . . . . . . . 5.4.6 Collection et recherche dans une collection . . . . . . . . . 5.4.7 Messages concurrents * . . . . . . . . . . . . . . . . . . . 5.4.8 Choix entre séquence et communications* . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.5 Diagramme de machine à états . . . . . . . . . . . . . . . . . . . 5.5.1 Modéliser l’état des objets d’une classe . . . . . . . . . . . 5.5.2 Types d’états, événement et transition . . . . . . . . . . . 5.5.3 Événement, condition et action d’une transition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA 5.5.4 Transition implicite . . . 5.5.5 Exemple de diagramme de 5.5.6 Actions liées à un état . . 5.5.7 Éléments de méthodologie 5.5.8 État composite * . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . machine . . . . . . . . . . . . . . . . . . . . . . . . . . à états de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . la classe . . . . . . . . . . . . . . . . . . . . . . . . . Scrutin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 113 114 115 116 117 6 Conception, aspects langage et technique 6.1 Rappel des phases du cycle de développement en V . . . . . . . . . . . 6.2 Conception des classes . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Rappel du diagramme de classes de l’étude de cas Studs . . . . . . . . 6.4 Traduction des associations en attributs . . . . . . . . . . . . . . . . . 6.4.1 Règles de traduction . . . . . . . . . . . . . . . . . . . . . . . . 6.5 Traduction des agrégations . . . . . . . . . . . . . . . . . . . . . . . . 6.6 Traduction des compositions * . . . . . . . . . . . . . . . . . . . . . . 6.7 Traduction de la classe « Façade » du système . . . . . . . . . . . . . 6.8 Encapsulation : visibilité / accessibilité des attributs et des opérations 6.8.1 Encapsulation avec le concept de Visibilité . . . . . . . . . . . . 6.8.2 Notation UML . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.8.3 Cas particulier des attributs/opérations protégés . . . . . . . . 6.9 Traduction des attributs dérivés . . . . . . . . . . . . . . . . . . . . . 6.10 Qualification de certaines associations * . . . . . . . . . . . . . . . . 6.11 Traduction des diagrammes d’interaction en algorithmes . . . . . . . 6.12 Traduction des diagrammes de machine à états . . . . . . . . . . . . 6.12.1 Quelques opérations de la classe Scrutin . . . . . . . . . . . . 6.13 Traduction des relations de généralisation spécialisation . . . . . . . 6.14 Traduction des classes d’association * . . . . . . . . . . . . . . . . . . 6.15 Méthodologie : une fiche par classe . . . . . . . . . . . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 7 Conception, vues développement et physique 7.1 Diagrammes de la vue développement . . . . . . . . 7.2 Diagramme de composants . . . . . . . . . . . . . . 7.2.1 Composant, interfaces offertes et requises . . 7.2.2 Composite, port, connecteurs de délégation et 7.3 Diagramme de paquetages . . . . . . . . . . . . . . . 7.3.1 Paquetage, espace de nommage . . . . . . . . 7.3.2 Relation entre paquetages . . . . . . . . . . . 7.4 Diagramme de la vue physique . . . . . . . . . . . . 7.5 Diagramme de déploiement . . . . . . . . . . . . . . 7.5.1 Nœud et liaison de communication . . . . . . 7.5.2 Artefact et composant . . . . . . . . . . . . . 7.5.3 Dépendance entre artefacts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 141 142 143 144 145 146 147 148 149 150 151 152 . . . . . . . . . . . . . . . . . . . . . . . . d’assemblage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Conclusion 153 9 Bibliographie 154 BE1–2 : Phase d’analyse Gestion des prêts dans une médiathèque 1 Sujet Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 155 156 3 CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA 2 Méthodologie et objectifs 2.1 Première lecture : acteurs et cas d’utilisation . . . . . 2.1.1 Question 1 : diagramme de cas d’utilisation . . 2.2 Analyse du texte : recherche des classes et opérations . 2.2.1 Question 2 : liste des classes . . . . . . . . . . . 2.3 Phase de construction du diagramme de classes . . . . 2.3.1 Question 3 : diagramme de classes simple . . . 2.4 Phase de recherche des attributs et opérations . . . . . 2.4.1 Question 4 : classes avec opérations . . . . . . 2.5 Phase de vérification de l’analyse, aspects statiques . . 2.5.1 Question 5 : vérifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 156 156 156 157 157 157 157 158 158 158 3 Cahier des charges 158 3.1 Règles de prêt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 BE3–4 : Phase d’analyse Diagrammes dynamiques 161 1 Questions 162 2 Méthodologie 162 2.1 Construction des diagrammes de machine à états (DME) . . . . . . . . . . . . . . . . . . . 162 2.2 Construction des diagrammes de communications (DC) et de séquence (DS) . . . . . . . . 162 2.3 Derniers conseils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 BE5 : Conception des classes 163 1 Questions 164 2 Méthodologie 164 2.1 Démarche de conception des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 2.2 Opérations à effectuer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 BE6–7 : Analyse complète d’un cas 165 1 Sujet 166 2 Questions 2.1 Analyse du texte . . . . . . . . . . . . . . . . . 2.2 Diagramme de cas d’utilisation . . . . . . . . . 2.3 Diagramme de classes . . . . . . . . . . . . . . 2.4 Diagramme de machine à états . . . . . . . . . 2.5 Conception des classes . . . . . . . . . . . . . . 2.6 Diagramme de communications ou de séquence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introduction au langage de programmation Java 169 Sommaire du cours 1 Introduction à Java 1.1 Vous avez dit Java ? . . . . 1.1.1 Android . . . . . . . 1.1.2 CAS . . . . . . . . . 1.1.3 Java partout ! . . . . 1.1.4 Pourquoi nous ? . . 1.2 Que recouvre le mot Java ? 1.2.1 Héros . . . . . . . . 1.2.2 Projet et Historique 1.3 Caractéristiques . . . . . . 166 166 166 166 167 167 167 173 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 174 174 175 175 176 176 177 177 178 4 CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA 1.3.1 Java un langage Objet . . . 1.3.2 Machine Virtuelle Java . . . 1.3.3 Robustesse . . . . . . . . . 1.4 Historique de l’API . . . . . . . . . 1.5 Environnements de développement 1.5.1 Java Standard Development 1.6 En savoir plus . . . . . . . . . . . 1.6.1 Sites Web . . . . . . . . . . Questions sur les concepts Java . . . . . . . . . . . . . . . . . . . Kit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 180 180 181 182 182 183 184 184 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 185 186 186 188 188 189 189 190 190 191 192 192 3 Classes et objets en Java 3.1 Classe . . . . . . . . . . . . . . . . . . . . . 3.1.1 Classe Personne en Java . . . . . . . 3.1.2 Instance de classe en UML . . . . . 3.1.3 Instance de classe en Java . . . . . . 3.2 Objet . . . . . . . . . . . . . . . . . . . . . 3.2.1 Constructeurs en Java . . . . . . . . 3.2.2 Exemples de constructeurs . . . . . . 3.2.3 this . . . . . . . . . . . . . . . . . . 3.2.4 Exemples d’utilisation de this . . . 3.2.5 Destruction des objets . . . . . . . . 3.2.6 Abstraction et encapsulation . . . . 3.2.7 Visibilité des méthodes . . . . . . . . 3.3 Attributs et méthodes de classe . . . . . . . 3.3.1 Attributs et méthodes de classe Java 3.3.2 Attributs et méthodes de classe . . . 3.4 Association entre classes . . . . . . . . . . . 3.4.1 Exemple d’association . . . . . . . . 3.4.2 Association entre classes en Java . . Questions sur les classes et objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 194 194 196 196 197 197 198 198 198 199 200 200 201 201 202 203 203 204 205 4 Généralisation spécialisation en Java 4.1 Généralisation spécialisation . . . . . . . . . . . . . . . . . . 4.1.1 Héritage : comment en Java . . . . . . . . . . . . . . 4.1.2 Héritage et constructeur . . . . . . . . . . . . . . . . 4.1.3 Exemple de classe parente et classe dérivée . . . . . 4.1.4 Utilisation de classe parente et dérivée . . . . . . . . 4.2 Polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Exemple de Upcast et Downcast . . . . . . . . . . . 4.3 Redéfinition de méthodes dans les classes dérivées . . . . . 4.3.1 Polymorphisme et liaison dynamique avec toString 4.4 Héritage, membres et visibilité . . . . . . . . . . . . . . . . Questions généralisation/spécialisation en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 206 207 207 208 209 210 211 212 212 213 213 2 Concepts de bases de Java 2.1 Syntaxe de base . . . . . . . . . . . . 2.1.1 Premier en C . . . . . . . . . . 2.1.2 Premier en Java . . . . . . . . 2.2 Types Primitifs . . . . . . . . . . . . . 2.2.1 Conversions de type . . . . . . 2.2.2 Exemple de conversions . . . . 2.2.3 Tableaux . . . . . . . . . . . . 2.2.4 Exemple avec un tableau . . . 2.3 Tableaux . . . . . . . . . . . . . . . . 2.4 Méthodes . . . . . . . . . . . . . . . . 2.5 Exemple de passage d’arguments . . . Questions sur la syntaxe de base de Java . . . . . . . . . . . . . Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 5 CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA 4.5 Classes abstraites . . . . . . . . . . . 4.5.1 Classes abstraites : principes 4.5.2 Classes abstraites en Java . . 4.6 Exemple de classe Abstraites . . . . 4.6.1 Exemple : classes abstraites . 4.7 Interfaces . . . . . . . . . . . . . . . 4.7.1 Interfaces en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 214 215 215 216 218 218 5 Organisation des sources Java 5.1 Programme en C (rappel) . . . . . . . . . . . . . . . . 5.2 Exécution d’un programme (rappel) . . . . . . . . . . 5.3 Exécution d’un programme sur une machine virtuelle 5.4 Dans le cas de Java . . . . . . . . . . . . . . . . . . . 5.5 Unités de compilation . . . . . . . . . . . . . . . . . . 5.6 Paquetages . . . . . . . . . . . . . . . . . . . . . . . . 5.6.1 Chemin de recherche . . . . . . . . . . . . . . . 5.6.2 Exemple . . . . . . . . . . . . . . . . . . . . . . 5.7 Visibilité en Java . . . . . . . . . . . . . . . . . . . . . 5.7.1 Table de visibilité . . . . . . . . . . . . . . . . . Questions organisation des sources en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 220 220 221 222 222 223 224 224 224 225 226 6 API Java 6.1 Premières classes de l’API . . . . . . . . . . 6.2 Classe java.lang.Object . . . . . . . . . . 6.2.1 Égalité . . . . . . . . . . . . . . . . . 6.2.2 Exemple d’égalité . . . . . . . . . . . 6.2.3 Exemple de méthode equals . . . . . 6.3 Interface de programmation . . . . . . . . . 6.3.1 Quelques paquetages Java . . . . . . 6.4 java.lang.* . . . . . . . . . . . . . . . . . . . 6.4.1 Exemple avec la classe Integer . . . 6.4.2 Classe String . . . . . . . . . . . . . 6.4.3 Exemple pour String . . . . . . . . Questions API java.lang . . . . . . . . . . . . . 6.5 java.util.* . . . . . . . . . . . . . . . . . . . 6.5.1 Classe paramétrée . . . . . . . . . . 6.5.2 Classes Abstraites des collections . . 6.5.3 Classes instanciables des collections 6.5.4 Collections . . . . . . . . . . . . . . 6.5.5 Interface Iterable . . . . . . . . . . 6.5.6 Interface Collection<E> . . . . . . 6.5.7 Interface List<E> . . . . . . . . . . 6.5.8 Classe Vector<E> . . . . . . . . . . . 6.5.9 Boucle pour les collections . . . . . . 6.5.10 Exemple for-each sur un Vector . . 6.5.11 Exemple de classe avec Vector . . 6.5.12 Interface Iterator . . . . . . . . . 6.5.13 Exemple avec Iterator . . . . . . 6.5.14 Dictionnaires Map<K,V> . . . . . . . 6.5.15 Exemple pour Map . . . . . . . . . . 6.5.16 Dictionnaire Hashtable<K,V> . . . 6.5.17 Exemple pour Hashtable . . . . . . 6.5.18 Représentation d’une Hashtable . . Questions collections en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 227 227 229 229 230 231 231 232 233 233 233 234 234 235 236 237 237 238 238 239 239 240 241 241 242 243 244 244 245 246 246 247 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 6 CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA 7 Exceptions en Java 7.1 Motivation : retours sur un bug . . . 7.2 Principes . . . . . . . . . . . . . . . 7.2.1 Mise en œuvre . . . . . . . . 7.2.2 Exemple de traitement . . . . 7.3 Réalisation . . . . . . . . . . . . . . 7.3.1 java.lang.Exception . . . . . . 7.4 Traitement des exceptions . . . . . . 7.5 Exemple de traitement d’exceptions Questions sur les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 248 249 250 250 251 251 252 253 254 8 Concepts objets avancés en Java 8.1 Copie simple/légère . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.1 Copie pour studs . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.2 Représentation graphique d’une copie légère dans studs . . . . 8.1.3 Exemple de copie légère . . . . . . . . . . . . . . . . . . . . . . 8.1.4 Représentation graphique d’une copie plus profonde dans studs 8.1.5 Copie plus profonde dans studs . . . . . . . . . . . . . . . . . . 8.1.6 Représentation graphique d’une copie profonde . . . . . . . . . 8.1.7 Clone de Scrutin . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.8 Clone en copie profonde de Personne . . . . . . . . . . . . . . 8.1.9 Suite exemple de copie profonde . . . . . . . . . . . . . . . . . 8.2 Retour sur hashCode() . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 Exemple hashCode . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 Retour sur les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1 Test des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2 RuntimeException . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 256 257 257 257 259 259 261 262 263 264 265 266 266 267 269 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliographie 271 Les tests en orienté objet 274 Gestion de la persistance des objets 342 TP13-14 : TP de synthèse Tableaux de service des navigants Air France 395 1 Questions de cours 396 2 Rappel du sujet du BE 396 3 Résultat de l’analyse UML 3.1 Liste des classes . . . . . . . . . . . . . . . . . . 3.2 Cas d’utilisation . . . . . . . . . . . . . . . . . 3.3 Diagramme de classes . . . . . . . . . . . . . . 3.4 Diagramme de machine à états . . . . . . . . . 3.5 Diagramme de communications ou de séquence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 397 397 398 398 399 4 Questions de l’étude de cas 400 Glossaire global Christian Bac et Denis Conan 402 Index global Christian Bac et Denis Conan 406 Index 407 Fin 413 Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 7 CSC4002 : Introduction à la conception et à la programmation orientées objet illustrées avec UML et JAVA Licence Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 414 8 CSC4002 : Introduction à la conception et à la programmation orientées objet avec UML et JAVA Denis Conan et Jean-Luc Raffy Revision : 1496 CSC 4002 Octobre 2015 9 CSC4002 : Conception et programmation orientée objet ' $ 1 Objectifs de CSC4002 1. Présenter les concepts de base de la conception et de la programmation orientées objet : objet, classe, composition, héritage, polymorphisme, en les illustrant avec la notation UML #2 2. Proposer une méthode permettant la conception de solutions orientées objet pour résoudre des problèmes simples en utilisant les diagrammes UML 3. Illustrer la programmation en réalisant les solutions obtenues dans le langage orienté objet JAVA 4. Appréhender les problèmes engendrés par le test d’applications orientées objet 5. Et illustrer la persistance des données en interfaçant les applications obtenues avec une base de données relationnelle & % ' $ 2 Démarche Trois cas d’étude réalistes illustrent le cours : Cours = Application de gestion de sondages BE et TP = Application de gestion d’une médiathèque #3 I Depuis le cahier des charges jusqu’à la livraison F Étude des besoins du client F Analyse/conception F Tests de logiciel F Implantation (JAVA et JDBC) BE et TP de synthèse = Application de gestion des navigants d’une compagnie aérienne Avertissement : Ne pas avoir peur ! La difficulté de la taille du cas d’étude principal s’estompe lors du BE et du TP de synthèse I qui permettent de remettre en perspective les concepts et la méthodologie & Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 % 10 CSC4002 : Conception et programmation orientée objet ' $ 3 Découpage du module Le module est divisé en deux parties : Analyse/Conception Octobre et novembre ; 16H30 Présentiel + 18h Hors présentiel #4 I Analyse : élaboration d’un ensemble de diagrammes UML correspondant à une solution du problème posé I Conception : étude des techniques de passage des diagrammes UML à une description complète des classes Programmation Décembre et janvier ; 28H30 Présentiel + 27H Hors présentiel I I I I Découverte du langage JAVA et de ses composants les plus utiles Réalisation en JAVA de la solution obtenue dans la partie précédente Élaboration et programmation d’un jeu de tests Persistance des données du système (avec JDBC) & % ' $ 4 Prérequis 1. Maîtrise de l’environnement UNIX (CSC3001) #5 2. Maîtrise de la programmation procédurale en langage C (CSC3002) 3. Connaissance des principes de la gestion de projet (CSC3502) 4. Maîtrise des bases de données relationnelles (CSC4001) & Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 % 11 CSC4002 : Conception et programmation orientée objet ' $ 5 Évaluation 1. CC (Contrôle continu) : BE noté en monôme de 2h sur table portant sur la modélisation orientée objet en UML Avec les documents distribués en cours et en BE 2. CF1 (Contrôle final) : #6 Contrôle individuel de 1h30 sur table portant sur la programmation orientée objet en JAVA, avec les tests et la persistance des données Avec les documents distribués en cours et en TP 3. CF2 : Contrôle individuel de 1h30 sur table portant sur l’ensemble du module Avec les documents distribués en cours, en BE et en TP NoteCSC4002 = sup(M oy(CC, CF 1), max(CF 2, 13)) NoteUVInfo = (2 ∗ NoteCSC4001 + 4 ∗ NoteCSC4002 + 1 ∗ NoteCSC4003)/7 & % ' $ 6 Résultats, statistiques Année 2014/2015 198 étudiants CC UML : moyenne 11.9, écart-type 1.99, 9 < 7, 38 < 10, 110 ≥ 12 CF 1 : moyenne 10.4, écart-type 3.37, 35 < 7, 97 < 10, 123 ≥ 65 CF 2 : 34 personnes présentes, 19 < 10, 3 < 7 #7 UV Info (CSC4001 — CSC4002 — CSC4003) : 5 étudiants ne valident pas l’UV Année 2013/2014 185 étudiants CC UML : moyenne 12.2, écart-type 1.8, 4 < 7, 21 < 10, 95 ≥ 12 CF 1 : moyenne 13.3, écart-type 2.35, 10 < 7, 31 < 10, 123 > 12 CF 2 : 13 personnes présentes, 10 < 10, 2 < 7 UV Info (CSC4001 — CSC4002 — CSC4003) : 5 étudiants ne valident pas l’UV & Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 % 12 CSC4002 : Conception et programmation orientée objet ' $ 7 Comment réussir CSC4002 Être assidu, travailler régulièrement, ne pas lâcher (le module dure 4 mois) Travail personnel : le temps en présentiel n’est pas suffisant pour l’assimilation ; 45 heures de travail hors présentiel sont demandées Partie modélisation : 18h #8 Partie programmation : 27h (variable suivant les savoir-faire à l’entrée du module) I Consolidation des prérequis : ±3 heures (remise à niveau en C) Travail des cours : assimilation des concepts par la lecture Travail des BEs : étudier les solutions proposées (assimilation par la pratique) I S’exercer sur d’autres exemples pris des annales I S’auto-évaluer sur les QCM Travail des TPs : les terminer (assimilation par la pratique) I S’exercer avec les exercices personnels I S’auto-évaluer sur les QCM & % ' $ 8 Site Web et adresses courriel Module dans Moodle : http://moodle.tem-tsp.eu Site Web accessible Internet : http://www-inf.it-sudparis.eu/COURS/CSC4002 #9 En cas de question/suggestion, envoyez un courriel aux DEUX coordinateurs : Denis.Conan At telecom-sudparis.eu et Jean-Luc.Raffy At telecom-sudparis.eu & Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 % 13 CSC4002 : Conception et programmation orientée objet Télécom SudParis — Denis Conan et Jean-Luc Raffy — Octobre 2015 — CSC 4002 14 Introduction au langage de modélisation UML Denis Conan, Chantal Taconet, Christian Bac Revision : 1495 CSC 4002 Octobre 2015 15 Introduction au langage de modélisation UML Table des matières Sommaire 19 1 Objectifs de ce cours de modélisation orientée objet 20 2 Généralités sur la modélisation orienté objet et sur UML 2.1 Principes de la modélisation . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Pourquoi et comment modéliser en orienté objet . . . . . . . . . . . . . 2.3 Unified Modelling Language (UML) . . . . . . . . . . . . . . . . . . . . 2.3.1 UML, un langage . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3.2 Les 10 principaux diagrammes UML . . . . . . . . . . . . . . . . 2.4 Cinq façons de voir un système informatique : les 4+1 vues de Kruchten 2.5 Phases de la modélisation, cycle en V . . . . . . . . . . . . . . . . . . . 2.6 Rôle de l’expression des besoins . . . . . . . . . . . . . . . . . . . . . . . 2.6.1 Exemple de cahier des charges : Studs . . . . . . . . . . . . . . . 2.6.2 Règles de gestion et contraintes de l’application Studs . . . . . . 2.7 Rôle de l’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.8 Rôle de la conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 22 23 24 25 26 28 29 30 31 32 33 34 35 3 Analyse, vues cas d’utilisation et processus 3.1 Modèle de l’analyse . . . . . . . . . . . . . . . . . . . . . . . 3.2 Diagrammes de cas d’utilisation . . . . . . . . . . . . . . . . 3.2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2 Acteur . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3 Relation de généralisation spécialisation entre acteurs 3.2.4 Cas d’utilisation, lien de communication et système . . 3.2.5 Exemple de diagramme de cas d’utilisation . . . . . . 3.2.6 Éléments de méthodologie . . . . . . . . . . . . . . . . 3.3 Diagrammes d’activité * . . . . . . . . . . . . . . . . . . . . . 3.3.1 Scénarios d’un cas d’utilisation * . . . . . . . . . . . . 3.3.2 Actions et choix * . . . . . . . . . . . . . . . . . . . . 3.3.3 Concurrence * . . . . . . . . . . . . . . . . . . . . . . 3.3.4 Autres notations du diagramme d’activité * . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 37 38 39 40 41 42 44 45 46 47 48 49 50 51 . . . . . . . . classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 53 54 55 56 57 58 59 60 61 62 64 65 66 67 69 70 71 73 74 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Analyse et conception, aspects statiques de la vue logique 4.1 Diagrammes communs à l’analyse et à la conception . . . . . . . . . . . 4.2 Diagramme de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Modéliser la structure logique du système dans un diagramme de 4.2.2 Classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 Instanciation : création d’un objet d’une classe . . . . . . . . . . 4.2.4 Attributs et opérations de classe . . . . . . . . . . . . . . . . . . 4.2.5 Attribut dérivé . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.6 Association entre classes . . . . . . . . . . . . . . . . . . . . . . . 4.2.7 Nom de rôle et multiplicité . . . . . . . . . . . . . . . . . . . . . 4.2.8 Généralisation spécialisation ou héritage . . . . . . . . . . . . . . 4.2.9 Généralisation spécialisation : vision ensembliste . . . . . . . . . 4.2.10 Généralisation spécialisation : vision encapsulation . . . . . . . 4.2.11 Généralisation et redéfinition d’opérations . . . . . . . . . . . . 4.2.12 Méthode Polymorphique et liaison dynamique . . . . . . . . . . 4.2.13 Agrégation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.14 Exemple de diagramme de classes . . . . . . . . . . . . . . . . . 4.2.15 Éléments de méthodologie . . . . . . . . . . . . . . . . . . . . . 4.3 Diagramme d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 16 Introduction au langage de modélisation UML 4.4 Concepts avancés du diagramme de classes . . . 4.4.1 Navigabilité . . . . . . . . . . . . . . . . . 4.4.2 Classe d’association . . . . . . . . . . . . 4.4.3 Composition : agrégation forte . . . . . . 4.4.4 Classe abstraite . . . . . . . . . . . . . . . 4.4.5 Interface . . . . . . . . . . . . . . . . . . . 4.4.6 Classe paramétrée / générique * . . . . . 4.4.7 Exemple de diagramme de classes avancé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 76 77 78 79 80 82 83 5 Analyse et conception, aspects dynamiques de la vue logique 5.1 Rappel : diagrammes communs à l’analyse et à la conception . . . . . 5.2 Modélisation des aspects dynamiques . . . . . . . . . . . . . . . . . . 5.2.1 Algorithme : orientations procédurale et objet . . . . . . . . . . 5.2.2 Modèle dynamique de l’analyse et de la conception . . . . . . . 5.3 Diagramme de séquence . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 Modéliser l’ordre des interactions . . . . . . . . . . . . . . . . . 5.3.2 Participant, temps et message . . . . . . . . . . . . . . . . . . . 5.3.3 Exemple de diagramme de séquence « Ouvrir un scrutin » . . . 5.3.4 Syntaxe et types de messages . . . . . . . . . . . . . . . . . . . 5.3.5 Création et suppression d’objets . . . . . . . . . . . . . . . . . 5.3.6 Fragments de séquence « ref » et « opt » . . . . . . . . . . . . 5.3.7 Fragment de séquence « loop » . . . . . . . . . . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Diagramme de communications . . . . . . . . . . . . . . . . . . . . . . 5.4.1 Modéliser les liens d’interactions . . . . . . . . . . . . . . . . . 5.4.2 Participant, lien d’interaction, message . . . . . . . . . . . . . . 5.4.3 Message conditionné, messages en séquence . . . . . . . . . . . 5.4.4 Messages emboîtés . . . . . . . . . . . . . . . . . . . . . . . . . 5.4.5 Itération de messages . . . . . . . . . . . . . . . . . . . . . . . 5.4.6 Collection et recherche dans une collection . . . . . . . . . . . . 5.4.7 Messages concurrents * . . . . . . . . . . . . . . . . . . . . . . 5.4.8 Choix entre séquence et communications* . . . . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.5 Diagramme de machine à états . . . . . . . . . . . . . . . . . . . . . . 5.5.1 Modéliser l’état des objets d’une classe . . . . . . . . . . . . . . 5.5.2 Types d’états, événement et transition . . . . . . . . . . . . . . 5.5.3 Événement, condition et action d’une transition . . . . . . . . . 5.5.4 Transition implicite . . . . . . . . . . . . . . . . . . . . . . . . 5.5.5 Exemple de diagramme de machine à états de la classe Scrutin 5.5.6 Actions liées à un état . . . . . . . . . . . . . . . . . . . . . . . 5.5.7 Éléments de méthodologie . . . . . . . . . . . . . . . . . . . . . 5.5.8 État composite * . . . . . . . . . . . . . . . . . . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 6 Conception, aspects langage et technique 6.1 Rappel des phases du cycle de développement en V . . . . . . . . . . . 6.2 Conception des classes . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Rappel du diagramme de classes de l’étude de cas Studs . . . . . . . . 6.4 Traduction des associations en attributs . . . . . . . . . . . . . . . . . 6.4.1 Règles de traduction . . . . . . . . . . . . . . . . . . . . . . . . 6.5 Traduction des agrégations . . . . . . . . . . . . . . . . . . . . . . . . 6.6 Traduction des compositions * . . . . . . . . . . . . . . . . . . . . . . 6.7 Traduction de la classe « Façade » du système . . . . . . . . . . . . . 6.8 Encapsulation : visibilité / accessibilité des attributs et des opérations 6.8.1 Encapsulation avec le concept de Visibilité . . . . . . . . . . . . 6.8.2 Notation UML . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.8.3 Cas particulier des attributs/opérations protégés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 119 120 121 122 123 124 125 126 127 128 129 130 Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 17 Introduction au langage de modélisation UML 6.9 Traduction des attributs dérivés . . . . . . . . . . . . . . 6.10 Qualification de certaines associations * . . . . . . . . . 6.11 Traduction des diagrammes d’interaction en algorithmes 6.12 Traduction des diagrammes de machine à états . . . . . 6.12.1 Quelques opérations de la classe Scrutin . . . . . 6.13 Traduction des relations de généralisation spécialisation 6.14 Traduction des classes d’association * . . . . . . . . . . . 6.15 Méthodologie : une fiche par classe . . . . . . . . . . . . QCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Conception, vues développement et physique 7.1 Diagrammes de la vue développement . . . . . . . . 7.2 Diagramme de composants . . . . . . . . . . . . . . 7.2.1 Composant, interfaces offertes et requises . . 7.2.2 Composite, port, connecteurs de délégation et 7.3 Diagramme de paquetages . . . . . . . . . . . . . . . 7.3.1 Paquetage, espace de nommage . . . . . . . . 7.3.2 Relation entre paquetages . . . . . . . . . . . 7.4 Diagramme de la vue physique . . . . . . . . . . . . 7.5 Diagramme de déploiement . . . . . . . . . . . . . . 7.5.1 Nœud et liaison de communication . . . . . . 7.5.2 Artefact et composant . . . . . . . . . . . . . 7.5.3 Dépendance entre artefacts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 132 133 134 135 136 137 138 139 . . . . . . . . . . . . . . . . . . . . . . . . d’assemblage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 141 142 143 144 145 146 147 148 149 150 151 152 8 Conclusion 153 9 Bibliographie 154 Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 18 Introduction au langage de modélisation UML ' $ Sommaire #2 1 2 3 4 5 6 7 8 9 Objectifs de ce cours de modélisation orientée objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Généralités sur la modélisation orienté objet et sur UML. . . . . . . . . . . . . . . . . . . . . . . . . . .4 Analyse, vues cas d’utilisation et processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Analyse et conception, aspects statiques de la vue logique . . . . . . . . . . . . . . . . . . . . . . . . 33 Analyse et conception, aspects dynamiques de la vue logique . . . . . . . . . . . . . . . . . . . . . 61 Conception, aspects langage et technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Conception, vues développement et physique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 & % Une organisation, grande ou petite, dépend souvent, d’une part, de la qualité de son système d’information, et d’autre part, de systèmes informatiques spécifiques à son métier. Une organisation qui sait développer ou faire développer les logiciels dont ses collaborateurs ont besoin en temps et en heure tout en restant dans les budgets fixés assure sa pérennité et son efficience. Cet aspect est stratégique et permet de se distinguer des concurrents. Pour développer des logiciels correspondant aux besoins des utilisateurs, un processus de développement compris par l’ensemble des intervenants est très utile. Dès que le logiciel à développer est non trivial et doit rendre service pendant plusieurs années, toute partie du logiciel doit être utile (pour éviter de maintenir du code qui ne sert à rien), et doit être comprise par les différentes équipes de développement qui produisent les différentes versions d’année en année et par les utilisateurs nouveaux qui arrivent au fil des années. Pour toutes ces raisons, un modèle du système informatique, comprenant un modèle de la partie logicielle, est nécessaire. Dans ce cours de modélisation orientée objet, les deux premières sections explicitent les objectifs du cours, puis introduisent le choix de la notation UML. Les sections qui suivent abordent tour à tour les phases de modélisation (analyse et conception) ainsi que les aspects les plus importants de la modélisation d’un système logiciel (aspects statiques, dynamiques, développement, et déploiement). NB : les diapositives dont le titre se termine par le caractère « * » correspondent à un contenu non directement étudié dans le module. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 19 Introduction au langage de modélisation UML ' $ 1 Objectifs de ce cours de modélisation orientée objet Introduire la modélisation orientée objet Introduire la modélisation à base de graphiques des systèmes informatiques Introduire la notation UML Différents types de diagrammes avec leurs notations #3 Rôles complémentaires des types de diagrammes Cohérence entre diagrammes de même type ou de types différents Présenter des éléments méthodologiques d’utilisation des différents types de diagrammes dans un processus de développement Présentation dans le cours d’une première étude de cas Mise en pratique lors des bureaux d’étude avec deux autres études de cas Évaluation de l’acquisition lors d’un examen sur table avec une quatrième étude de cas & % L’objectif de ce cours est de vous présenter les concepts de la modélisation de systèmes informatiques, c’est-à-dire des systèmes dans lesquels la partie logicielle est prépondérante. La co-conception matérielle et logicielle n’est pas abordée dans ce cours. Un modèle est une abstraction de la réalité permettant de mieux comprendre le système. Nous construisons des modèles des systèmes complexes parce qu’il est difficile, voire impossible, de maîtriser la complexité sans modélisation abstraite au delà d’une certaine taille. En outre, le choix du modèle à créer est important. Dans les modules CSC3002 et CSC3502, l’analyse structurelle de programme écrit en langage C se focalise sur les algorithmes et les flots de données structurées. Dans le module CSC4001, ce sont les entités structurées en table et les relations entre ces tables qui aident à organiser les informations du système, les requêtes permettant alors d’exprimer à l’aide de l’algèbre relationnelle les manipulations sur ces données. Dans ce module, la nouveauté est d’étudier le système logiciel selon son architecture et d’exprimer comment des entités (appelées objets par la suite) interagissent pour remplir une fonction. Un critère important de la qualité d’un modèle orienté objet est alors la cohérence entre les objets (réels) du système réel modélisé et les objets (virtuels) du modèle du système réel. La modélisation à base de graphiques est plus précise qu’une description informelle en langage naturel. C’est un premier niveau de formalisme, suffisamment léger pour être compris par le client, suffisamment formel pour pouvoir proposer une première analyse, support à l’approfondissement nécessaire ultérieur avec une notation plus formelle ou à la réalisation du logiciel dans un langage donné. Le grand intérêt de UML réside d’une part dans son orientation objet avec des notations graphiques faciles à comprendre par tout public, et d’autre part, dans sa standardisation et très grande diffusion aussi bien dans le milieu académique qu’industriel. Les modèles mathématiques utilisés pour modéliser les systèmes critiques ne sont pas étudiés dans ce cours. Ce cours introduit donc à la modélisation de systèmes informatiques orientée objet en utilisant le langage (graphique) UML. UML divise la visualisation d’un modèle en diagrammes qui correspondent à des vues différentes. Ce cours présente les différents types de diagrammes, leurs rôles complémentaires, et montre comment les diagrammes d’un modèle sont construits de manière cohérente. C’est ce qui explique que nous utilisons autant que possible la même étude de cas (le système de vote Studs) dans tout le cours. Pour ce faire, ce cours présente un processus simplifié de développement des systèmes informatiques. L’utilisation de la même étude de cas dans les différentes phases du processus de développement en facilite la compréhension. Les éléments pratiques du cours sont illustrés dans les bureaux d’étude du module avec une autre étude de cas ; c’est ce qui explique que nous utilisons la même étude de cas (la médiathèque) tout au long des bureaux d’étude et des travaux pratiques du module. Le bureau d’étude noté a pour but de valider l’acquisition de la notation UML et du processus de développement par l’étude d’une troisième étude de cas. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 20 Introduction au langage de modélisation UML ' $ 2 Généralités sur la modélisation orienté objet et sur UML #4 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 Principes de la modélisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Pourquoi et comment modéliser en orienté objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Unified Modelling Language (UML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Cinq façons de voir un système informatique : les 4+1 vues de Kruchten . . . . . . . . 10 Phases de la modélisation, cycle en V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Rôle de l’expression des besoins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Rôle de l’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Rôle de la conception. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16 & % Nous présentons dans cette section les principes de la modélisation, puis les quatre rôles du modèle d’un système (spécifier, valider, guider et documenter), et ensuite, nous justifions l’intérêt de la modélisation orientée objet, autour du concept d’objet permettant de relier le modèle au monde réel. Puis, nous introduisons UML, la notation la plus utilisée. Avant de passer à la première phase du processus de développement, nous donnons un aperçu du processus de développement avec la notation UML : les vues, les phases et les diagrammes. Ce cours UML se limite aux trois premières phases du processus de développement : l’expression des besoins (c’est-à-dire la modélisation du cahier des charges [supposé déjà rédigé]), l’analyse (l’architecture de la solution avec une vue métier) et la conception (la solution complétée de considérations technologiques comme les canevas logiciels utilisés). D’autres phases sont étudiées dans le cours de programmation orientée objet avec le langage Java qui suit ce cours de modélisation. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 21 Introduction au langage de modélisation UML 2 Généralités sur la modélisation orienté objet et sur UML ' $ 2.1 Principes de la modélisation Objectif principal de la modélisation = maîtriser la complexité Modéliser = abstraire la réalité pour mieux comprendre le système à réaliser / réalisé Le modèle doit être relié au monde réel Par exemple : l’existant avant les travaux, le réalisé, le restant à réaliser #5 Un modèle peut être exprimé avec différents niveaux d’abstraction / raffinement Par analogie : répartition électrique de l’immeuble, de la cage d’escalier, de l’appartement, de la pièce Une seule « vue » du système n’est pas suffisante Les intervenants multiples du projet informatique possèdent des préoccupations multiples I Par analogie : plan de masse, vues de face et de côté, schéma électrique, plan de plomberie, plan de calculs de construction & % Le processus de modélisation vise à obtenir une solution acceptable du système informatique. La solution finalement retenue n’est pas obtenue en une seule itération. Plusieurs étapes sont nécessaires ; ces étapes successives permettent de raffiner le niveau de détails du système à réaliser. Les premières étapes donnent une vision à très gros grains et permettent d’avancer dans la compréhension du problème. Par analogie avec un architecte qui dessine plusieurs plans pour concevoir une maison, la conception d’un système informatique est organisée dans une architecture de modélisation qui prévoit plusieurs visions du même problème pour aider à trouver une solution acceptable. La cohérence entre les différentes vues du système est importante, chaque vue ciblant des catégories différentes d’intervenants ayant des besoins différents. Lorsqu’une équipe collabore au développement d’un système informatique (de taille conséquente), trop de détails empêchent d’avoir une vue synthétique compréhensible par tous les participants (en anglais, stakeholders)1 au projet informatique, et trop peu d’informations conduit à des interprétations différentes et contradictoires. À partir d’une certaine taille et complexité, l’informatisation d’un système nécessite un processus de modélisation. Quelque soit la taille du problème, une phase de modélisation est une aide au développement du système informatique. Cependant, souvent, le nombre de personnes qui participent à la résolution du problème (clients, équipe de développement, équipe de maintenance) est un des éléments jouant fortement dans la décision de passer par une phase de modélisation. Plus le nombre de personnes est important, plus les échanges de documents sont importants. Le processus de modélisation est nécessaire pendant toute la durée de vie du projet : discussion avec les clients, analyse du système à réaliser, documentation commune entre les développeurs, etc. La pérennité de l’informatisation réalisée est un autre élément justifiant la décision de modéliser le système. En effet, le développement mais aussi la maintenance corrective et la maintenance évolutive du système bénéficient de l’existence du modèle en tant que documentation de référence. Le modèle permet donc de spécifier le système à réaliser/réalisé, de valider le modèle vis-à-vis des clients, de fournir un guide pour la construction du système pour organiser les structures de données et le comportement du système, et de documenter le système et les décisions prises. Cf. le glossaire pour la définition des termes « modèle/model », « processus de modélisation/modelling time », « élément de modèle/model element ». 1. Il est d’usage d’utiliser le singulier pour nommer collectivement les participants possédant le même rôle dans le projet. Il est plus important de nommer les rôles et non de préciser si le rôle est tenu par une personne ou par une équipe. Par conséquent, le pluriel utilisé ici à « stakeholders » indique la multiplicité des rôles. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 22 Introduction au langage de modélisation UML 2 Généralités sur la modélisation orienté objet et sur UML ' $ 2.2 Pourquoi et comment modéliser en orienté objet Relier le modèle au monde réel par la notion d’objet Orienté objet = abstraire et décomposer le système informatique en objets Le monde réel est constitué d’objets physiques ou immatériels Tracer les objets virtuels de modélisation depuis les objets du monde réel I Relier les objets (réels) du problème et les objets (virtuels) de la solution #6 Favoriser les abstractions naturelles du monde réel utilisables en modélisation I Objets vus comme des « boîtes noires » : seules les propriétés visibles de l’extérieur intéressent I Objets possédant un nom, qualifiables, classables, polymorphes, dé-/composables, interagissants avec d’autres objets, etc. Objectifs supplémentaire lors de la modélisation orientée objet Meilleure indépendance du modèle par rapport aux fonctions demandées Meilleure capacité d’adaptation et d’évolution du modèle lorsque des fonctionnalités sont modifiées ou ajoutées & % Un modèle est une abstraction d’objets1 de la réalité. C’est donc une simplification du monde réel. La problématique consiste alors à trouver le bon niveau d’abstraction et à exprimer les concepts du monde réel dans un langage assez abstrait mais aussi précis qu’un langage de programmation pour que ce langage soit interprétable par un programme informatique. Le code source d’un système logiciel est un modèle du système. Ce code source ne fournit cependant qu’un seul niveau d’abstraction, celui de la mise en œuvre sur une infrastructure matérielle particulière, compréhensible par une partie seulement des intervenants du projet informatique, les développeurs. Le processus d’informatisation consiste à définir des étapes pour aller d’un cahier des charges rédigé en langage naturel à une mise en œuvre dans un code source particulier. Le modèle du système dans les premières phases de ce processus est nécessairement une simplification du système réel. Le processus de modélisation vise à mieux cerner les limites du système à réaliser. Ensuite, les modèles sont raffinés de plus en plus pour aboutir au code. L’approche orientée objet est une façon d’aborder un problème et de le découper en petits sous-problèmes. On commence par rechercher les objets du système puis leurs interactions. Par analogie, si je m’intéresse au fonctionnement du corps humain, je décompose l’étude du problème en plusieurs sous chapitres plus simples : le cœur, le système digestif, le système nerveux, le squelette, etc. Nous avons alors une étude des différents éléments mais également une étude des interactions entre ces différents éléments. De la même façon, si j’appréhende l’informatisation d’une banque, je recherche les différents types d’objets qui font partie du système à réaliser : la banque, les clients, les comptes bancaires, les conseillers clients, les transferts, les placements, les emprunts. J’étudie ensuite les interactions entre ces différents types d’objets : par exemple, la création d’un compte bancaire nécessite des interactions entre le client et un conseiller client. Cf. le glossaire pour la définition des termes « objet/object » et « encapsulation ». 1. Terme pris ici dans son acception générale. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 23 Introduction au langage de modélisation UML 2 Généralités sur la modélisation orienté objet et sur UML ' $ 2.3 Unified Modelling Language (UML) #7 Systèmes d’informations des entreprises, Banques et services financiers, Télécommunications, Transports, Défense et aérospatiale, Calculs scientifiques, Applications réparties en réseau, services Web Internet, etc. & % L’orientation objet est un concept apparu d’abord dans les communautés de recherche sur les langages de programmation. Ainsi, le premier langage de programmation orienté objet (appelé Simula) date de la fin des années 1960, ce qui valut à ses auteurs norvégien Ole-Johan Dahl et Kristen Nygaard l’ACM Turing Award (considéré comme le prix Nobel d’informatique) en 2001. Le premier langage orienté objet qui fut reçu à la fin des années 1980 par une audience plus large et qui rassemble une communauté d’utilisateurs toujours très active est le langage Smalltalk. Depuis, sont apparus Objective C, C++, Eiffel, Java, Python, Ruby, Scala, etc. Les premières méthodes de modélisation, quant à elles, ont été élaborées à la fin des années 1980. Les trois plus célèbres s’appelaient la méthode Booch (du nom de l’auteur Grady Booch), OOSE (Object-Oriented Software Engineering) de Ivar Jacobson, et OMT (Object Modeling Technique) de James Rumbaugh. Los Tres Amigos, comme ils sont appelés dans la communauté, se sont unis dans les années 1990 pour former UML (Unified Modeling Language). Cette unification s’est opérée dans le cadre de la société Rational Software qui a été absorbée depuis par IBM. Afin de toucher une plus large audience, leurs résultats ont été standardisés ensuite par le consortium OMG (Object Management Group) en tant que la notation UML. La version actuelle de UML est disponible sur le site de l’OMG (www.omg.org). UML est la notation de modélisation la plus répandue dans le monde. La question de la pertinence du choix de UML reviendrait donc plutôt à lister les domaines d’utilisation de l’informatique qui n’utilisent pas UML, ne serait-ce que comme notation graphique pour la documentation. Cette diapositive liste certains des domaines qui se sont constitués en « task force » au sein de l’OMG. La spécification d’un système avec UML n’exclut pas bien sûr une modélisation du système avec des modèles formels (c’est-à-dire plus formels que les diagrammes graphiques de UML). Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 24 2 Généralités sur la modélisation orienté objet et sur UML ' 2.3 Unified Modelling Language (UML) $ 2.3.1 UML, un langage UML est un langage de modélisation orientée objet UML n’est pas une méthode UML a été adopté par toutes les méthodes orientées objet UML est dans le domaine public ; c’est un standard UML est un langage pour : #8 Visualiser I Chaque symbole graphique possède une sémantique Spécifier I De manière précise et complète, sans ambiguïté Construire I Une partie du code des classes peut être généré automatiquement Documenter I Les différents diagrammes, notes, contraintes, exigences sont conservés dans un document & % UML est un langage de modélisation orienté objet, c’est-à-dire que toutes les entités modélisées sont des objets ou se rapportent à des objets : par exemple, un objet possède une structure de données (avec ce qui s’appelle des « attributs ») et des comportements (avec ce qui s’appelle des « opérations »). UML n’est pas une méthode. C’est pourquoi ce cours ne se résume pas à l’acquisition des notations UML mais comprend la présentation et la mise en pratique d’une méthodologie simple. UML a été adopté par toutes les méthodes orientées objet et est devenu le standard de l’industrie. UML est un langage et possède les attributs d’un langage. Ainsi, étant graphique, UML permet de visualiser le système réalisé ; le modèle est divisé en vues sélectionnant les éléments pertinents puis en diagrammes de différents types. L’aspect graphique de UML retient le premier l’attention de ses utilisateurs. Comme pour tout langage, les éléments du langage sont définis de manière précise, complète et sans ambiguïté. Cependant, au moment de l’écriture de ce commentaire (2015), il n’existe pas de preuve formelle de la robustesse (en anglais, soundness) de UML comme un tout ; seuls les langages de certains diagrammes sont formellement prouvés. En outre, UML est outillé par des éditeurs logiciels dans des ateliers de génie logiciel (AGL) qui permettent, en plus de la modélisation, de générer le squelette du code source de certaines parties du système informatique, ce qui ajoute de l’intérêt à UML. Certains de ces ateliers permettent aussi d’effectuer la rétro-conception d’un système déjà réalisé : à partir du code, construction du modèle UML. Enfin, UML permet la documentation du système. Cette documentation est utilisée pour faciliter les échanges entre les différents intervenants dans toutes les phases du processus de développement et de maintenance du système informatique. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 25 2 Généralités sur la modélisation orienté objet et sur UML ' 2.3 Unified Modelling Language (UML) $ 2.3.2 Les 10 principaux diagrammes UML #9 & % Cette diapositive présente la liste des 10 principaux diagrammes UML étudiés dans le cours. Les principaux diagrammes qui sont présentés dans la suite du cours et utilisés en bureaux d’étude sont le diagramme de cas d’utilisation, les diagrammes d’objets et de classes, les diagrammes de séquence et de communications ainsi que le diagramme de machine à états. Les diapositives qui suivent indiquent dans quelles vues et dans quelles phases / étapes du processus de développement ces diagrammes sont construits. Voici en quelques mots une présentation du contenu de chaque type de diagramme : • cas d’utilisation : interactions entre le système et les utilisateurs (et autres systèmes externes). Il aide dans la visualisation des exigences / besoins ; • activité : séquence et parallélisme dans les activités du système ; autrement dit, modélisation des processus métier avec les échanges de données • classes : classes, types, interfaces et relations entre eux ; • objets : instances de classes définissant une configuration importante du système ; • machine à états1 : états des classes à travers leur cycle de vie (de la création / instanciation des objets à leur destruction) et les événements qui provoquent les transitions / changements d’états ; • interaction, qui se décline en deux types de diagrammes : – séquence : interactions entre des objets pour lesquelles l’ordre des interactions est important ; – communications2 : interactions entre objets pour lesquels les connexions entre objets sont importantes ; • composants : rassemblements de classes ou de composants tels que vus par l’équipe de développement pour décomposer le système en parties de logiciel gérables (du point de vue développement en gestion de projet) ; • paquetages : rassemblement d’éléments de modélisation par exemple pour les distribuer entre membres de l’équipe de développement ; • déploiement : unités d’installation, de configuration et de déploiement du produit fini sur un parc de machines. 1. Ce diagramme était appelé diagramme de transitions d’états en UML 1.x. 2. Ce diagramme était appelé diagramme de collaborations en UML 1.x. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 26 2 Généralités sur la modélisation orienté objet et sur UML 2.3 Unified Modelling Language (UML) Le langage UML possède quelques autres diagrammes que nous ne discuterons pas par manque de temps et de place : diagrammes de temps (en anglais, timing), diagrammes de vues globales d’interactions (en anglais, interaction overview) et diagrammes de structures composites. Cf. le glossaire pour la définition du terme « diagramme/diagram ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 27 Introduction au langage de modélisation UML 2 Généralités sur la modélisation orienté objet et sur UML ' $ 2.4 Cinq façons de voir un système informatique : les 4+1 vues de Kruchten # 10 & % Le modèle « 4+1 » vues, dit de Kruchten, d’un système informatique permet d’organiser la description du système en plusieurs vues complémentaires, chacune présentant le système selon un point de vue différent. L’utilisation de vues permet de traiter séparément les intérêts des divers groupes d’intervenants (architectes, utilisateurs, développeurs, chefs de projets, etc.) et ainsi de mieux séparer les préoccupations fonctionnelles (le domaine d’application ou métier ciblé par le système, par exemple la banque ou le contrôle aérien) et les préoccupations extrafonctionnelles (les propriétés techniques telles que la sûreté de fonctionnement). La figure schématise le modèle « 4+1 » vues. Ce modèle est composé de cinq vues. La vue « logique » décrit les aspects statiques et dynamiques d’un système en termes de classes, d’objets, de connexions et de communications. Elle se concentre sur l’abstraction et l’encapsulation. La vue « processus » capte les aspects de concurrence et de synchronisation, et les décompose en flux d’exécution (processus, fil d’exécution, etc.). Elle se rapporte aux objets actifs et aux interactions. La vue « développement » représente l’organisation statique des modules (exécutable, codes source, paquetages, etc.) dans l’environnement de développement. La vue « physique » décrit les différentes ressources matérielles et l’implantation logicielle tenant compte de ces ressources. Donc, elle se rapporte aux nœuds physiques d’exécution et au placement des objets sur les nœuds. La dernière vue, appelée « cas d’utilisation », se concentre sur la cohérence en présentant des scénarios d’utilisation qui mettent en œuvre les éléments des quatre premières vues. Les scénarios sont une abstraction des exigences fonctionnelles de l’application. Cette dernière vue valide en quelque sorte les autres vues et assure la cohérence globale. C’est aussi cette dernière vue qui est construite en premier, juste après l’établissement du cahier des charges, pour fixer les contours du système à réaliser avec ses fonctionnalités appelées, dans la terminologie UML, des cas d’utilisation. Cf. le glossaire pour la définition du terme « vue/view ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 28 Introduction au langage de modélisation UML 2 Généralités sur la modélisation orienté objet et sur UML ' $ 2.5 Phases de la modélisation, cycle en V # 11 & % Le schéma présente le cycle en V du développement d’un système informatique. Le cycle en V vous est déjà familier car vous l’avez rencontré pour la programmation procédurale lors du module CSC3502. Il est également utilisé en orienté objet. L’informatisation débute par l’établissement du cahier des charges avec le client suivi de l’analyse qui a pour but de modéliser le problème. Puis, la conception modélise la solution technique ; elle est suivie par la réalisation du logiciel conforme à la solution. UML est un langage graphique aisément compréhensible par le client ; le client peut donc comprendre la modélisation du problème, même s’il ne comprend pas toute la modélisation de la solution qui peut être plus « technique ». Ainsi se termine la partie gauche du cycle en V. La partie droite consiste en la vérification du logiciel construit par une série de tests et la recette par le client du produit fini. Il est important de noter que les différentes phases sont souvent réalisées par des équipes ou des personnes différentes. Par exemple, les vérifications par les tests ne sont en général pas effectuées par les mêmes personnes que celles ayant réalisées le logiciel à tester : cela renforce la confiance dans le produit fini en évitant le biais de l’auto-vérification. Le plus souvent, les différents tests sont spécifiés par les équipes qui modélisent le problème et conçoivent la solution, mais ils sont exécutés par les équipes qui opèrent les vérifications. À titre indicatif, il existe une méthodologie appelée « développement conduit par les tests » (en anglais, test-driven development) qui consiste, dans la phase d’implantation, à « écrire » les tests avant d’écrire les fonctions à tester. Par ailleurs, le code écrit est évalué qualitativement lors de ce que l’on appelle une revue de code. Dans le cadre du module CSC4002, dans les cours (UML et Java) puis lors des bureaux d’étude UML et des travaux pratiques Java, nous étudions toutes les phases allant de l’analyse à la validation avec les mêmes cas d’étude : « système de vote Studs » pour le cours et « gestion d’une médiathèque » pour les bureaux d’étude et les travaux pratiques. L’unicité du cas d’étude dans le cours puis dans les bureaux d’étude et les travaux pratiques permet de renforcer la cohérence entre les différentes séances et de montrer sur un exemple quelque peu réaliste, c’est-à-dire d’une taille non négligeable, la méthodologie. Avertissement : il est important de garder en mémoire tout au long de ce module que la méthodologie proposée n’est qu’une parmi beaucoup d’autres et que des choix différents peuvent être effectués quant à l’utilisation dans telle ou telle phase du processus de développement de tel ou tel type de diagramme. Cf. le glossaire pour la définition du terme « processus de développement/development process ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 29 Introduction au langage de modélisation UML 2 Généralités sur la modélisation orienté objet et sur UML ' $ 2.6 Rôle de l’expression des besoins Permettre une meilleure compréhension du système Comprendre et structurer les besoins du client # 12 Clarifier, filtrer et organiser les besoins, ne pas chercher l’exhaustivité Une fois identifiés et structurés, ces besoins : Définissent le contour du système à modéliser I Précisent le but à atteindre Permettent d’identifier les fonctionnalités principales du système & % Dans ce cours, nous supposons que le client vient vous voir avec un cahier des charges du système à réaliser. Bien sûr, il existe des méthodologies d’établissement de cahiers des charges. Ces problématiques et les phases correspondantes qui se situent en amont de l’établissement du cahier des charges du système, comme par exemple le positionnement du système dans un ensemble plus vaste de systèmes de systèmes (activité appelée « urbanisation »), sont étudiées notamment dans les voies d’approfondissement DSI (« Intégration et Déploiement de Systèmes d’Information ») et ISI (« Ingénierie des Systèmes d’Information »). Cf. le glossaire pour la définition du terme « exigence/requirement ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 30 2 Généralités sur la modélisation orienté objet et sur UML ' 2.6 Rôle de l’expression des besoins $ 2.6.1 Exemple de cahier des charges : Studs Studs : Application d’aide à la planification de réunions et à la prise de décision. L’objectif est de permettre d’exprimer des préférences parmi plusieurs choix. Les choix sont de deux types : (1) des plages horaires (dates avec heures de début et de fin) et (2) des votes concernant une liste de choix. # 13 L’organisatrice, crée un scrutin, renseigne les plages horaires possibles (type 1) et ajoute les participants à la réunion. Les participants peuvent exprimer dans un bulletin leurs préférences en indiquant pour chaque plage horaire s’ils votent « pour » (ils sont disponibles et annoncent leur intention de participer) ou « contre ». L’organisatrice récupère les résultats du scrutin à la fin du vote et annonce la plage horaire choisie. La procédure est similaire pour le type 2, c.-à-d. pour les scrutins concernant des propositions (chaînes de caractères quelconques) à choisir. & % Nous nous proposons de construire une application pour aider à la planification de réunions et à la prise de décision, appelée Studs, très simple, permettant d’exprimer des préférences parmi plusieurs choix. Les choix sont de deux types : (1) des plages horaires (date avec heures de début et de fin) et (2) des propositions sous forme de chaînes de caractères quelconques. Le premier type de scrutin est utilisé par une personne qui désire organiser une réunion. Cette personne, dite l’organisatrice, crée un scrutin, renseigne les plages horaires possibles, et ajoute les participants à la réunion. Ensuite, les participants peuvent exprimer dans un bulletin leurs préférences en indiquant pour chaque plage horaire s’ils votent « pour » (ils sont disponibles et annoncent leur intention de participer) ou « contre ». Enfin, l’organisatrice récupère les résultats du scrutin à la fin du vote et annonce la plage horaire choisie (par exemple, en maximisant le nombre de participants à la réunion). La décision n’est pas prise automatiquement par Studs, mais « manuellement » par l’organisatrice. Le second type de scrutin est utilisé par une personne qui désire consulter avant de prendre une décision. Cette personne, aussi appelée l’organisatrice, crée un scrutin, renseigne les différentes réponses possibles à la question posée, et ajoute les participants à la consultation. Ensuite, les participants peuvent exprimer dans un bulletin leurs préférences en indiquant pour chaque réponse s’ils votent « pour » ou « contre ». Enfin, l’organisatrice récupère les résultats du scrutin et annonce la décision prise (par exemple, en maximisant le nombre de vote « pour »). Là encore, la décision n’est pas prise automatiquement par Studs, mais l’organisatrice prend la décision en fonction des résultats fournis par Studs. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 31 2 Généralités sur la modélisation orienté objet et sur UML ' 2.6 Rôle de l’expression des besoins $ 2.6.2 Règles de gestion et contraintes de l’application Studs Toutes les personnes peuvent être organisatrices. L’organisatrice est de facto une participante au scrutin. Seule l’organisatrice est autorisée à gérer un scrutin. Seuls les participants enregistrés peuvent participer au scrutin et consulter les résultats. # 14 Pour que les participants puissent voter, il faut que le scrutin soit ouvert (dateDuJour ≥ dateDebutScrutin). La durée d’ouverture du scrutin est limitée. L’organisatrice doit indiquer la date de destruction automatique du scrutin. Toutes ces dates permettent de gérer de manière automatique le cycle de vie d’un scrutin. Les transitions du cycle de vie peuvent aussi être effectuées à la demande de l’organisatrice. & % Les règles de gestion et les contraintes de l’application sont les suivantes : • toutes les personnes peuvent créer des scrutins ; elles sont dans ce cas organisatrices ; • l’organisatrice est de facto une participante au scrutin ; • seule l’organisatrice est autorisée à gérer un scrutin : gestion du cycle de vie du scrutin (création, ouverture, fermeture, et destruction), ajout/retrait de participants, ajout/retrait de choix... ; • seuls les participants enregistrés comme tels par l’organisatrice peuvent participer au scrutin et consulter les résultats ; • pour que les participants puissent voter, il faut que le scrutin soit ouvert (dateDuJour ≥ dateDebutScrutin). Par ailleurs, la durée d’ouverture du scrutin est limitée. En outre, l’organisatrice qui crée le scrutin doit indiquer la date de destruction automatique du scrutin, ceci afin de libérer le système des scrutins caduques. Toutes ces dates permettent de gérer de manière automatique le cycle de vie d’un scrutin. Mais, il est aussi demandé que les transitions du cycle de vie puissent être effectuées à la demande de l’organisatrice : en d’autres termes, l’organisatrice peut ouvrir le scrutin prématurément (ce qui revient à avancer la date d’ouverture à la date du jour) ; elle peut fermer le scrutin prématurément ; et elle peut demander la destruction du scrutin avant la date de destruction indiquée lors de la création du scrutin. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 32 Introduction au langage de modélisation UML 2 Généralités sur la modélisation orienté objet et sur UML ' $ 2.7 Rôle de l’analyse Le but de l’analyse est de traduire dans un langage qui se rapproche doucement de celui des informaticiens les modèles exprimés dans l’expression des besoins Cependant, pour rester compréhensible par les clients ou utilisateurs, elle ne prend en considération que des entités du domaine (métier) # 15 Elle sert d’interface, avec l’expression des besoins, aux dialogues avec les clients et les utilisateurs L’analyse doit servir de support pour la conception, l’implantation et la maintenance Le modèle de l’analyse décrit le problème (ce que doit faire le système et comment il le fait tel que vu d’un point de vue métier) sans spécifier la solution technique (avec les canevas logiciels) Analyse = LE-QUOI & % Les deux premiers diagrammes permettant d’exprimer ce que le système doit faire (les fonctionnalités) et comment il le fait d’un point de vue métier (ce que nous appellerons les règles de gestion dans le cas d’un système d’information) sont les diagrammes de cas d’utilisation et d’activité. Cf. le glossaire pour la définition du terme « analyse/analysis ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 33 Introduction au langage de modélisation UML 2 Généralités sur la modélisation orienté objet et sur UML ' $ 2.8 Rôle de la conception Le but de la conception est de fixer les choix techniques et de préparer l’implantation Le modèle de la conception décrit la solution (comment le problème est résolu) # 16 Conception = LE-COMMENT La conception doit servir de support pour l’implantation et la maintenance Le plus souvent, le modèle de la conception n’est pas destiné à être compréhensible par les utilisateurs mais par les développeurs & % Les modèles produits pendant l’analyse décrivent ce que doit faire le système indépendamment de la façon dont il est ensuite réalisé. Ainsi, les trois préoccupations suivantes sont spécifiques à la conception : 1) organiser le développement du système informatique et adresser des questions comme les dépendances entre modules, la configuration, la gestion des versions, 2) distribuer physiquement les différentes parties logicielles du système et 3) définir les langages de programmation, les schémas de bases de données pour la persistance des données, etc. Les deux premières préoccupations sont modélisées dans deux vues complémentaires à la vue logique qui sont les vues développement et physique. Les éléments de la dernière préoccupation sont classiquement distribués dans les deux mêmes vues. Fixer le bon niveau d’abstraction d’un modèle ou d’un élément de modèle pour une utilisation donnée du modèle est souvent une tâche difficile. Au début de l’analyse, soyez le plus abstrait possible et n’incluez pas de considérations techniques dans les diagrammes de classes du modèle d’analyse. Un diagramme de classes du modèle d’analyse ne contient que des classes métier, c’est-à-dire des concepts pertinents dans le métier de l’application. Par exemple, un diagramme d’analyse ne se préoccupe pas de savoir si les données sont persistantes ou temporaires et si elles seraient enregistrées en base de données, et encore moins si la base de données serait une base de données relationnelle. Dans le cadre du module CSC4002, le contenu de la phase de conception consiste uniquement en les deux tâches suivantes : 1. conception détaillée des classes pour préparer leur réalisation dans le langage de programmation Java, sujet de la seconde partie du module, 2. projection de certaines classes sur des schémas de bases de données relationnelles pour assurer la persistance de leurs données. La seconde tâche n’est pas abordée dans la première partie du cours, mais tient lieu d’une séance de travaux pratiques en fin de module. Pour répondre aux autres questions qui surviennent lors de la conception, des compétences informatiques particulières sont requises dans des domaines très divers : par exemple, les applications multitiers, les applications Web 2.0, la conception et l’utilisation de système d’exploitation, les langages informatiques et leurs compilateurs, les communications inter-processus, les systèmes répartis, le parallélisme dans les grappes, les grilles de calcul et le Cloud, les intergiciels (en anglais, middleware), les ontologies, les systèmes embarqués. La plupart de ces sujets sont traités dans la voie d’approfondissement ASR (« Architecte des Services Informatiques en Réseaux »). Cf. le glossaire pour la définition du terme « conception/design ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 34 Introduction au langage de modélisation UML 2 Généralités sur la modélisation orienté objet et sur UML ' $ QCM 1. Le code source d’une application est-il un modèle de l’application ? 2. UML est-il un processus de développement ? # 17 3. Un client demandant une informatisation est-il censé comprendre les diagrammes UML ? 4. Un développeur / programmeur est-il censé comprendre les diagrammes UML ? 5. La phase d’expression des besoins est-elle étudiée dans ce module ? & Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 % 35 Introduction au langage de modélisation UML ' $ 3 Analyse, vues cas d’utilisation et processus # 18 3.1 Modèle de l’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.2 Diagrammes de cas d’utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.3 Diagrammes d’activité * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 & % L’analyse est la première phase du processus de développement d’une application. C’est le premier modèle construit à partir du cahier des charges. Les fonctionnalités sont rassemblées dans des diagrammes de cas d’utilisation. Les aspects dynamiques des cas d’utilisation sont les scénarios des processus métier d’utilisation de l’application. Les scénarios sont classiquement représentés dans des diagrammes d’activité. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 36 Introduction au langage de modélisation UML ' 3 Analyse, vues cas d’utilisation et processus $ 3.1 Modèle de l’analyse Vision de l’extérieur du système, le problème : Vue cas d’utilisation = ce que fait le système, les fonctionnalités Vue processus = ce que fait le système, les règles de gestion # 19 & % Comme suggéré par la figure, l’élément pivot du modèle du système informatique est la vue cas d’utilisation. Cette vue est la plus proche du client et des utilisateurs finaux. C’est elle que ces derniers comprennent le mieux. Elle est complétée par la vue processus qui décrit comment le système répond aux stimulus externes. Cette vue processus présente les processus métier, par exemple les règles de gestion d’un système d’information. La première vue est composée des diagrammes de cas d’utilisation alors que la seconde contient les diagrammes d’activité. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 37 Introduction au langage de modélisation UML ' 3 Analyse, vues cas d’utilisation et processus $ 3.2 Diagrammes de cas d’utilisation # 20 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Acteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Relation de généralisation spécialisation entre acteurs. . . . . . . . . . . . . . . . . . . . . . . . .23 Cas d’utilisation, lien de communication et système . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Exemple de diagramme de cas d’utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Éléments de méthodologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 & % Le premier diagramme dessiné est le diagramme de cas d’utilisation. Les cas d’utilisation sont développés par du texte dans des scénarios non représentés dans le diagramme. Les scénarios seront modélisés par des diagrammes d’activité présentés dans la section suivante. Les éléments de modèle d’un diagramme de cas d’utilisation sont les acteurs extérieurs au système contenant les cas d’utilisation. Les interactions des acteurs avec les cas d’utilisation du système sont modélisées par des liens de communication. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 38 3 Analyse, vues cas d’utilisation et processus ' 3.2 Diagrammes de cas d’utilisation $ 3.2.1 Introduction Les fonctionnalités sont modélisées par des cas d’utilisation Un diagramme de cas d’utilisation définit : Le système # 21 Les acteurs Les cas d’utilisation (fonctionnalités) Les liens entre acteurs et cas d’utilisation I Quel acteur accède à quel cas d’utilisation ? Un modèle de cas d’utilisation se définit par : Des diagrammes de cas d’utilisation Une description textuelle des scénarios d’utilisation & % Les cas d’utilisation représentent les fonctionnalités que le système doit satisfaire. Chaque cas d’utilisation peut être complété par un ensemble d’interactions successives d’une entité en dehors du système (l’utilisateur) avec le système lui-même. Les cas d’utilisation permettent : • de connaître le comportement du système sans spécifier comment ce comportement est réalisé, • de définir les limites précises du système, • de comprendre l’attente des utilisateurs et des experts du domaine. Les cas d’utilisation sont aussi des instruments de validation et d’évaluation de l’avancement du système en cours et en fin de construction. Dans la suite de cette section, nous illustrons les scénarios par des diagrammes d’activité qui précisent comment les différentes étapes des scénarios s’agencent. Il est aussi envisageable de décrire les scénarios par des diagrammes de séquence et de communications. Nous préférons les diagrammes d’activité car ils sont plus adaptés pour schématiser de manière abstraite les processus métiers. Les diagrammes de séquence et de communications sont plus adaptés à la description de la dynamique de l’intérieur des sous-systèmes, car ils montrent plus de détails. Le cas d’utilisation sert aussi à guider le processus de développement en fournissant un indicateur simple d’avancement des travaux (par exemple, 5 fonctionnalités sur les 10 incontournables sont réalisées). Il offre un indicateur simple de succès de réalisation (la validation du produit fini consiste en la validation par l’exécution de tests des fonctionnalités). Cf. le glossaire pour la définition des termes « cas d’utilisation/use case [class] » et « système/system ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 39 3 Analyse, vues cas d’utilisation et processus ' 3.2 Diagrammes de cas d’utilisation $ 3.2.2 Acteur Un acteur représente une personne, un périphérique ou un autre système qui joue un rôle (interagit) avec le système « L’organisatrice, crée un scrutin, renseigne les plages horaires possibles et ajoute les participants à la réunion. » # 22 « Les participants peuvent exprimer leurs préférences en indiquant pour chaque plage horaire s’ils votent “pour” (ils sont disponibles et annoncent leur intention de participer) ou “contre”. » & % Un acteur est une « entité » externe au système qui interagit avec le système. La notation UML de l’acteur est soit le dessin « simplifié » d’un personnage complété en dessous par un libellé soit le dessin d’un rectangle contenant le libellé du nom de l’acteur en dessous du libellé du stéréotype1 « « acteur » ». La notation graphique que nous préférons est bien sûr le dessin du personnage, plus facile à repérer dans un diagramme. Un acteur n’est pas toujours une personne, ce peut être un système externe en interaction avec le système en cours de description2 . Une attention particulière doit être attachée au nommage des acteurs. L’usage veut de choisir un substantif extrait du cahier des charges, donc proposé par le client ou l’utilisateur final. En effet, rappelons que les diagrammes de cas d’utilisation sont une modélisation directe du cahier des charges et servent au client pour vérifier que l’analyste comprend le problème du client. Il est donc important que l’équipe de développement s’adapte au client et montre qu’elle s’adapte au domaine applicatif, c’est-à-dire au métier du client. Cf. le glossaire pour la définition du terme « acteur/actor [class] ». 1. Dans le langage UML, la plupart des éléments de modélisation peuvent être annotés avec ce qui est appelé un stéréotype. Un stéréotype permet d’étendre un élément de modélisation UML. Dans cette diapositive, le rectangle modélise une classe (voir la section qui suit pour une définition du terme « classe ») représentant un acteur. 2. C’est par exemple une application B2B (business-to-business) dans laquelle le système en cours de construction s’inscrit. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 40 3 Analyse, vues cas d’utilisation et processus ' 3.2 Diagrammes de cas d’utilisation $ 3.2.3 Relation de généralisation spécialisation entre acteurs La généralisation spécialisation est aussi appelée héritage (EST-UN) « L’organisatrice participe au scrutin qu’elle gère. » I Une organisatrice est une participante # 23 & % La relation de généralisation spécialisation, aussi appelée relation d’héritage, entre deux acteurs exprime le fait que l’acteur du côté opposé à la pointe de la flèche « est une sorte de ». Il est spécialisé au sens où il peut réaliser tout ce que l’acteur plus général peut réaliser, plus d’autres fonctionnalités. Dans l’exemple, une organisatrice est « une sorte » de personne avec la capacité supplémentaire de créer ou supprimer un scrutin. L’acteur du côté de la flèche est plus général, au sens où les acteurs spécialisés peuvent, au besoin, prendre le rôle plus général de l’acteur généralisé. Dans l’exemple, une organisatrice peut prendre le rôle (être vue comme une) d’une participante et participer à un scrutin. Cf. le glossaire pour la définition du terme « généralisation spécialisation/generalisation ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 41 3 Analyse, vues cas d’utilisation et processus ' 3.2 Diagrammes de cas d’utilisation $ 3.2.4 Cas d’utilisation, lien de communication et système Un cas d’utilisation est un moyen de représenter les différentes possibilités d’un système Il correspond à une suite d’interactions entre un acteur et le système Il définit une fonctionnalité utilisable par un acteur # 24 & % Un cas d’utilisation est « quelque chose » qui fournit un résultat mesurable à un acteur du système ; le cas d’utilisation capture une fonctionnalité que le système fournit. Un cas d’utilisation décrit les exigences du système d’un point de vue strictement extérieur au système : il indique la valeur que le système apporte aux utilisateurs. Ainsi, voyant les fonctionnalités décrites, le client ou l’utilisateur peut indiquer ses priorités, par analogie aux formules classiques du cahier des charges telles que « le système doit » ou « le système devrait ». Dans la première formulation, la fonctionnalité est incontournable et doit exister dans une solution minimale au problème alors que dans la seconde cette fonctionnalité est optionnelle dans une version minimale du système. Un cas d’utilisation est donc une spécification de séquence d’actions qu’un système peut réaliser en interaction avec des acteurs extérieurs au système. Le lien de communication entre un acteur et un cas d’utilisation indique que l’acteur utilise le système par cette fonctionnalité : il en a besoin, ou autrement dit, il modifie l’état du système en « exécutant » cette fonctionnalité. Le lien de communication montre l’acteur participant au cas d’utilisation. L’élément de modélisation est appelé dans la terminologie UML une association. Quelquefois, les diagrammes de cas d’utilisation ajoutent des flèches, appelées navigabilités, aux liens de communication pour spécifier comment l’acteur est impliqué dans le cas d’utilisation : l’acteur reçoit des informations ou démarre le cas d’utilisation et fournit de l’information. Cependant, ce n’est pas le rôle premier du lien de communication ; il est donc préférable de ne pas mettre de navigabilité. Les cas d’utilisation du système sont rassemblés dans un rectangle / une boîte pour signifier plus clairement les limites entre l’intérieur et l’extérieur du système. L’équipe n’est pas « payée » pour réaliser les fonctionnalités hors du périmètre du système. D’autres relations entre cas d’utilisation existent : • «include» = réutilisation complète sans changement, • généralisation spécialisation ou héritage = spécialisation de certaines actions du cas d’utilisation d’origine, • «extend»1 = ajout de fonctionnalité facultative. 1. Sémantique très controversée, donc évitez d’utiliser «extend» Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 42 3 Analyse, vues cas d’utilisation et processus 3.2 Diagrammes de cas d’utilisation Les relations entre cas d’utilisation ont pour but de décomposer le système en fonctionnalités à granularité plus fine, suivant ainsi l’adage « diviser pour régner ». Il existe trois types de décompositions ou relations entre cas d’utilisation, les deux principales étant l’inclusion et l’héritage, la troisième (l’extension) étant d’utilisation mal aisée et déconseillée2 . La relation la plus simple à comprendre entre deux cas d’utilisation est l’inclusion notée par une dépendance stéréotypée « «include» ». L’inclusion exprime le fait qu’un cas d’utilisation comprend une séquence d’actions consécutives qu’il est possible de factoriser avec d’autres cas d’utilisation. Dans notre étude de cas Studs, la vérification des droits est similaire, à quelques paramètres près, et peut être factorisée pour la création et la participation à un scrutin. Lorsque le système modélisé atteint une certaine taille, il est important de montrer les relations d’inclusion qui définissent alors des parties du système réutilisables par d’autres parties. La relation de généralisation spécialisation ou héritage est utile pour montrer qu’un cas d’utilisation est un type spécial d’un autre : le cas d’utilisation le plus spécialisé diffère quelque peu de l’original. Le premier spécialise certaines étapes de la séquence d’actions du second en les remplaçant par des « versions » plus spécialisées. Ainsi, toutes les étapes du cas d’utilisation original doivent être exécutées, certaines étant remplacées par des « versions » plus spécialisées. Dans notre étude de cas, nous pouvons imaginer que le client demande de concevoir l’authentification comme une « brique » générique spécialisable selon les protocoles existants. Par exemple, nous spécialisons le cas d’utilisation « vérifier droits » en utilisant la méthode M1 et créons le nouveau cas d’utilisation « authentification M1 ». La relation d’extension entre cas d’utilisation est très controversée. Les concepteurs du langage UML ont voulu montrer qu’un cas d’utilisation peut réutiliser un cas d’utilisation complet, de manière similaire à l’inclusion, mais que cette réutilisation est optionnelle et dépend des conditions d’exécution. Dans l’exemple de la figure de cette diapositive, l’authentification par la méthode M1 peut être complétée de manière facultative par l’enregistrement de toutes les tentatives, y compris celles qui ont été infructueuses, dans le but d’auditer a posteriori le système ou de lancer des alertes sécurité en cas d’attaques du système lorsque des suites de tentatives infructueuses proviennent d’un même domaine d’adresse IP (attaque dite de déni de service). 2. Nous la présentons autant pour complétude que pour la déconseiller. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 43 3 Analyse, vues cas d’utilisation et processus ' 3.2 Diagrammes de cas d’utilisation $ 3.2.5 Exemple de diagramme de cas d’utilisation # 25 & % La figure de cette diapositive montre le diagramme de cas d’utilisation de l’étude de cas Studs. Dans une première itération de l’analyse, sans recul suffisant, il est risqué d’utiliser toute la panoplie des relations entre cas d’utilisation. Le premier objectif est plutôt de délimiter les contours du système en identifiant tous les acteurs, tous les cas d’utilisation, et toutes les utilisations du système, c’est-à-dire tous les liens de communication. Il est en revanche très intéressant de noter dès que possible les relations de généralisation spécialisation entre acteurs. Notez que nous ne demandons pas que vous utilisiez les relations entre cas d’utilisation dans les bureaux d’étude, donc encore moins dans le bureau d’étude noté. Il est en effet difficile d’avoir suffisamment de recul pour décomposer le système en fonctionnalités à granularité fine dans le temps qui vous est imparti lors du bureau d’étude noté. Si vous les utilisez, c’est à vos risques et périls et nous en tenons compte alors dans la notation. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 44 3 Analyse, vues cas d’utilisation et processus ' 3.2 Diagrammes de cas d’utilisation $ 3.2.6 Éléments de méthodologie # 26 Identifier les acteurs qui utilisent, gèrent et exécutent des fonctionnalités spécifiques Organiser les acteurs par relation de généralisation spécialisation si c’est pertinent Pour chaque acteur, rechercher les cas d’utilisation du système & % La première étape de l’analyse consiste à bien comprendre le système à étudier. Cela consiste à lire attentivement le cahier des charges. Cette lecture doit permettre de délimiter le système à étudier : la méthode générale consiste à retrouver les acteurs qui interagissent avec le système. Il est très important de fixer des frontières au problème. Ensuite, il faut rechercher les fonctionnalités du système par la définition de ses « cas d’utilisation ». Dans le cadre de ce cours, il s’agira de rechercher les principales fonctions attendues du système. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 45 Introduction au langage de modélisation UML ' 3 Analyse, vues cas d’utilisation et processus $ 3.3 Diagrammes d’activité * # 27 3.3.1 3.3.2 3.3.3 3.3.4 Scénarios d’un cas d’utilisation * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Actions et choix * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Concurrence * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Autres notations du diagramme d’activité * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 & % Un cas d’utilisation montre ce que fait ou doit faire le système. Un diagramme d’activité permet de spécifier comment le système accomplit les fonctionnalités demandées. Un diagramme d’activité montre les actions à un très haut niveau d’abstraction avec les interactions entre elles. Dans la pratique, les diagrammes d’activité sont bien adaptés à cette phase de l’analyse qui consiste en l’expression des processus métier comme un ensemble d’actions coordonnées pour atteindre un but. Nous présentons les diagrammes d’activité dans ce cours mais n’aurons pas le temps de les pratiquer lors des bureaux d’étude. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 46 3 Analyse, vues cas d’utilisation et processus ' 3.3 Diagrammes d’activité * $ 3.3.1 Scénarios d’un cas d’utilisation * La description d’un cas d’utilisation se fait par des scénarios qui définissent la suite logique des actions qui constituent ce cas Il est possible de définir des scénarios simples ou des scénarios plus détaillés faisant intervenir les variantes, les cas d’erreurs, etc. La description du scénario précise ce que fait l’acteur et ce que fait le système # 28 En plus de descriptions textuelles, le scénario peut être représenté en utilisant un diagramme d’activité Le diagramme d’activité permet de : Présenter « l’algorithme », c’est-à-dire les étapes de la fonctionnalité Visualiser l’aspect temporel des interactions Connaître le sens des interactions (acteur vers système ou inverse) Distinguer le cas nominal des variantes (p.ex. avec traitement des erreurs) & % La description d’un scénario peut se faire de manière simple, par un texte compréhensible par les personnes du domaine de l’application. Elle peut aussi être détaillée pour préciser les contraintes de l’acteur et celles du système, les différentes étapes ou actions avec leurs enchaînements et leurs concurrences. Cette description détaillée est dans la suite modélisée dans des diagrammes d’activité. Les diagrammes d’activité sont avec les diagrammes de cas d’utilisation les diagrammes les plus facilement compréhensibles des non-spécialistes du développement d’applications informatiques. En effet, l’aspect des diagrammes d’activité ressemble beaucoup à celui des ordinogrammes ; ils sont donc accessibles à une audience très large. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 47 3 Analyse, vues cas d’utilisation et processus ' 3.3 Diagrammes d’activité * $ 3.3.2 Actions et choix * # 29 & % Les diagrammes d’activité visualisent les étapes des cas d’utilisation et plus particulièrement les enchaînements et les branchements. Une activité débute par un nœud initial représenté par un disque noir. Cette action marque le début de l’activité et est suivi d’arêtes représentant le passage à l’action suivante. À l’autre extrémité du diagramme, le nœud terminal ou final signifiant la fin de l’activité est représenté par un disque noir entouré d’un second disque. Entre les deux extrémités, les actions importantes du scénario sont reliées entre elles de façon à montrer le flot de l’activité : les enchaînements ou séquences et la concurrence (parallélisme). Le premier type de losange est appelée une décision et simule le début d’une instruction « si-alors ». Les conditions sont appelées des gardes. Le second type de losange signifie la fusion des branches à la fin du « si-alors ». Bien sûr, une attention particulière doit être apportée aux conditions pour qu’elles soient mutuellement exclusives et complètes. Le standard UML indique que si plusieurs gardes sont valides alors une seule branche est parcourue et le choix de la branche est aléatoire. Ce comportement ne correspond que très rarement au souhait de l’auteur du diagramme. En outre, les conditions doivent être complètes pour éviter que l’activité ne soit bloquée ou gelée indéfiniment parce qu’aucune des conditions n’est valide. Par analogie avec les instructions « switch » des langages de programmation, il est ainsi judicieux de penser à ajouter une garde « sinon » représentant le chemin par défaut à emprunter si aucune des autres gardes n’est vraie. Cf. le glossaire pour la définition du terme « action ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 48 3 Analyse, vues cas d’utilisation et processus ' 3.3 Diagrammes d’activité * $ 3.3.3 Concurrence * # 30 & % Les actions qui se déroulent en même temps sont dites concurrentes. Elles sont modélisées entre deux traits épais comme des chemins parallèles, le premier de ces traits étant appelé « fork » et le second « join ». Les séquences d’actions en parallèle débutent en même temps, sont toutes exécutées, mais par définition ne finissent pas au même instant. La fin de l’action join intervient lorsque toutes les actions en parallèle se terminent ; join est donc un point de synchronisation. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 49 3 Analyse, vues cas d’utilisation et processus ' 3.3 Diagrammes d’activité * $ 3.3.4 Autres notations du diagramme d’activité * # 31 & % Le diagramme d’activité possède d’autres notations que nous citons pour information mais n’illustrons pas. Le diagramme d’activité permet d’exprimer le passage du temps avec le symbole du sablier. Il est ainsi possible de modéliser une activité qui s’exécute périodiquement en remplaçant l’action initiale par un sablier. Il est aussi possible, à partir d’une activité, d’appeler une autre activité et d’indiquer entre deux actions les informations transmises (montrant ainsi les flux d’informations en plus des flots d’actions). Les interactions entre le système et les acteurs sont modélisées sous la forme de signaux émis et reçus. Enfin, le langage UML fournit d’autres notations que nous ne montrons pas : la fin d’un chemin, le partitionnement, les connecteurs, les expansion regions. Pour plus d’information, nous invitons les curieux à se référer à la bibliographie ou directement au standard. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 50 Introduction au langage de modélisation UML ' 3 Analyse, vues cas d’utilisation et processus $ QCM 1. Dans un diagramme de cas d’utilisation, est-il pertinent d’ajouter des cas d’utilisation ne faisant pas partie du système ? 2. Quelles entités peuvent être dessinées dans un diagramme de cas d’utilisation ? # 32 (a) système (b) action (c) acteur (d) généralisation spécialisation 3. Dans une généralisation spécialisation entre acteurs, l’acteur spécialisé a-t-il accès à toutes les fonctionnalités de l’acteur généralisé ? & Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 % 51 Introduction au langage de modélisation UML ' $ 4 Analyse et conception, aspects statiques de la vue logique # 33 4.1 4.2 4.3 4.4 Diagrammes communs à l’analyse et à la conception . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Diagramme de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Diagramme d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Concepts avancés du diagramme de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 & % Après l’élection des besoins exprimés sous la forme de fonctionnalités modélisées comme des cas d’utilisation et sous la forme de scénarios modélisés dans des diagrammes d’activité, nous pouvons modéliser la structure logique du système, c’est-à-dire les aspects statiques du système. Cette modélisation est en grande partie effectuée dans des diagrammes de classes, avec éventuellement des diagrammes d’objets montrant des configurations spécifiques du système dans des conditions particulières. Le contenu principal de cette section est donc la présentation des éléments de modélisation du diagramme de classes. Avant d’introduire les diagrammes de classes et d’objets, et puisque ces deux diagrammes sont aussi utilisés pendant la phase suivant l’analyse, c’est-à-dire pendant la conception, nous expliquons en quelques mots les différences entre ces deux phases. La présentation du diagramme de classes est effectuée en deux parties : les concepts de base et les concepts avancés. Pendant les bureaux d’étude et pendant le bureau d’étude noté, les solutions que vous concevez n’ont pas besoin d’utiliser les concepts avancés qui demandent plus de recul pour être mis en œuvre. Souvent, ces concepts sont introduits dans les diagrammes de classes après la première itération. Or, vous n’avez pas le temps de faire plus d’une itération dans tous les cas. Cependant, à la fin du premier bureau d’étude, nous présentons une seconde version du corrigé type utilisant une bonne partie de la panoplie des concepts avancés du diagramme de classes. C’est cette version qui ensuite sert de base aux autres bureaux d’étude et aux travaux pratiques. Ainsi, vous aurez l’occasion de manipuler les concepts avancés dès la modélisation. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 52 Introduction au langage de modélisation UML 4 Analyse et conception, aspects statiques de la vue logique ' $ 4.1 Diagrammes communs à l’analyse et à la conception Vue logique Aspects statiques = structure du problème et de la solution I Diagrammes de classes et d’objets Aspects dynamiques = comportement des éléments de la structure I Diagrammes de séquence, de communications et de machine à états # 34 & % La conception est une phase charnière entre la spécification du problème et l’implantation de la solution. Il est donc important de garder la trace des décisions de conception : telle exigence extraite du cahier des charges et spécifiée dans l’analyse est traduite par tels et tels éléments du modèle de conception. C’est une des raisons qui explique que certains diagrammes sont utilisés dans le modèle de l’analyse et dans celui de la conception, la conception consistant à compléter ou raffiner le modèle de l’analyse avec des éléments techniques, par exemple comment rendre l’application accessible par un service Web sur l’intranet de l’entreprise. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 53 Introduction au langage de modélisation UML 4 Analyse et conception, aspects statiques de la vue logique ' $ 4.2 Diagramme de classes # 35 4.2.1 Modéliser la structure logique du système dans un diagramme de classes . . . . . . 36 4.2.2 Classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.2.3 Instanciation : création d’un objet d’une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.2.4 Attributs et opérations de classe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39 4.2.5 Attribut dérivé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.2.6 Association entre classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.2.7 Nom de rôle et multiplicité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.2.8 Généralisation spécialisation ou héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.2.9 Généralisation spécialisation : vision ensembliste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.2.10 Généralisation spécialisation : vision encapsulation. . . . . . . . . . . . . . . . . . . . . . . . . . .45 4.2.11 Généralisation et redéfinition d’opérations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.2.12 Méthode Polymorphique et liaison dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.2.13 Agrégation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.2.14 Exemple de diagramme de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.2.15 Éléments de méthodologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 & % Les diapositives qui suivent sont très importantes pour comprendre les concepts de base de l’orientation objet. Autant les autres types de diagrammes peuvent être spécifiques à la modélisation et ne pas trouver de correspondance dans les langages de programmation orientés objet, autant tous les concepts présentés dans cette section, d’une part, trouvent une correspondance dans les langages de programmation orientés objet comme Java, et d’autre part, sont importants pour comprendre la philosophie de l’orientation objet. Les principes de base présentés dans cette section sont complétés par la suite avec des concepts un peu plus avancés. Le diagramme de classes décrit les classes et les relations entre les classes. En bref, les classes possèdent des attributs et des opérations. Les relations entre classes peuvent être de différents types : l’association (binaire), la généralisation spécialisation ou héritage, l’agrégation, etc. Une association possède un sens de lecture du verbe la nommant, une navigabilité indiquant dans quel sens l’association peut être parcourue. Chaque extrémité de l’association possède un rôle spécifiant le rôle de la classe dans l’association par rapport à l’autre extrémité, ainsi qu’une multiplicité. Rappel : les diagrammes de classes construits lors des bureaux d’étude et du bureau d’étude noté n’ont pas besoin d’utiliser de concepts avancés. Cependant, tous les concepts, y compris les concepts avancés, font partie du programme du module CSC4002 et sont mis en œuvre dans les travaux pratiques. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 54 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.1 Modéliser la structure logique du système dans un diagramme de classes Diagramme au cœur de l’analyse et de la conception orientées objet Abstraction Abstraire = ignorer / cacher des caractéristiques non significatives Ne garder que les caractéristiques d’une classe importantes pour l’intervenant I Analyste versus architecte ou concepteur # 36 Encapsulation comme mécanisme d’abstraction Cacher des détails en les rendant « privés » (non visibles) I Par exemple, en analyse, montrer le « quoi » qui est « public » (visible) Puis, en conception, détailler en ajoutant les éléments pour le « comment » =⇒ Protège l’analyse des changements effectués lors de la conception dans la partie « privée » en ne remettant pas en cause ce qui est exposé « publiquement » au niveau métier F Par exemple, l’analyse spécifie que tel élément est un ensemble La conception précise que c’est une liste doublement chaînée & % Les éléments de base de la structure logique du système sont les classes. La définition d’une classe contient les détails d’un élément de cette structure qui sont importants pour l’intervenant (analyste versus architecte ou concepteur) et le système modélisé. Retirer des détails non significatifs à une étape donnée du développement s’appelle l’abstraction. Les diagrammes de classes de l’analyse sont plus abstraits que les mêmes diagrammes repris et raffinés lors de la conception. Très liée au concept d’abstraction, l’encapsulation est une particularité de l’orientation objet. L’encapsulation permet à chaque élément structurel de base, c’est-à-dire à chaque classe, de cacher des détails, soit des données contenues dans l’élément soit des actions possibles sur l’élément. Nous verrons ainsi qu’une classe peut n’exposer que certaines de ses caractéristiques. L’encapsulation est très importante car elle permet de passer de manière gracieuse de l’analyse à la conception en exposant tout d’abord les caractéristiques pertinentes pour le métier de l’application (le « quoi ») et ensuite en montrant aux développeurs des caractéristiques particulières donnant les indications sur le « comment ». Cela protège l’analyse des changements effectués lors de la conception dans la partie « privée » en ne remettant pas en cause ce qui est exposé « publiquement » au niveau métier. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 55 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.2 Classe Classe = famille d’objets ayant les mêmes caractéristiques et le même comportement Attributs = caractéristiques (données membres, informations, propriétés) Opérations = comportement (méthodes, fonctions, procédures, messages, services) # 37 & % Les classes décrivent les différents types d’objets1 que le système possède. Une classe est un type de quelque chose. Vous pouvez penser à une classe comme à un modèle (au sens patron) à partir duquel les instances ou objets2 conformes au type défini par la classe sont créés. La description de la classe inclut deux catégories d’informations : l’état définissant les informations que les objets de la classe contiennent et le comportement que les objets de la classe autorisent (au sens « services » qu’ils rendent). La conjonction de l’état et du comportement caractérise l’orientation objet par rapport aux autres approches en génie logiciel, par exemple qui séparent les données des traitements. Ainsi, en orienté objet, le comportement d’un objet d’une classe définit les transformations sur l’état de l’objet de la classe. Une classe peut être vue comme une structure de données appariée avec des procédures utilisant la structure. L’état d’un objet d’une classe est défini par un ensemble d’attributs et le comportement de l’objet par un ensemble d’opérations3 sur ses attributs. Un attribut est une information portée par un objet. Par convention, le nom d’un attribut commence par une lettre minuscule. Une opération spécifie une transformation de l’état de l’objet. Elle possède un nom (par convention, commençant par une lettre minuscule), une éventuelle liste de paramètres et un éventuel type de retour. Par conséquent, une classe rassemble la spécification d’objets possédant les mêmes attributs et les mêmes opérations. Grâce aux mécanismes d’encapsulation, lors de l’analyse, les premiers attributs et les premières opérations sont spécifiés. D’autres attributs et d’autres opérations peuvent être ajoutés par la suite lors de la conception (pour prendre en compte une préoccupation technique comme la persistance), voire lors de l’implantation (pour par exemple optimiser un comportement). La notation UML autorise à représenter une classe uniquement avec son nom, ou avec son nom et ses attributs, ou avec son nom et ses opérations, ou encore avec les trois caractéristiques. Lorsque des attributs ou des opérations ne sont pas présents, cela signifie que celui qui a construit le diagramme visualisé estime que les caractéristiques non représentées ne sont pas assez pertinentes dans la vue qu’il a choisi. (Il est bien sûr possible de discuter et contester les choix de l’auteur du diagramme.) Cf. le glossaire pour la définition des termes « classe/class », « attribut/attribute », et « opération/operation ». 1. Le terme « objet » est ici pris dans son acception générale. 2. Cette fois-ci, au sens orienté objet du terme. 3. Aussi appelées des méthodes dans les langages orientés objet. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 56 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.3 Instanciation : création d’un objet d’une classe Instanciation = création d’un objet à partir d’une classe Objet = instance de classe # 38 & % Un objet est une instance d’une classe. Le mécanisme qui crée des objets à partir (de la spécification) d’une classe s’appelle l’instanciation. Autrement dit, un objet est une variable conforme à un type, qui est une classe. Les opérations de l’objet utilisent les valeurs des attributs de l’objet. En outre, un objet possède une identité qui permet de le distinguer des autres objets. On accède à un objet via une référence qui pointe sur l’objet. Ainsi, dans l’instruction « Personne j ; », j est déclarée comme étant une référence sur un objet de type Personne. Cf. le glossaire pour la définition du terme « objet/object ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 57 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.4 Attributs et opérations de classe Le nombre total de participations est une caractéristique des personnes (classe), donc applicable à Julien Dupont (objet) L’opération getNbTotalParticipations() utilise la valeur de l’attribut nbTotalParticipations connue par la classe Cette opération peut être appliquée directement à la classe Personne et bien sûr aussi aux objets / instances de Personne # 39 & % Par défaut, les attributs et les opérations sont dits des attributs et des opérations d’instances. Pour un attribut, cela signifie que chaque objet possède sa propre valeur, c’est-à-dire son propre espace mémoire pour mémoriser sa valeur. Un attribut de classe est un attribut partagé par toutes les instances de la classe, c’est-àdire l’espace mémoire d’un attribut de classe est un espace partagé par toutes les instances / objets de la classe n’ayant pas leur propre espace mémoire de cet attribut de classe. Dans les diagrammes, les attributs et les opérations de classe se différencient des attributs et des opérations d’instance par le fait qu’ils sont soulignés. En outre, par déduction, les attributs de classe existent indépendamment de la présence d’instances de la classe. En conséquence, les opérations de classe peuvent aussi être appelées indépendamment de l’existence d’instances de la classe. Ainsi, on peut écrire les expressions suivantes, le point indiquant l’accès à un attribut ou à une opération (similairement aux caractères « -> » du langage C) : j.nom j.nbTotalParticipations Personne.nbTotalParticipations // cette forme est préférée car elle rend explicite // l’aspect attribut de classe j.voter() j.getNbTotalParticipations() Personne.getNbTotalParticipations() // cette forme est préférée car elle rend explicite // l’aspect opération de classe Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 58 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.5 Attribut dérivé Attribut dérivé = attribut dépendant d’autres attributs # 40 & % Dans les diagrammes de classes, il est important que les informations ne soient pas redondantes. Une forme de redondance est un attribut dérivé dont la valeur se calcule à partir des valeurs d’un ou plusieurs autres attributs. Dans ce cas, l’attribut dérivé doit être signalé en préfixant le nom de l’attribut avec une barre oblique « / » afin d’indiquer au lecteur que cet attribut est redondant. C’est une indication importante pour ceux qui implantent l’application car les attributs dérivés demandent un traitement spécial : leur valeur change à chaque fois que la valeur des attributs à partir desquels ils sont calculés change. Dans notre exemple, le traitement est même un peu plus complexe car la valeur de l’attribut « âge » évolue aussi en fonction d’un paramètre indépendant de l’application : la date du jour. Cf. le glossaire pour la définition du terme « élément dérivé/derived element ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 59 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.6 Association entre classes Association (binaire) = relation entre (deux) classes Le sens de lecture est facultatif lorsqu’il n’y a pas d’ambiguïté # 41 & % Une association est une relation entre classes qui exprime les relations entre leurs instances. Une association permet de naviguer entre classes. Une association possède un nom constitué classiquement d’un verbe conjugué (la plupart du temps au présent). Le sens de lecture permet de lire l’association en prenant le nom de la classe d’origine comme sujet, le nom de l’association comme verbe, et le nom de la classe destinatrice comme complément d’objet direct. Dans notre exemple, cela donne « une Personne organise un Scrutin ». Dans l’autre sens, il suffit souvent de mettre le verbe au passif. Dans notre cas, nous pouvons dire quelque chose comme « un Scrutin est organisé par une Personne ». Cf. le glossaire pour la définition du terme « association ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 60 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.7 Nom de rôle et multiplicité Nom de rôle = indication sur la participation de la classe à l’association Multiplicité = contrainte sur le nombre d’objets associés # 42 & % Dans les diagrammes de classes, il est possible de nommer les extrémités des associations, ce sont des noms de rôle, lorsqu’il existe un risque de confusion quant à la participation d’une classe à une association. Les noms de rôle sont donc indiqués par exemple lorsqu’ils ne sont pas évidents ou lorsque la classe participe à plusieurs associations, tout spécialement avec la même classe. Les noms de rôle sont donc une information marquant visuellement une information importante : il ne faut pas en abuser. Les associations relient des classes. Chaque extrémité d’une association possède une multiplicité ou cardinalité. La multiplicité est placée de l’autre côté de la classe utilisée comme sujet, du côté du complément d’objet direct. Dans notre exemple, une personne organise 0 ou plusieurs scrutins, et un scrutin est organisé par 1 personne. La diapositive donne les multiplicités possibles. La notation est la suivante : min..max, où • max peut être omis, auquel cas la multiplicité est exactement min ; • max peut prendre la valeur « * » qui signifie une limite non bornée (par exemple « 2..* » signifie 2 ou plus) ; • la notation « 0..* » peut être abrégée en « * » ; • la multiplicité 1 est généralement omise pour des raisons de lisibilité. Cf. le glossaire pour la définition des termes « association binaire/binary association », « rôle/role », « multiplicité/multiplicity », « cardinalité/cardinality », et « association n-aire/n-ary association ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 61 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.8 Généralisation spécialisation ou héritage Factorisation de caractéristiques (attributs et opérations) EST-UN, EST-UNE-SORTE-DE # 43 & % Le but de la généralisation est la factorisation des caractéristiques de plusieurs classes appelées classes enfants1 dans une classe appelée classe parente2 . Cette mise en commun des attributs (structures de données) et des opérations (services) est le mécanisme de réutilisation le plus important de l’orientation objet. La factorisation intervient aussi bien en définissant une partie d’état commune (attributs) qu’en extrayant les comportements communs (opérations). La classe parente rassemble donc les attributs et les opérations communes des classes initiales qui deviennent des classes enfants. La généralisation spécialisation s’appelle aussi un héritage et exprime intuitivement le fait que les classes enfants « héritent » des caractéristiques de leurs classes parentes. La généralisation exprime une relation de type « est-un » ou « est-une-sorte-de ». En outre, le terme « généralisation » exprimant la factorisation des caractéristiques communes dans la classe parente, le terme « spécialisation » exprime quant à lui le fait que les classes enfants possèdent les caractéristiques de leurs classes parentes avec la possibilité de les spécialiser soit par des ajouts soit par des redéfinitions (voir plus loin). En d’autres termes, une classe enfant possède les capacités de sa classe parente plus quelques autres. Généralisation spécialisation et sous-typage : • un objet Personne peut désigner une instance des classes Personne, Avocat, Vendeur, Enseignant, Vacataire et Permanent ; • un objet Enseignant peut désigner une instance des classes Enseignant, Vacataire et Permanent ; – il ne peut pas désigner une instance des classes Personne, Avocat et Vendeur. L’exemple présenté dans cette diapositive illustre des héritages dits « simples » dans le sens où les classes enfants ne possèdent qu’une filiation. Il est possible d’avoir de l’héritage multiple comme montré dans l’exemple du schéma qui suit. Cette possibilité n’existe pas dans tous les langages de programmation orientés objet. Nous déconseillons donc l’utilisation de l’héritage multiple en modélisation car l’équipe de développement peut choisir un langage ne proposant pas cette possibilité. Dans ce cas, le diagramme de classes doit alors être adapté, compliquant ainsi la traçabilité depuis le modèle d’analyse vers l’implantation. Le langage de programmation choisi dans ce module, en l’occurrence Java, n’autorise pas l’héritage multiple. Enfin, de façon plus intrinsèque, nous déconseillons l’utilisation de l’héritage multiple car il pose des problèmes d’interprétation. Par exemple, que fait-on lorsqu’un attribut ou une opération existe « en double » ou « triple » dans les classes parentes. Dans l’exemple qui suit, dans la classe VoitureAmphibie, comment interprète-t-on l’opération avancer() héritée de la classe parente « racine » Véhicule et ensuite spécialisée dans les classes parentes VéhiculeTerrestre et VéhiculeMarin ? 1. Ou sous-classes, ou encore classes dérivées. 2. Ou super-classe. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 62 4 Analyse et conception, aspects statiques de la vue logique 4.2 Diagramme de classes La figure qui suit montre une visualisation du concept de généralisation / spécialisation multiple. L’ensemble des objets de la classe VoitureAmphibie représente l’intersection des ensembles d’objets des deux classes parentes, VéhiculeTerrestre et VéhiculeMarin. Cf. le glossaire pour la définition des termes « généralisation spécialisation/generalisation », « héritage/inheritance », et « généralisation spécialisation multiple/multiple inheritance ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 63 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.9 Généralisation spécialisation : vision ensembliste # 44 & % La figure de cette diapositive représente de manière intuitive les liens de parenté sous la forme de relations entre ensembles : l’ensemble des Personne contient les ensembles des Avocat, des Vendeur, des Enseignant, etc. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 64 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.10 Généralisation spécialisation : vision encapsulation # 45 & % La figure de cette diapositive représente de manière intuitive l’encapsultation des données et des comportements : un objet de type Vacataire possède toutes les caractéristiques (attributs et opérations) du type Enseignant, qui contient lui-même toutes les caractéristiques (attributs et opérations) du type Personne. Cf. le glossaire pour la définition du terme « encapsulation ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 65 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.11 Généralisation et redéfinition d’opérations # 46 & % Rappelons que la déclaration d’une opération consiste en la spécification de son nom, des types de ses paramètres et de son type de retour. La définition d’une opération consiste à lui adjoindre un corps représentant un algorithme. Dans cette diapositive, une opération définie (calculerAmortissement()) dans une classe parente est redéfinie (en anglais, overriden) dans une classe enfant, c’est-à-dire que la classe enfant remplace la définition de l’opération spécifiée dans la classe parente par son propre algorithme. Dans l’exemple de la diapositive, l’algorithme de calcul de l’amortissement d’un moyen de transport tel que défini dans la classe MoyenTransport ne tient pas compte de l’infrastructure. En effet, l’amortissement d’un Camion ou d’une Voiture ne prend pas en compte celui des routes empruntées. En revanche, les analystes décident que ce calcul dans le cas d’un Tramway inclut les voix ferrées de la ligne. En conséquence, l’opération calculerAmortissement() est redéfinie (même prototype, mais corps d’opération différent) dans la classe Tramway. NB : la notion de redéfinition (en anglais, overriding) est proche mais différente de la notion de surcharge (en anglais, overloading). Une opération surcharge une autre opération, qu’elle soit déclarée (voire définie) dans la même classe ou dans une classe parente, lorsque la nouvelle opération possède le même nom que l’opération existante mais avec un prototype différent (nombre ou types des paramètres différents). Exemple de surcharge : constructeurMoyenTransport(String désignation, int vitesse, double prix) // age = 0 constructeurMoyenTransport(String désignation, int vitesse, double prix, int age) // surcharge = même nom, mais paramètres différents Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 66 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.12 Méthode Polymorphique et liaison dynamique Méthode polymorphique : Un objet d’une classe enfant peut prendre plusieurs formes I L’objet peut être utilisé partout où un objet de la classe parente est attendu F Exprimant que la classe enfant est une spécialisation de la classe parente F P.ex., void o(MoyenTransport r) accepte o(e) avec e de type Tramway Liaison dynamique ou tardive : # 47 Soient une classe P et o() une opération de P Soient e un objet d’une classe E, enfant de la classe P et o() l’opération redéfinie dans E Soit r une référence sur un objet de type P Le polymorphisme autorise à affecter à r la valeur e : r ← e Si l’opération o() est appelée sur la référence r : r.o() et s’il y a liaison dynamique (ce qui est toujours le cas en Java p.ex.) I C’est l’opération redéfinie dans la classe enfant qui est appelée soit l’opération o() redéfinie dans E & % Le prototype d’une méthode contient des déclarations de types primitifs et de références sur des objets. Ces types sont dits les types formels de la méthode. Lors de l’exécution, les types des objets passés en argument de la méthode sont appelés les types effectifs. Lorsqu’une référence d’une classe est attendue, une référence sur un objet d’une classe enfant peut être donnée. C’est le principe du polymorphisme des méthodes. La relation entre le type formel et le type effectif est donc contrainte par la relation de généralisation spécialisation. Cette substitution de type est possible lors de l’exécution puisque par définition l’objet de la classe spécialisée fait tout ce que la classe parente fait, plus des choses supplémentaires. Si cette classe spécialisée a redéfini (spécialisé) le comportement d’une opération de la classe parente, nous souhaitons que ce soit le comportement spécialisé qui soit utilisé à la place du comportement de la classe parente. C’est ce que permet la liaison dynamique, aussi appelée liaison tardive. Prenons un autre exemple avec le diagramme de classes suivant. Écrivons une opération acheterMaison() avec la définition suivante. void acheterMaison(Personne acheteur) { ... acheteur.changerAdresse(); ... } Les instructions suivantes sont toutes valides (la compilation et l’exécution ne violent pas le système de type du langage orienté objet) avec les déclarations correspondantes. En effet, tout objet d’une classe enfant peut être utilisé là où un objet de la classe parente est attendu. En outre, l’opération effectivement appelée / exécutée pour l’objet jean est celle définie dans la classe Personne car jean est une instance de cette classe. Pour l’objet pierre, c’est celle définie dans la classe enfant Avocat qui est utilisée car l’opération est redéfinie dans la classe enfant Avocat. Enfin, pour l’objet paul, l’opération choisie à l’exécution est, selon la règle de « la définition de la classe la plus spécialisée », celle de la classe Enseignant. Personne jean; Avocat pierre; Vacataire paul; Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 67 4 Analyse et conception, aspects statiques de la vue logique 4.2 Diagramme de classes acheterMaison(jean); // licite car jean est une Personne acheterMaison(pierre); // licite car pierre est d’une classe enfant de Personne acheterMaison(paul); // licite car paul est d’une classe enfant de Personne Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 68 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.13 Agrégation Agrégation = une association exprimant un couplage fort lié à une relation de subordination A-UN, EST-UNE-PARTIE-DE Elle est asymétrique du type « ensemble / élément » ou « contenant / contenu » Règles permettant de choisir une agrégation : # 48 Est-ce une partie de ? Les opérations appliquées à l’ensemble sont-elles appliquées à l’élément ? Les changements d’états sont-ils liés ? Attention : Un élément agrégé peut être lié à d’autres classes La suppression de l’ensemble n’entraîne pas celle de l’élément & % Dans les diagrammes de classes, nous sommes souvent appelés à utiliser des associations que nous nommerions contient ou appartient à. En fait, cet usage est tellement fréquent que UML a défini une notation spécifique pour ce type d’association, l’agrégation. Une agrégation exprime une relation « contenant / contenu » ou « ensemble / élément », ou encore « agrégé / agrégat ». Par analogie avec la généralisation spécialisation qui se repère par la relation « est un », l’agrégation se repère par la relation « est une partie de » ou « a un » et le couplage fort entre l’ensemble et les éléments. Par exemple, déplacer un Polygone revient à déplacer ses Points. Il est important de noter que l’agrégation autorise qu’un élément de l’ensemble appartienne à un autre ensemble. Nous verrons plus tard que ce n’est pas le cas de la composition, une relation exprimant une relation de couplage encore plus fort : un élément appartient exclusivement à un ensemble. Cf. le glossaire pour la définition du terme « agrégation/aggregation ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 69 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.14 Exemple de diagramme de classes # 49 & % Cette diapositive représente le diagramme de classes de l’étude de cas Studs. La diapositive suivante donne des éléments de méthodologie pour construire ce diagramme de classes à partir du cahier des charges. Ce diagramme de classes est le premier de l’analyse de l’étude de cas ; aucune opération n’est indiquée. Ce diagramme est ensuite raffiné en ajoutant les opérations et en complétant la liste des attributs. Comme nous le verrons dans la section suivante, cela est souvent effectué lors de l’analyse de la dynamique du système en construisant les diagrammes de machine à états, de séquence et de communications. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 70 4 Analyse et conception, aspects statiques de la vue logique ' 4.2 Diagramme de classes $ 4.2.15 Éléments de méthodologie Analysez le texte pour rechercher les noms qui sont des classes métier et les verbes qui les relient qui sont des associations Construisez un premier diagramme de classes à partir de ces noms Enrichissez ce diagramme avec les associations à l’aide des verbes obtenus Affinez le diagramme en éliminant les associations redondantes, en simplifiant le schéma dès lors qu’il respecte les spécifications de l’énoncé # 50 Ne cherchez les généralisations spécialisations que lorsque les classes sont déjà bien établies Ne cherhez les agrégations qu’à la fin Terminez cette première version du diagramme en ajoutant les multiplicités Dans une seconde itération seulement, ajoutez les attributs et les opérations Pensez à vérifier que tous les concepts métier sont présents Pensez à vérifier que vous pouvez réaliser les cas d’utilisation par parcours du graphe de classes & % La seconde étape de l’analyse consiste à analyser le texte du cahier des charges, afin d’y rechercher les différentes classes métier et leurs associations. Il est préférable de sur-spécifier le modèle d’analyse avec beaucoup de classes métier ; il sera plus facile de les regrouper plus tard que de trouver celles que nous aurions ignorées. Recherchez les noms qui correspondent le plus souvent aux classes métier, et les verbes qui les relient qui correspondent aux associations ; attention toutefois à certains verbes (comme le verbe être) qui peuvent correspondre à des attributs ou à des opérations. L’opération habituelle consiste à établir des listes exhaustives puis à les trier / sélectionner afin de ne garder que celles utiles à la résolution : suppression des classes métier trop vagues ou non pertinentes, élimination des noms ou verbes inutiles car ce peut être du bruit introduit lors de la rédaction du cahier des charges, chasse aux synonymes, etc. Une autre manière de trouver ces classes métier est de partir des cas d’utilisation : dans les descriptions des actions effectuées par les acteurs, les noms sont des classes métier et les verbes utilisés sont des associations. Remarquez que, partant d’un énoncé, cette méthode d’analyse n’est pas une fin en soi : les limites sont celles apportées par un texte ; cela nécessite un dialogue avec le « client ». Il est important de bien choisir le nom des classes métier et des associations : on retrouve en général des noms pour les classes métier et des verbes pour les associations. Nous vous conseillons de : • construire un premier diagramme de classes à partir des noms obtenus dans la phase précédente, • par étapes successives, enrichir ce diagramme avec les associations à l’aide des verbes obtenus, • affiner le diagramme en éliminant les associations redondantes en simplifiant le schéma dès lors qu’il respecte les spécifications de l’énoncé, • ne chercher les généralisations et spécialisations qu’à la fin, lorsque les classes sont déjà bien établies. Concernant les associations, recherchez les relations simples, les relations d’agrégation et les relations de généralisation spécialisation. Ensuite, trouvez la multiplicité / cardinalité de chaque association et portez-la sur le schéma si elle diffère de la valeur par défaut (« 1 »). Enfin, trouvez les attributs et les opérations des classes. À ce niveau, quelques retours en arrière sont possibles à cause d’oublis ou de mauvaises compréhensions du système. Lors de l’analyse, il s’agit des attributs ou opérations que les spécifications du problème nécessitent : ils sont liés au modèle statique. Dans la partie conception, d’autres attributs et opérations sont trouvés, comme par exemple utilisant des classes dites « techniques ». Si un nom est associé à une valeur (nombre, texte, etc.) dans le monde réel, alors il s’agit certainement d’un attribut. Dans le doute, en faire une classe métier. Un critère de validité d’un attribut est qu’il doit être simple (type/valeur) : par exemple, date, nombre, texte. Dans le cas contraire, en faire une Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 71 4 Analyse et conception, aspects statiques de la vue logique 4.2 Diagramme de classes classe métier. D’autre part, les classes métier doivent être reliées entre elles par des associations et non avec des attributs. Pour placer une opération dans une classe, recherchez la classe responsable : c’est celle qui détient toutes les informations nécessaires pour effectuer l’opération. En cas de création, cela devrait être la classe conteneur (agrégation) ou celle qui détient les valeurs d’initialisation. Concernant les opérations, le niveau de détail d’un diagramme de classes de l’analyse doit rester faible afin de ne pas empiéter sur la phase de conception. Pour valider le diagramme de classes, reprenez l’énoncé et vérifiez que toutes les spécifications demandées y sont présentes : cela consiste à vérifier que vous répondez à tous les cas d’utilisation. Dans le cas contraire, reprenez le schéma et corrigez-le. Dans certains cas, cela peut remettre énormément de choses en question. Vous devez également contrôler si des fonctionnalités nouvelles ont été ajoutées par rapport à l’énoncé. Ces nouveautés doivent rester mineures : « vous n’êtes pas payés pour faire plus que ce que demande le client ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 72 Introduction au langage de modélisation UML 4 Analyse et conception, aspects statiques de la vue logique ' $ 4.3 Diagramme d’objets Illustration des liens entre objets dans un scénario / une configuration donnée # 51 & % Un diagramme d’objets est particulièrement utile quand vous voulez décrire comment les objets dans le système « travaillent » ensemble dans un scénario donné. Un diagramme d’objets représente une configuration donnée. La notation UML de l’objet est très simple. Un objet est un rectangle avec le nom de l’objet et le nom de la classe séparés par le signe « : » et soulignés. Le nom de l’objet est facultatif : sans nom d’objet, l’objet est dit « anonyme ». Lorsque deux classes sont reliées par deux associations, le nom de l’instance d’association dessinée doit être précisée pour lever l’ambiguïté. Clairement, un diagramme d’objets doit respecter les contraintes d’un diagramme de classes : par exemple, ne pas tracer de liens entre deux objets dont les classes ne sont pas reliées dans le diagramme de classes. Cf. le glossaire pour la définition du terme « objet/object ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 73 Introduction au langage de modélisation UML 4 Analyse et conception, aspects statiques de la vue logique ' $ QCM 1. Quelles entités peuvent être dessinées dans un diagramme de classes ? (a) opération (b) acteur (c) généralisation spécialisation (d) association # 52 2. Une classe est-elle une instance d’objet ? 3. Dans un diagramme de classes, tous les attributs d’une classe doivent-ils être spécifiés ? 4. Sans multiplicité spécifiée explicitement, est-il supposé par défaut « * » ? 5. La généralisation spécialisation est-elle représentée par une relation avec un triangle blanc à une extrémité ? 6. Soit E une classe enfant de la classe parente P, tout objet de classe E peut-il être utilisé là où un objet de type P est attendu ? & Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 % 74 Introduction au langage de modélisation UML 4 Analyse et conception, aspects statiques de la vue logique ' $ 4.4 Concepts avancés du diagramme de classes # 53 4.4.1 4.4.2 4.4.3 4.4.4 4.4.5 4.4.6 4.4.7 Navigabilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Classe d’association . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Composition : agrégation forte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Classe abstraite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Classe paramétrée / générique *. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .59 Exemple de diagramme de classes avancé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 & % La séparation des concepts du diagramme de classes en deux groupes symbolise la séparation entre les concepts de base et les concepts avancés. Il est important de bien comprendre les concepts de base avant de s’aventurer à utiliser les concepts avancés. La limite entre les deux ensembles (concepts de base et concepts avancés) n’est pas tracée de manière arbitraire. Elle signifie que nous conseillons aux débutants d’utiliser les concepts avancés uniquement s’ils les maîtrisent. Cette règle est notamment valable pour le bureau d’étude noté : une première analyse et une première conception sans l’utilisation de ces concepts avancés est suffisante et une mauvaise utilisation de ces mêmes concepts est pénalisante. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 75 4 Analyse et conception, aspects statiques de la vue logique4.4 Concepts avancés du diagramme de classes ' $ 4.4.1 Navigabilité Par défaut, une association est bidirectionnelle Il est possible de réduire la portée en la rendant unidirectionnelle En général, ce choix se fait dans la phase de conception # 54 & % La navigabilité contraint le parcours du graphe de classes. Par défaut, et c’est classiquement le cas dans le modèle d’analyse, les associations sont bidirectionnelles et peuvent être parcourues dans les deux sens. Lorsque l’association est contrainte pour devenir unidirectionnelle, le sens de navigation qui reste possible est spécifié par une flèche. Par conséquent, à moins d’être sûr que la contrainte est nécessaire, il est préférable de laisser les associations bidirectionnelles. Pour être encore plus explicite, UML autorise d’alerter sur le sens de navigation interdit en dessinant une croix, en plus de la flèche. Cf. le glossaire pour la définition du terme « navigabilité/navigability ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 76 4 Analyse et conception, aspects statiques de la vue logique4.4 Concepts avancés du diagramme de classes ' $ 4.4.2 Classe d’association # 55 & % Les classes d’association sont utiles dans un modèle de la phase d’analyse lorsque vous souhaitez adjoindre des attributs à une association entre deux classes. Par exemple, avec l’exemple de la diapositive, dans une édition collaborative (à plusieurs écrivains) d’un livre, l’application d’édition collaborative propose une fonctionalité d’annotation des paragraphes avec suivi des modifications. Ainsi, un écrivain peut ajouter une note à un paragraphe, cette note indiquant par exemple que le style du paragraphe est à revoir. La note peut aussi indiquer la date et l’heure de l’annotation. Il est évident que le contenu et la date de la note ne sont des attributs ni de la classe Écrivain ni de la classe Paragraphe ; ce sont des attributs que vous souhaiteriez « mettre » sur l’association. Le concept UML de classe d’association signifie cela : les attributs contenu et date de la note sont rassemblés dans une nouvelle classe dite d’association. Une instance de cette classe est reliée à une instance d’Écrivain et à une instance de Paragraphe. Ce concept de classe d’association est un concept avancé et il est toujours possible de s’en passer en créant deux associations, une avec chacune des deux autres classes. Il faut alors faire attention aux multiplicités. Cette transformation de la classe d’association en une classe « normale » et en deux associations est d’ailleurs effectuée lorsque l’on passe d’un diagramme de classes de la phase d’analyse à un diagramme de classes de la phase de conception. Nous étudions cela dans la section 6. Cf. le glossaire pour la définition du terme « classe d’association/association class ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 77 4 Analyse et conception, aspects statiques de la vue logique4.4 Concepts avancés du diagramme de classes ' $ 4.4.3 Composition : agrégation forte La composition est une agrégation forte qui lie les cycles de vie entre le composé (ensemble) et les composants (éléments) Le choix entre composition et agrégation peut être pris lors de la phase de conception # 56 & % La composition est une relation plus forte que l’agrégation. Les éléments de l’ensemble « appartiennent » de manière exclusive à l’ensemble, contrairement à l’agrégation qui autorise qu’un élément appartienne à plusieurs ensembles. Par ailleurs, un élément n’existe pas sans être dans un ensemble. Ces deux règles impliquent que le cycle de vie d’un élément (de la création jusqu’à la destruction) est contraint par le cycle de vie de l’ensemble. Ainsi, dans l’exemple de la diapositive, la destruction de la voiture provoque la destruction des roues. Cet exemple interdit donc la revente ou récupération des roues de manière séparée comme dans les casses de voiture : il aurait alors fallu mettre une agrégation. En résumé, les règles obligatoires (en plus de l’association classique) pour l’agrégation sont les suivantes : • « c’est une partie de » ; • les opérations appliquées au composé concernent les composants. Par exemple, d’un point de vue métier, dans l’exemple, déplacer la voiture déplace aussi la carrosserie. Les règles supplémentaires obligatoires pour la composition sont les suivantes : • la suppression du composé entraîne la suppression des composants ; • les composants sont créés par le composé. Autant il est fréquent d’utiliser l’agrégation dans les diagrammes de classes pour éviter de multiplier les associations s’appelant « contient », autant il est dangereux de faire le choix trop tôt de la composition avec toutes ses contraintes supplémentaires. Aussi, c’est bien lors de la conception que ce type de décision intervient. Dans tous les cas, lors des premières itérations d’un diagramme de classes, que ce soit lors de l’analyse ou lors de la conception, nous vous conseillons d’utiliser avec beaucoup de précaution la composition et de plutôt attendre d’avoir plus de recul sur le système à spécifier et à réaliser pour choisir une composition. Cf. le glossaire pour la définition du terme « composition ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 78 4 Analyse et conception, aspects statiques de la vue logique4.4 Concepts avancés du diagramme de classes ' $ 4.4.4 Classe abstraite Un Média peut être transporté, dupliqué, affiché. Le transport et la duplication sont indépendants du type de Média (copie de fichiers). Par contre, tout Média peut être affiché et ce n’est pas la même chose pour Livre, Vidéo, Graphique ou Texte. Un Média ne peut pas définir comment il s’affiche tant qu’il ne sait pas ce qu’il est. Il n’existe pas d’instance de la classe Média. Un Média n’existe qu’en tant que Livre, Texte, Graphique ou Vidéo. # 57 & % UML permet de spécifier une classe de manière incomplète en ne définissant pas certaines opérations. Ces classes dites abstraites, n’étant pas complètement spécifiées, ne peuvent pas être instanciées. Ce sont les classes enfants qui compléteront cette spécification en définissant les opérations non encore définies. Ces classes sont appelées des classes concrètes ; toutes les classes sont par défaut complètes, c’est-à-dire avec des opérations définies. Les opérations non définies sont dites abstraites et sont écrites en italique dans les diagrammes de classes. Dès qu’une opération est abstraite, sa classe devient abstraite. Une seconde utilisation des classes abstraites est d’empêcher l’instanciation de la classe. Par exemple, dans notre étude de cas Studs, la classe Scrutin factorise les caractéristiques et les comportements communs à tous les scrutins mais nous désirons que tous les scrutins créés soient soit des ScrutinPlagesHoraires soit des ScrutinPréférences. Cela est obtenu en rendant la classe Scrutin abstraite. Dans cette seconde utilisation des classes abstraites, il est ainsi possible qu’aucune opération de la classe abstraite ne soit abstraite. Cf. le glossaire pour la définition des termes « classe abstraite/abstract class » et « classe concrète/concrete class ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 79 4 Analyse et conception, aspects statiques de la vue logique4.4 Concepts avancés du diagramme de classes ' $ 4.4.5 Interface Une interface n’est pas une classe, c’est une liste d’opérations Une interface, comme une classe abstraite, ne peut pas servir à créer un objet Une interface exprime un savoir-faire, un contrat à respecter par les classes qui « réalisent » cette interface # 58 & % Une interface permet de décrire le comportement d’une classe, c’est-à-dire un savoir-faire sous la forme d’une liste de déclarations d’opérations sans leur définition. Une interface ne peut donner lieu à aucune instance. Toutes les opérations d’une interface sont abstraites. Ainsi, une interface est équivalente à une classe abstraite, avec la particularité supplémentaire qu’une interface ne possède pas d’attribut1 . Une classe peut déclarer qu’elle « réalise » une interface, c’est-à-dire qu’elle définit un corps à toutes les opérations abstraites de l’interface. Une telle classe peut ensuite être utilisée partout où un objet respectant le contrat de l’interface est attendu. Si une classe ne réalise pas toutes les opérations abstraites de l’interface, alors cette classe est abstraite. Une classe enfant de cette dernière classe peut compléter la concrétisation en définissant les dernières opérations abstraites ; la classe enfant devient alors concrète. Le lien de réalisation qui est aussi (de manière non adéquate) appelé lien d’implantation entre une classe abstraite et une classe concrète est modélisé similairement au lien d’héritage, la différence étant le trait qui est en pointillé. Il est possible de spécifier des hiérarchies d’interfaces, ainsi que des hiérarchies impliquant des interfaces, des classes abstraites et des classes concrètes. Bien sûr, dans de telles hiérarchies, une interface ne peut pas hériter d’une classe, qu’elle soit abstraite ou concrète ; c’est toujours l’inverse, c’est-à-dire une classe abstraite ou concrète réalisant le contrat d’une interface, qui peut être dessinée. Voici dans le diagramme qui suit une autre notation UML de l’interface. Dans la suite, nous utilisons de préférence la première forme. Enfin, le schéma suivant montre l’utilisation d’une interface. Une Personne et un Polygone réalisent les opérations déclarées dans l’interface Déplaçable. 1. Cependant, dans certains langages de programmation orientés objet comme Java, les interfaces peuvent contenir des attributs qui sont alors des constantes. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 80 4 Analyse et conception, aspects statiques de la vue logique4.4 Concepts avancés du diagramme de classes Cf. le glossaire pour la définition du terme « interface ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 81 4 Analyse et conception, aspects statiques de la vue logique4.4 Concepts avancés du diagramme de classes ' $ 4.4.6 Classe paramétrée / générique * Classe paramétrée / générique = paramétrée par des types Attributs génériques = typés avec le type en paramètre Opérations génériques = arguments et / ou type de retour génériques # 59 & % Les classes paramétrées / génériques (en anglais, templates) permettent de déclarer des classes qui contiennent des comportements génériques. Vous pouvez spécifier une ou des opérations d’une classe avec des paramètres génériques et ensuite indiquer les types des paramètres avec lesquels la classe fonctionne, comme montré dans le schéma qui suit, soit dans un diagramme de classes soit dans un diagramme représentant des objets. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 82 4 Analyse et conception, aspects statiques de la vue logique4.4 Concepts avancés du diagramme de classes ' $ 4.4.7 Exemple de diagramme de classes avancé # 60 & % Voici le diagramme de classes de l’étude de cas Studs avec quelques concepts avancés utilisés de façon pertinente. Les compositions expriment le fait que les objets du système n’existe pas / plus si le système (instance de la classe Studs) n’existe plus. La navigabilité de la classe Studs vers les classes principales du diagramme est restreinte car il n’existe pas de raison pour que les objets de ces classes principales aient besoin de « remonter » vers l’objet de la classe Studs auquel ils appartiennent. Au contraire, nous verrons dans la section qui suit que toutes les opérations seront lancées et contrôlées à partir de la classe Studs. Enfin, les classes Scrutin et Choix sont abstraites car les bulletins ne sont liés qu’à des scrutins spécialisés et à des choix spécialisés. Nous ne désirons donc pas qu’il y ait des instances des classes Scrutin et Choix. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 83 Introduction au langage de modélisation UML ' $ 5 Analyse et conception, aspects dynamiques de la vue logique # 61 5.1 5.2 5.3 5.4 5.5 Rappel : diagrammes communs à l’analyse et à la conception . . . . . . . . . . . . . . . . . . . 62 Modélisation des aspects dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Diagramme de séquence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Diagramme de communications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Diagramme de machine à états . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 & % Deux objets reliés par une association peuvent échanger des messages (ou événements). Si l’association est unidirectionnelle, ces échanges sont contraints par la navigabilité : seul l’objet du côté de la flèche peut recevoir des messages en provenance de l’objet de l’autre côté de l’association. L’envoi d’un message se traduit par l’appel d’une opération dans l’objet destinataire ; la classe à laquelle il appartient doit donc offrir l’opération. Les aspects dynamiques de la vue logique représentent la collaboration entre objets pour la réalisation (de tout ou partie) d’un cas d’utilisation. L’algorithme réalisant le cas d’utilisation peut nécessiter la participation de plusieurs objets ; des cascades de messages peuvent être échangés entre ces objets. En outre, les traitements effectués par les opérations des objets impliquent des changements d’états de ces mêmes objets. Par conséquent, la modélisation des aspects dynamiques de l’analyse consiste en la connaissance des messages échangés entre les objets, de l’ordre de ces interactions, ainsi que des changements d’états significatifs des objets. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 84 Introduction au langage de modélisation UML 5 Analyse et conception, aspects dynamiques de la vue logique ' $ 5.1 Rappel : diagrammes communs à l’analyse et à la conception Vue logique Aspects statiques = structure du problème et de la solution I Diagrammes de classes et d’objets Aspects dynamiques = comportement des éléments de la structure I Diagrammes de séquence, de communications et de machine à états # 62 & % Cette diapositive montre à nouveau les cinq vues d’un système informatique. La vue concernée par cette section est à nouveau la vue logique. Cette fois-ci, ce sont les interactions entre les différentes parties du système ainsi que l’évolution de leur état qui nous intéressent. Les diagrammes construits dans cette section doivent donc être cohérents avec les diagrammes de classes et d’objets construits en étudiant les aspects statiques du système. Lors de la phase d’analyse, il est courant de revenir plusieurs fois sur les diagrammes de classes et d’objets parce que des éléments nouveaux ou des corrections s’avérant nécessaires apparaissent plus clairement en étudiant les aspects dynamiques du système. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 85 Introduction au langage de modélisation UML 5 Analyse et conception, aspects dynamiques de la vue logique ' $ 5.2 Modélisation des aspects dynamiques Points de départ : Modèles de la vue cas d’utilisation + diagrammes de classes Objectif : modéliser les algorithmes des cas d’utilisation # 63 & % Après la construction des diagrammes de cas d’utilisation et d’activité, et la construction des diagrammes de classes et d’objets, la modélisation des aspects dynamiques répond globalement à la question « comment est spécifié le comportement du système, c’est-à-dire comment sont spécifiés les algorithmes des cas d’utilisation en parcourant le graphe de classes et des objets ? » Le modèle dynamique montre donc le comportement du système et l’évolution des objets dans le temps. Il identifie les différents événements venant du monde externe et montre l’enchaînement dans le système que provoquent ces événements. Un événement est « quelque chose » qui se produit à un moment donné dans le temps et qui n’a pas de durée. Par exemple, l’utilisateur décroche son téléphone, le conducteur appuie sur un bouton. Le but du modèle dynamique est de trouver les relations temporelles et événementielles entre les objets, de montrer les interactions entre les objets, et de définir les états des objets qui déterminent la réaction face à un événement. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 86 5 Analyse et conception, aspects dynamiques de la vue logique 5.2 Modélisation des aspects dynamiques ' $ 5.2.1 Algorithme : orientations procédurale et objet # 64 & % Dans l’orientation procédurale, l’écriture d’un algorithme consiste en l’écriture d’une séquence d’instructions dans un bloc (une procédure) avec des accès aux structures de données. Dans l’orientation objet, l’écriture d’un algorithme consiste en l’écriture de plusieurs opérations réparties dans plusieurs classes, ces opérations s’appelant les unes les autres en respectant les associations entre classes. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 87 5 Analyse et conception, aspects dynamiques de la vue logique 5.2 Modélisation des aspects dynamiques ' $ 5.2.2 Modèle dynamique de l’analyse et de la conception Les différents diagrammes du modèle dynamique de l’analyse et de la conception sont : # 65 Diagramme de séquence : ordre des interactions entre objets Diagramme de communications : répartition des interactions sur les liens entre objets Diagramme de machine à états : comportement des objets selon leurs états & % Les diagrammes UML du modèle dynamique de l’analyse et de la conception sont complémentaires. Les diagrammes de séquence montrent visuellement l’ordre des interactions entre objets. Les diagrammes de communications montrent visuellement la répartition des interactions sur les liens entre objets. Ces deux premiers types de diagrammes sont duaux au sens où ils montrent presque la même vue du modèle mais avec des formes visuelles différentes et complémentaires. Les diagrammes de machine à états spécifient le comportement des objets selon leurs états. À ces trois types de diagrammes, UML ajoute deux autres types de diagrammes que nous n’étudierons pas dans ce cours : 1) le diagramme de temps spécifie précisément l’instant d’occurrence des événements dans le temps ; ce diagramme est utile car le diagramme de séquence s’intéresse à l’ordre des interactions mais ignore la mesure précise du passage du temps ; et 2) le diagramme de vues globales des interactions qui permet de rassembler dans le même diagramme des comportements différents sans leurs détails pour dessiner comme son nom l’indique une vue globale des interactions. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 88 Introduction au langage de modélisation UML 5 Analyse et conception, aspects dynamiques de la vue logique ' $ 5.3 Diagramme de séquence # 66 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 Modéliser l’ordre des interactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Participant, temps et message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Exemple de diagramme de séquence « Ouvrir un scrutin » . . . . . . . . . . . . . . . . . . . . 69 Syntaxe et types de messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Création et suppression d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Fragments de séquence « ref » et « opt » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Fragment de séquence « loop » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 & % Le diagramme de séquence, avec le diagramme de communications, sont les deux diagrammes UML les plus utilisés pour spécifier les interactions entre les différentes parties du système. Dans cette section, nous appliquons le diagramme de séquence à la modélisation des échanges (de messages) entre objets. En effet, il est important de noter que les diagrammes de séquence et de communications mettent en œuvre principalement1 des objets et non des classes. Cela permet par exemple de montrer les échanges dans des configurations différentes. Le diagramme de séquence montre l’ordre des échanges de messages et le passage du temps. C’est un diagramme dit temporel. Les principaux concepts sont les objets participants à la séquence, le temps, les messages, et la création et la suppression de participants. Comme ces diagrammes deviennent vite imposants en taille, la notion de fragment permet de les construire de façon modulaire. 1. Les classes qui participent à un diagramme de séquence sont utilisées pour leurs opérations de classe : par exemple, une classe peut proposer une opération de classe de recherche d’une instance selon des critères. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 89 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.3 Diagramme de séquence $ 5.3.1 Modéliser l’ordre des interactions # 67 Le diagramme de séquence capture l’aspect temporel des échanges entre participantsa Un diagramme de séquence spécifie le comportement d’un cas d’utilisation ou d’une partie de celui-ci a. Au sens UML du terme. & % Les diagrammes de séquence capturent l’ordre des interactions entre les différentes parties du système. En utilisant un diagramme de séquence, vous modélisez quelles interactions sont exécutées lorsque que tel cas d’utilisation est exécuté. Les forces des diagrammes de séquence sont leur simplicité et leur efficacité pour montrer l’aspect temporel (du haut vers le bas des schémas). Cf. le glossaire pour la définition du terme « interaction ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 90 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.3 Diagramme de séquence $ 5.3.2 Participant, temps et message # 68 & % Chaque participant possède une ligne de vie représentée par une ligne verticale en pointillée. Une flèche reçue par un participant modélise la réception d’un message et se traduit par l’exécution d’une opération. La durée de vie de l’opération est symbolisée par un rectangle appelé dans la notation UML une barre d’activation. Les diagrammes de séquence étant vite assez complexes à dessiner, le plus souvent les barres d’activations ne sont pas dessinées car elles sont facultatives. Cf. le glossaire pour la définition des termes « message » et « ligne de vie/object lifeline ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 91 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.3 Diagramme de séquence $ 5.3.3 Exemple de diagramme de séquence « Ouvrir un scrutin » # 69 & % Voici un diagramme de séquence très simple modélisant les interactions du cas d’utilisation « Ouvrir un scrutin », c’est-à-dire avancer la date d’ouverture du scrutin (contrairement à l’ouverture « automatique » à la date donnée lors de la création du scrutin). Remarquez que le diagramme montre des interactions entre un acteur, une classe et deux objets. L’acteur est celui qui initie la séquence. La classe est appelée pour une opération de classe. L’objet trouvé lors de l’appel à l’opération chercher est utilisé pour un appel d’opération d’instance : avancerDateOuverture. À partir de ce diagramme de séquence, nous déduisons les attributs et les opérations suivantes : • dans la classe Studs, l’opération ouvrirScrutin, • dans la classe Scrutin : – l’opération de classe chercher, – l’attribut de classe qui est une collection de références sur les scrutins, – l’opération avancerDateOuverture. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 92 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.3 Diagramme de séquence $ 5.3.4 Syntaxe et types de messages Syntaxe complète attribut = nomMessage(arguments) : type_retour I attribut peut être un attribut de l’objet appelant ou une variable locale I nom_message est une opération de l’objet appelé Synchrone : l’expéditeur est bloqué pendant le traitement # 70 Le retour d’appel est optionnel (implicite) Asynchrone : l’expéditeur continue son exécution pendant le traitement du message & % L’interaction la plus petite est l’événement. Un événement est une interaction pendant laquelle « quelque chose » arrive. Les événements sont les constituants de base des messages, aussi appelés « signaux » en automatique. Un message est constitué d’un événement d’émission chez l’appelant et d’un événement de réception chez l’appelé, et possède une signature : « attribut = nom_message(arguments) : type_retour ». attribut peut être un attribut de l’objet appelant ou une variable locale. L’opération nom_message est une opération de l’objet appelé qui retourne un objet de type type_retour qui est affecté à l’attribut de l’objet appelant ou à la variable locale. La signature du message respecte la signature de l’opération appelée. La notation UML des diagrammes de séquence n’oblige pas à renseigner tous les éléments des prototypes des messages. Ainsi, les premiers diagrammes de séquence de l’analyse indiquent par exemple uniquement les noms des opérations. Ensuite, les mêmes diagrammes sont raffinés pour y ajouter les arguments et les types de retour, puis les attributs des classes appelantes ou variables locales recevant les valeurs de retour. Un message synchrone est une invocation d’opération bloquant l’appelant jusqu’à ce que l’appelé effectue le traitement et retourne l’appel, que ce dernier contienne ou non une valeur de retour. Un retour d’appel est un message que vous pouvez représenter à la fin de la barre d’activation de l’appelé pour indiquer que le traitement est terminé et que la valeur de retour est passée à l’appelant qui peut reprendre son traitement après la fin de l’appel synchrone. Comme la barre d’activation, la représentation de l’appel de retour est optionnelle. Un message asynchrone est initié par l’appelant qui continue son exécution car il n’attend pas le retour de l’appel. L’appelant peut par exemple émettre à destination d’un même objet appelé une salve de messages asynchrones avant un message synchrone demandant le résultat de tous les traitements précédents. Cela lui permet d’effectuer aussi des traitements en parallèle, et dans cet exemple, cela diminue d’autant le nombre de messages échangés (car il n’y a qu’un seul retour d’appel). Il est important de noter qu’un message asynchrone ne possède pas de valeur de retour. Cf. le glossaire pour la définition des termes « message synchrone/synchronous message » et « message asynchrone/asynchronous message ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 93 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.3 Diagramme de séquence $ 5.3.5 Création et suppression d’objets # 71 & % Certains objets vivent pendant tout le diagramme, d’autres sont créés et/ou meurent pendant la séquence. Pour montrer qu’un participant est créé lors de la séquence, vous pouvez soit placer l’objet en haut du diagramme en y ajoutant le stéréotype «new» et utiliser un message synchrone appelant l’opération create(arguments), soit placer l’objet plus bas dans le diagramme au niveau du message synchrone de création et utiliser le stéréotype «create(arguments)» pour nommer ce message synchrone. Le message correspondant à l’opération de création d’un objet est un message particulier. L’opération est dans la suite nommée un constructeur. Notez que l’objet en question n’existe pas avant le message, c’est-à-dire avant sa création, et que l’opération utilisée ne possède pas de type de retour ; c’est une seconde particularité. Par analogie avec la création d’un objet dans un diagramme de séquence, la destruction d’un objet pendant une séquence est modélisée soit en plaçant l’objet en haut du diagramme en y ajoutant le stéréotype «delete», la destruction étant repérée par un message synchrone appelant l’opération destroy(), soit en plaçant l’objet plus bas dans le diagramme au niveau du message synchrone de suppression. Enfin, un objet est dit transitoire (en anglais, transient) lorsqu’il est créé puis détruit durant la même séquence. Le stéréotype de l’objet est alors « «transient» ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 94 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.3 Diagramme de séquence $ 5.3.6 Fragments de séquence « ref » et « opt » ref : sous-séquence détaillée dans un autre diagramme de séquence opt : sous-séquence optionnelle exécutée si condition de garde est vraie # 72 poc ≡ « pour ou contre » & % Avec les éléments exposés jusqu’à présent, la construction des diagrammes de séquence devient vite laborieuse car les diagrammes se complexifient rapidement. Pour ce faire, UML propose une notion de bloc appelé « fragment de séquence » permettant d’inclure dans un rectangle des sous-parties de diagrammes de séquence. Un fragment de séquence indique dans le cartouche situé dans le coin haut à gauche le nom de l’opérateur du fragment. Une autre raison de l’intérêt des fragments est la possibilité d’exprimer les instructions de choix, les itérations... des algorithmes classiques. Nous présentons dans cette diapositive deux premiers types de fragments de séquence. Le fragment de séquence ref permet d’inclure une sous-séquence du diagramme de séquence, la sousséquence étant décrite dans un autre diagramme de séquence. Le fragment de séquence opt présente une sous-séquence exécutée si une condition de garde est vraie. Les termes de la condition sont souvent des valeurs de retour des messages précédant dans le temps le fragment de séquence optionnel. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 95 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.3 Diagramme de séquence $ 5.3.7 Fragment de séquence « loop » loop : boucle un nombre maximum de fois tant que la condition est vraie loop(valeur initiale, maximum, condition) # 73 pv ≡ « peut voter », av ≡ « a voté » & % Le fragment de séquence loop permet d’itérer un traitement un nombre maximum de fois jusqu’à une condition qui peut faire sortir de la boucle avant que le nombre de fois maximum ne soit atteint. Nous n’en présentons pas d’exemple dans ce cours, mais il existe d’autres types de fragments de séquence : alt similaire aux « si... alors... sinon », neg pour un fragment qui ne doit pas être exécuté (utile lorsque nous désirons exprimer un test d’intégration montrant si une interaction interdite a lieu : un message d’erreur est affiché si l’interaction est parcourue), par pour effectuer en parallèle des traitements, assert pour vérifier un fonctionnement et lever des exceptions. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 96 Introduction au langage de modélisation UML 5 Analyse et conception, aspects dynamiques de la vue logique ' $ QCM 1. Quelles entités peuvent être dessinées dans un diagramme de séquence ? (a) fragment (b) instance (c) message (d) condition # 74 (e) opération 2. Un objet se distingue-t-il d’une classe parce qu’il est souligné ? 3. Pendant un message synchrone, l’expéditeur est-il bloqué en attente d’une réponse ? 4. En réponse à un message synchrone, l’appelé renvoie-t-il un seul retour d’appel ? 5. Un fragment de séquence est-il une partie optionnelle d’une séquence ? & Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 % 97 Introduction au langage de modélisation UML 5 Analyse et conception, aspects dynamiques de la vue logique ' $ 5.4 Diagramme de communications # 75 5.4.1 5.4.2 5.4.3 5.4.4 5.4.5 5.4.6 5.4.7 5.4.8 Modéliser les liens d’interactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Participant, lien d’interaction, message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Message conditionné, messages en séquence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Messages emboîtés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Itération de messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Collection et recherche dans une collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Messages concurrents * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Choix entre séquence et communications* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 & % Le diagramme de communications et le diagramme de séquence sont des diagrammes équivalents (on peut construire l’un à partir de l’autre). Le diagramme de séquence possède une approche plus temporelle et le diagramme de communication une approche plus spatiale. La dernière diapositive de cette section donne une comparaison et des critères de choix. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 98 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.4 Diagramme de communications $ 5.4.1 Modéliser les liens d’interactions # 76 Le diagramme de communications montre la structure spatiale des interactions entre participants L’attention est mise sur les liens d’interactions, qui ne sont qu’implicites dans le diagramme de séquence & % Le diagramme de communications (comme le diagramme de séquence) est un diagramme d’interactions qui représente une vue dynamique du système. Le diagramme de communications représente les interactions entre objets en mettant moins en évidence l’aspect temporel mais en faisant ressortir les relations entre objets. Ce modèle montre les différents messages qui se propagent d’un objet à l’autre : il attire l’attention de l’analyste et du concepteur sur le fait qu’un message transite sur une association, qui doit donc exister entre la classe de l’objet appelant et la classe de l’objet appelé. Comme dans les diagrammes de séquence, un objet doit avoir une méthode appropriée pour traiter chaque événement qu’il reçoit. Cf. le glossaire pour la définition du terme « interaction ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 99 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.4 Diagramme de communications $ 5.4.2 Participant, lien d’interaction, message # 77 & % Dans cette diapositive et les 3 trois suivantes, nous présentons, à travers l’exemple du cas d’utilisation « consulter les résultats d’un scrutin », la terminologie et la syntaxe du diagramme de communications. Dans le diagramme de communications, l’aspect temporel n’est pas complètement caché car chaque message est numéroté. Comme visualisé dans cette diapositive, les messages internes sont numérotés en commençant à partir de 1 à partir du premier message (en réaction au message en provenance de l’acteur s’il existe). Notez que le diagramme contient, en plus de l’objet anonyme de type Studs, la classe Personne car un appel à la méthode de classe getParticipant() de la classe Personne est utilisé pour réaliser ce cas d’utilisation. Par ailleurs, un diagramme de communications ne fait pas de distinction entre les différents types de messages. Toutes les flèches sont les mêmes. En outre, vous verrez que, comme de nombreux auteurs et dans de nombreux ateliers de génie logiciel, nous faisons souvent une entorse à la syntaxe en utilisant les liens entre objets comme des messages, c’est-à-dire en ne doublant pas les liens entre objets par des messages, comme dans le diagramme de communications qui suit. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 100 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.4 Diagramme de communications $ 5.4.3 Message conditionné, messages en séquence # 78 & % Comme montrée dans cette diapositive, l’exécution de l’envoi d’un message peut être conditionnée, par exemple par l’obtention d’une valeur de retour pertinente (ici, valeur de p non nulle) à un message précédent dans la séquence (ici, le message 1). Cette façon de faire correspond à la notion de fragment optionnel du diagramme de séquence. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 101 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.4 Diagramme de communications $ 5.4.4 Messages emboîtés # 79 & % Il y a emboîtement des messages pour marquer la relation de cause à effet (un objet ayant reçu le message 2 déclenche en réaction le message 2.1). La séquence de messages du diagramme de cette diapositive est donc : message 1 en réaction au message venant de l’acteur ; puis message 2, qui provoque le message 2.1 ; et lorsque les traitements des messages 2.1 et 2 sont terminés, envoi du message 3 puis fin de traitement dans l’objet anonyme de classe Studs. Par ailleurs, si l’opération getScrutin de la classe Scrutin avait besoin du service d’autres opérations d’autres classes, les message envoyés seraient numérotés à partir de la séquence 2.1.1, 2.1.2, etc. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 102 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.4 Diagramme de communications $ 5.4.5 Itération de messages # 80 & % La modélisation dans un diagramme de communications de ce qui correspond au fragment loop du diagramme de séquence utilise les lettres et l’étoile. Dans cette exemple, le message « 4 :*[i=1..cb.size()]afficherInfosBulletin() » exprime le parcours de la collection de bulletins cb, de l’indice 1 à l’indice correspondant à la taille (ici écrit symboliquement cb.size()), et l’appel de l’opération afficherInfosBulletin sur chaque instance de la collection. Comme indiqué dans le commentaire, à l’itération i, l’instance manipulée s’appelle b. L’étoile au début de l’expression du message 4 indique l’itération. Par convention, l’indice est souvent nommé par une lettre (ici i). Cette lettre est ensuite utilisée pour nommer l’itération en cours. Ainsi, la réaction à l’appel de l’opération afficherInfosBulletin sur chaque instance de la collection provoque les messages emboîtés 4.i.1 et 4.i.2. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 103 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.4 Diagramme de communications $ 5.4.6 Collection et recherche dans une collection # 81 & % Le diagramme de communications de cette diapositive montre deux modélisations de la recherche d’un objet dans une collection d’instances. Premièrement, la méthode de classe getParticipant suppose que la classe Personne possède un attribut de classe correspondant à la collection des instances de la classe. Ainsi, la méthode getParticipant est la méthode de recherche d’une instance particulière dans la collection. Le parcours de la collection est interne à la méthode getParticipant et n’est donc pas modélisé sur le diagramme. Deuxièmement, en utilisant une itération et une méthode d’instance, la collection de scrutins est parcourue. Cette solution suppose que l’appelant possède une collection de références sur des objets correspondant à l’appelé. Notez comment la collection d’instances est dessinée. Le scrutin correspondant à l’itération en cours est « testé » par la méthode correspondre prenant en argument l’intitulé du scrutin. Dès qu’un scrutin correspondant à l’intitulé est trouvé, l’itération est arrêtée. Même si les deux solutions sont quelque peu différentes, dans les bureaux d’étude, nous les considérerons comme sémantiquement équivalentes ; vous pouvez donc choisir la solution que vous préférez. Veuillez noter que cette problématique existe aussi dans la construction des diagrammes de séquence et que ces deux solutions sont aussi modélisables dans les diagrammes de séquence. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 104 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.4 Diagramme de communications $ 5.4.7 Messages concurrents * # 82 & % Comme montré de manière synthétique dans le diagramme de cette diapositive, il est possible d’exécuter des actions concurrentes suite à l’envoi en parallèle de plusieurs messages. Les lettres sont alors utilisées pour la numérotation : par exemple, le message 2.a est concurrent au message 2.b. La réaction au message 2.a provoque dans l’exemple l’envoi du message 2.a.1. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 105 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.4 Diagramme de communications $ 5.4.8 Choix entre séquence et communications* Les plus du diagramme de séquence : Montrer l’ordre des interactions : le premier objectif du diagramme Montrer les messages asynchrones : différents types de messages Montrer les parties optionnelles, les itérations : concept de fragments Les plus du diagramme de communications : # 83 Montrer les liens entre participants : le premier objectif du diagramme I Lien visuel direct avec le graphe des classes du diagramme de classes Montrer les participants : l’un des objectifs du diagramme Un peu plus facile à construire et à adapter : numérotation plutôt que séquencement Les deux sont équivalents pour : Montrer la signature des messages / opérations Montrer le parallélisme I Diagramme de séquence : message asynchrone et fragment par &I Diagramme de communications : numérotation des messages % Cette diapositive compare les diagrammes de séquence et de communications. Ils sont très proches, mais dans des cas particuliers et selon les interlocuteurs, le choix est important. En ce qui nous concerne, durant le module, l’utilisation que nous en ferons lors des bureaux d’étude nous permettra d’utiliser indifféremment l’un ou l’autre des types de diagrammes. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 106 Introduction au langage de modélisation UML 5 Analyse et conception, aspects dynamiques de la vue logique ' $ QCM 1. Quelles entités peuvent être dessinées dans un diagramme de communications ? (a) fragment (b) message (c) condition # 84 (d) ligne de vie (e) lien d’interaction 2. Est-ce que plusieurs messages peuvent transiter sur un même lien d’interaction ? 3. Un diagramme de séquence et un diagramme de communications peuvent-ils contenir des classes ? & Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 % 107 Introduction au langage de modélisation UML 5 Analyse et conception, aspects dynamiques de la vue logique ' $ 5.5 Diagramme de machine à états # 85 5.5.1 5.5.2 5.5.3 5.5.4 5.5.5 5.5.6 5.5.7 5.5.8 Modéliser l’état des objets d’une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Types d’états, événement et transition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Événement, condition et action d’une transition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Transition implicite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Exemple de diagramme de machine à états de la classe Scrutin . . . . . . . . . . . . . . . 90 Actions liées à un état . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 Éléments de méthodologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 État composite * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 & % Les diagrammes de séquence et de communications modélisent des interactions, c’est-à-dire des comportements de configuration d’objets. Le diagramme de machine à états permet, lui, de modéliser le comportement individuel d’un objet d’une classe. Toutes les contraintes d’une étude de cas ne peuvent pas être modélisées dans des diagrammes de séquence ou de communications. Par exemple, dans l’étude de cas Studs, comment exprimer qu’un scrutin est supprimé après la date d’expiration ? Dans le diagramme de machine à états, nous pouvons le spécifier. Un diagramme de machine à états est construit pour une classe donnée. Il montre les différents états d’un objet de la classe et les événements provoquant les transitions entre ces états, et ce depuis la création de l’objet jusqu’à sa destruction. C’est d’ailleurs le seul diagramme UML montrant explicitement le cycle de vie complet d’un objet d’une classe. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 108 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.5 Diagramme de machine à états $ 5.5.1 Modéliser l’état des objets d’une classe Certaines classes sont plus complexes et influent de manière plus importante sur le comportement général du système Il est important de décrire les événements provoquant les changements d’états des objets de ces classes # 86 Les changements d’états sont décrits dans des machines à états Une machine à états décrit les états des objets d’une classe Une machine à états par classe est spécifiée Exemple de question de l’étude de cas Studs : peut-on (déjà, encore) voter ? & % Les diagrammes d’activité et d’interactions (séquence ou communications) décrivent une partie seulement du comportement du système. En effet, certaines classes un peu plus complexes que les autres demandent que soient décrits les changements d’états des objets de ces classes. Par exemple, dans un système de gestion de traffic d’un carrefour d’une ville par feux de signalisation, il ne paraît pas concevable de ne pas modéliser les changements d’états de la classe correspondant aux feux tricolores. Ainsi, certaines fois, le comportement d’un objet possède un impact important sur les autres parties du système. Il est dans ce cas important de détailler les événements provoquant les changements d’états de ces objets. Les changements d’états sont décrits dans des machines à états. Une machine à états par classe est spécifiée. Cf. le glossaire pour la définition du terme « machine à états/state machine ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 109 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.5 Diagramme de machine à états $ 5.5.2 Types d’états, événement et transition L’état d’un objet est lié aux valeurs de ses attributs et des interactions avec les autres objets Il s’agit de ne conserver que les états significatifs La réponse d’un objet à un événement dépend de l’état de l’objet # 87 Un objet passe dans un état donné par l’événement qui modifie ses attributs, et quitte cet état par un autre événement qui les modifie à nouveau & % Un objet peut se retrouver dans une situation satisfaisant certaines conditions, ou réalisant certaines actions en réaction à des événements. Cette situation est appelée un état. Un état possède un nom et se caractérise par une certaine stabilité et une certaine durée. Les deux extrémités d’une machine à états sont déterminées par les pseudo-états initial et final. Dans l’état initial, l’objet n’existe pas encore, et dans l’état final, l’objet n’existe plus. Entre les deux, le diagramme de machine à états décrit un graphe de changements d’états : les sommets sont des états et les arcs sont des transitions. Les transitions sont franchies à la suite d’événements. La durée d’un état est l’intervalle de temps qui s’écoule entre l’événement qui fait entrer la machine à états dans cet état et l’événement qui en fait sortir. Plusieurs transitions peuvent faire entrer dans le même état et plusieurs peuvent en faire sortir. Une transition est ainsi considérée sans durée effective : autrement dit, la durée de franchissement d’une transition est très petite par rapport à la durée de présence dans un état et le franchissement d’une transition est considérée comme immédiat. Par ailleurs, les actions spécifiées sur les transitions sont dites « atomiques », c’est-à-dire qu’elles sont exécutées entièrement ou pas du tout : autrement dit, elles ne peuvent pas être interrompues. Cf. le glossaire pour la définition des termes « état/state », « transition » et « événement/event ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 110 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.5 Diagramme de machine à états $ 5.5.3 Événement, condition et action d’une transition Syntaxe complète événement[condition]/action La transition est déclenchée par un événement # 88 La transition est effectivement franchie si la condition (sur l’état de l’objet) est valide Le franchissement déclenche l’exécution de l’action de la transition Cette action est considérée comme immédiate et atomique Si plusieurs transitions sont franchissables, alors la transition effectivement franchie est choisie aléatoirement & % Si un événement est indiqué sur une transition et qu’il n’y a pas de condition, alors la transition est franchie dès que l’événement est généré par le système. Si une condition est spécifiée, alors la transition est franchie uniquement si la condition est valide. Enfin, si aucun événement n’est spécifié, alors la transition est franchie dès que la condition est valide. Dans certains cas, l’analyste et le concepteur peuvent ainsi spécifier soit un événement soit une condition, la différence entre événement et condition étant dans ces cas ténue (l’événement est la validité de la condition). Enfin, s’il existe plusieurs transitions pouvant être franchies, la transition effectivement franchie est choisie aléatoirement. Cf. le glossaire pour la définition du terme « action ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 111 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.5 Diagramme de machine à états $ 5.5.4 Transition implicite # 89 & % L’exemple de cette diapositive montre le diagramme de machines à états d’une classe Pièce d’un cas d’étude de modélisation d’une partie d’échec. Les transitions sans événement sont franchies dès que l’action à l’intérieur de l’état est terminée ; ce type de transition est appelé « transition implicite ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 112 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.5 Diagramme de machine à états $ 5.5.5 Exemple de diagramme de machine à états de la classe Scrutin # 90 & % L’exemple de cette diapositive montre le diagramme de machines à états de la classe Scrutin du cas d’étude Studs. Comme montré dans la diapositive, pour l’événement particulier de création de l’objet, nous introduisons l’état EnConstruction car nous considérons que les actions liées à l’initialisation de l’objet sont complexes. Sans cet état EnConstruction, la création est l’événement qui déclenche la transition de l’état initial vers le premier état de la classe. De la même façon, nous avons le choix entre l’insertion d’un état EnDestruction et l’interprétation de la destruction comme la transition du dernier état de la classe vers l’état terminal. Dans les bureaux d’étude, nous prendrons l’habitude de mettre en avant les événements de construction et de destruction des objets en utilisant systématiquement des états EnConstruction et EnDestruction. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 113 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.5 Diagramme de machine à états $ 5.5.6 Actions liées à un état Actions exécutées à l’entrée et à la sortie d’un état Action exécutée pendant toute la durée de présence dans l’état Action interne déclenchée par un événement # 91 & % Lors de l’entrée dans un état, l’action labellisée entry est exécutée. Par analogie, l’action labellisée exit est exécutée lors de la sortie de l’état. Ces deux premières actions sont, comme les actions des transitions, des actions immédiates et atomiques : elles sont de courtes durées et ne peuvent pas être interrompues. L’action labellisée do est exécutée pendant toute la durée de l’état, entre les deux actions précédentes. Cette action labellisée do est interruptible par un événement. Certains événements sont dits internes (à un état). Ils provoquent l’exécution d’actions mais sans changement d’état. Dans ce cas, l’action labellisée exit n’est pas exécutée. Comme montré aussi dans la diapositive, UML autorise les transitions dites « réflexives », faisant sortir d’un état avant d’y retourner. Elles provoquent la séquence d’actions suivante : après l’interruption de l’action labellisée do, exécution de l’action labellisée exit lors de la sortie de l’état, exécution de l’action spécifiée sur la transition réflexive, exécution de l’action labellisée entry lors de l’entrée dans l’état de départ, puis reprise de l’action labellisée do. Enfin, pour être exhaustif, un état peut ne pas possèder d’action labellisée do ou l’algorithme de l’action labellisée do peut se terminer sans intervention d’un événement. Dans ces cas, une transition dite « implicite » fait sortir de l’état courant sans événement particulier. Les curieux qui se posent des questions sur la conception de systèmes informatiques avec des actions atomiques, comme préconisé implicitement dans le paragraphe précédent, et ce notamment dans les systèmes dits concurrents, soit multi-activité (en anglais, multi-threaded) soit répartis, peuvent étudier les fiches programmes des modules CSC4508 « Conception et programmation des systèmes centralisés » et CSC4509 « Algorithmique et communications des applications réparties » de la VAP « Architecte de Services en Réseau ». Cf. le glossaire pour la définition du terme « action ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 114 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.5 Diagramme de machine à états $ 5.5.7 Éléments de méthodologie Seuls les états quelque peu stables sont pertinents Les attributs constants (possédant toujours la même valeur une fois que l’objet est construit) n’interviennent pas dans la recherche des états # 92 Les attributs qui changent de valeur aident souvent à déduire les états possibles Et particulièrement les attributs booléens Il est souvent intéressant d’insérer de manière systématique un état de création de l’objet (initialisation des attributs) et un état de destruction Une attention particulière est à porter sur les événements et les actions & % Il ne faut conserver que les états ayant une certaine stabilité dans le temps ou bien les états pendant lesquels de nombreuses et/ou importantes actions sont effectuées. Les états de type EnTrainDe, EnCoursDe... sont très intéressants. Par exemple, pour un scrutin, l’état ScrutinOuvert est intéressant car il se passe quelque chose : le système évolue suite à la survenue d’un événement comme un vote. Les attributs qui changent de valeur aident à déduire les états possibles, et particulièrement les attributs booléens. Les diagrammes de machine à états permettent de compléter la liste des opérations des classes du diagramme de classes avec les actions des transitions et des états. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 115 5 Analyse et conception, aspects dynamiques de la vue logique ' 5.5 Diagramme de machine à états $ 5.5.8 État composite * # 93 & % Avec UML, il est possible de spécifier des états concurrents, c’est-à-dire des objets qui dans certains états peuvent exécuter plusieurs actions concurrentes. Cela signifie que l’objet de la classe modélisée peut faire plusieurs choses à la fois. Il est ainsi possible de spécifier le comportement d’objets dits actifs qui effectuent plusieurs actions de manière concurrente. L’état composite est un concept avancé du diagramme de machine à états que nous vous conseillons de ne pas utiliser dans les bureaux d’étude de ce module. Un état composite est un état qui contient des machines à états. Chaque région contient un diagramme de machine à états. Chaque machine à états démarre et fonctionne en parallèle dès l’entrée dans l’état composite. Les machines à états des régions sont interrompues dès qu’un événement fait sortir de l’état composite. Cf. le glossaire pour la définition du terme «état composite/composite state ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 116 Introduction au langage de modélisation UML 5 Analyse et conception, aspects dynamiques de la vue logique ' $ QCM 1. Quelles entités peuvent être dessinées dans un diagramme de machine à états ? (a) fragment (b) message # 94 (c) condition (d) objet (e) état initial (f) transition 2. Une transition réflexive peut-elle provoquer la séquence d’actions « exit », « action de la transition », « entry », et « do » ? & Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 % 117 Introduction au langage de modélisation UML ' $ 6 Conception, aspects langage et technique # 95 6.1 Rappel des phases du cycle de développement en V . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 6.2 Conception des classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97 6.3 Rappel du diagramme de classes de l’étude de cas Studs . . . . . . . . . . . . . . . . . . . . . . . 98 6.4 Traduction des associations en attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 6.5 Traduction des agrégations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 6.6 Traduction des compositions * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 6.7 Traduction de la classe « Façade » du système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 6.8 Encapsulation : visibilité / accessibilité des attributs et des opérations . . . . . . . . . . 104 6.9 Traduction des attributs dérivés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 6.10 Qualification de certaines associations * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 6.11 Traduction des diagrammes d’interaction en algorithmes . . . . . . . . . . . . . . . . . . . . . 110 6.12 Traduction des diagrammes de machine à états . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 6.13 Traduction des relations de généralisation spécialisation . . . . . . . . . . . . . . . . . . . . . . 113 6.14 Traduction des classes d’association * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.15 Méthodologie : une fiche par classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 & % Lors de la conception du système, le développeur raffine les modèles de l’analyse en complétant les diagrammes. Les décisions prises lors de ce raffinement ne sont pas du même ordre que celles prises pendant l’analyse. La phase de conception contient tous les choix technologiques permettant ensuite la mise en œuvre. Dans ce cours, nous nous concentrons sur le raffinement du diagramme de classes et la constitution d’une fiche par classe rassemblant tous les attributs, avec leur visibilité, leur type et leur valeur par défaut, et toutes les opérations, avec leur prototype complet et leur algorithme. L’écriture des algorithmes, hormis l’utilisation des références, est classique, et toutes les connaissances acquises dans les cours de programmation procédurale s’appliquent (donc, revoir le cours CSC3002). Dans la suite de cette section, nous nous focalisons donc sur la conception des classes. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 118 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.1 Rappel des phases du cycle de développement en V # 96 & % Cette diapositive rappelle les phases du cycle de développement en V d’un système informatique. Cette section présente une des activités de la phase de conception : la conception des classes. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 119 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.2 Conception des classes # 97 & % La phase précédant le développement dans un langage de programmation donné (en l’occurrence Java pour le module CSC4002) consiste à définir complètement les classes, les associations, les algorithmes et les signatures des opérations, en partant des diagrammes de l’analyse. Deux activités se dégagent lors de la conception des classes. Premièrement, dans la suite de cette section, nous détaillons la traduction quelque peu automatique des diagrammes de l’analyse pour construire une fiche par classe du diagramme de classes. Par exemple, les différentes associations sont traduites en des attributs et le modèle dynamique est transposé dans le corps des opérations en définissant leur algorithme. En plus de cette traduction automatique, quelques décisions doivent être prises par exemple concernant la navigabilité des associations ou le choix entre l’agrégation et la composition. Deuxièmement, non présenté dans ce cours, des décisions de conception peuvent intervenir pour tenir compte de contraintes matérielles et logicielles : langages, base de données, processeurs, périphériques, etc. Par conséquent, la conception est une étape pendant laquelle ne peuvent intervenir que des informaticiens spécialisés dans les différentes technologies utilisées. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 120 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.3 Rappel du diagramme de classes de l’étude de cas Studs # 98 & % Nous remettons le diagramme de classes de l’étude de cas Studs pour rappel. Dans les diapositives qui suivent, nous nous intéressons plus particulièrement aux éléments suivants : • les associations de la classe Scrutin, • les agrégations et compositions de la classe Studs, • les attributs de la classe Scrutin, • les attributs dérivés de la classe Choix, • le diagramme de séquence (ou de communications) de création d’un scrutin, • le diagramme de machine à états de la classe Scrutin, • la généralisation spécialisation de la classe Scrutin, • la classe « Façade » du système Studs. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 121 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.4 Traduction des associations en attributs # 99 Concept de « référence » : À partir d’un objet Scrutin, il est possible « d’aller vers » un objet Personne et vers une collection d’objets Bulletin & % Cette diapositive présente une partie du diagramme de classes de l’étude de cas Studs. Nous nous focalisons sur la classe Scrutin et montrons les classes en association avec cette classe. L’association avec la classe Personne possède la multiplicité « 1 » (par défaut) du côté de la classe Personne. Pour la traduction de cette association, nous ajoutons un attribut dans la classe Scrutin ayant pour nom la forme nominale du nom de l’association (organisateur) et pour type une référence sur la classe à l’autre extrémité (@Personne). Quant à l’agrégation vers la classe Bulletin, la multiplicité est traduite par une collection (Collection @Bulletin). Pour l’exercice, nous souhaitons ordonner la collection. Cette décision est typiquement une décision de conception. Elle n’est pas anodine. En effet, nous devons dans ce cas indiquer quels sont les attributs participant à l’établissement de l’ordre total de tous les objets de classe Bulletin1 : référence vers la personne + référence vers le scrutin. 1. Ces attributs seront utilisés dans la programmation de la méthode hashCode() en Java et dans la constitution de la clef primaire pour la table de même nom dans la base de données. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 122 6 Conception, aspects langage et technique ' 6.4 Traduction des associations en attributs $ 6.4.1 Règles de traduction Attribut du type référence sur un objet de la classe à l’autre extrémité de l’association Référence notée « @ » Autant d’attributs que de classes auxquelles elle est reliée Association binaire = 1 attribut # 100 Association n-aire = n − 1 attributs Association unidirectionnelle = pas d’attribut du côté de la flèche Nom de l’attribut = nom du rôle ou forme nominale du nom de l’association Traduction des multiplicités 1 =⇒ @Classe ∗ =⇒ Collection @Classe 0..N =⇒ Tableau[N] Classe Multiplicité avec tri = Collection ordonnée @Classe & % Chaque association navigable à partir d’une classe donne lieu à l’ajout d’un attribut traduisant la possibilité de traverser l’association depuis cette classe vers la/les classe/s à l’autre/aux autres extrémité/s de l’association. Chacun de ces attributs est une référence vers un objet de la classe associée ; cette référence se note « @ » en UML. Par exemple, la classe Facture de l’exemple ci-dessous reçoit un attribut « fournisseur: @Fournisseur ». Chaque classe reçoit autant d’attributs que de classes auxquelles elle est reliée. Par exemple, une classe C ayant 2 associations binaires et une ternaire, reçoit 4 attributs : 1 pour chaque association binaire et 2 pour l’association ternaire. Le nom des attributs est par défaut le nom du rôle, sinon est construit à partir de la forme nominale de l’association ou du nom de la classe à l’autre extrémité de l’association. Si l’association possède une navigabilité (flèche sur le diagramme de classes indiquant que l’association n’existe que dans un sens), seul le sens de navigation autorisée donne lieu à un attribut. Les multiplicités sont également à prendre en compte. Dans le même exemple, l’attribut factures est une collection (un ensemble) de références vers des objets de type Facture car la multiplicité est comprise entre O et *. L’attribut est déclaré de la façon suivante : « factures: Collection de @Facture ». Il est possible de préciser que cette collection est triée en ajoutant ordonnée. Si la multiplicité est valorisée à un nombre N donné, utilisez un tableau de références qui se note comme ceci : « factures: Tableau[N] @Facture ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 123 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.5 Traduction des agrégations Agrégation = association, avec les mêmes règles de traduction en attribut # 101 & % Les agrégations sont des associations avec une sémantique particulière (ensemble, éléments), mais les règles de traduction des associations s’appliquent à l’agrégation sans supplément particulier. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 124 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.6 Traduction des compositions * # 102 & % De manière supplémentaire aux agrégations qui donnent lieu uniquement à des déclarations d’attributs (une agrégation est une association dont le nom est contient), pour une composition, les objets composants sont possiblement créés et obligatoirement détruits par l’objet composé. Par ailleurs, dans certains langages de programmation orientés objet, les compositions sont traduites en des attributs qui ne sont pas des références, mais directement des objets. Pour cette raison, on appelle l’agrégation la composition par référence, et on appelle la composition la composition par valeur. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 125 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.7 Traduction de la classe « Façade » du système Un constructeur et un destructeur (cf. traduction des agrégation et composition) Une opération (publique) par cas d’utilisation # 103 & % La classe utilisée comme façade, c’est-à-dire comme point d’entrée, du système contient toutes les opérations des cas d’utilisation. En d’autres termes, chaque cas d’utilisation est traduit en une opération de la classe façade. Par ailleurs, certaines opérations peuvent être ajoutées lors de la conception. Plus précisément, dans le diagramme de cas d’utilisation, certains cas d’utilisation permettent de créer et de supprimer des instances des classes métier ; mais, il est possible que certaines classes métier aient été oubliées car ayant été mises en exergue par la suite lors de la construction du diagramme de classes. Par exemple, en bureau d’étude, dans le diagramme de cas d’utilisation de la Médiathèque, aucun cas d’utilisation ne s’occupe de créer ou supprimer une Localisation. Dans les diapositives qui suivent, nous expliquons la signification de l’adjectif « publique » et du signe « + ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 126 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.8 Encapsulation : visibilité / accessibilité des attributs et des opérations Doit-on voir / accéder à tous les attributs ou à toutes les opérations d’un objet ? Non La classe définit ce qui est visible / accessible # 104 I C’est le principe de l’encapsulation Un objet complexe ne peut être utilisé qu’au travers de ce qui est accessible Analogie : Il n’est possible d’utiliser une voiture qu’à travers son volant, son frein, son accélérateur, etc. L’accès au carburateur est impossible sauf par les méthodes qui le font de manière cohérente (méthode accélérer de l’accélérateur ) & % La conception des classes s’appuie sur les concepts de l’orientation objet. Dans cette section, nous nous servons de la conception pour compléter nos connaissances sur ces concepts de l’orientation objet. Celui que nous étudions dans cette diapositive et les suivantes est l’encapsulation : tout concepteur de classe choisit les attributs et les opérations qu’il désire rendre visibles / accessibles de toutes les autres classes, ou visibles / accessibles seulement des classes enfants, ou encore non visibles / non accessibles. En guise d’autre exemple que celui de la diapositive, prenons un exemple informatique du module d’algorithmique procédurale CSC3002. Pour la conception de listes chaînées, vous utilisez une structure de données avec des pointeurs qui permettent de connaître l’élément précédant et l’élément suivant dans liste, ainsi que des pointeurs pour connaître le premier élément et le dernier élément de la liste. Ces derniers pointeurs permettent de manipuler plus facilement la liste pour ajouter / supprimer un élément au début / à la fin de la liste. Après la conception des procédures pour ces manipulations, vous souhaitez que les utilisateurs n’utilisent ni le pointeur sur le premier ni le pointeur sur le dernier élément, mais vos procédures. En quelque sorte, vous souhaitez que ces deux pointeurs soient non visibles / non accessibles. La propriété d’encapsulation est très importante car en choisissant quels attributs et quelles opérations sont visibles de tous, le concepteur définit l’API (en anglais, Application Programming Interface) du système. Une fois qu’une API est publiée, des milliers d’utilisateurs en prennent connaissance, l’utilisent, et donc en dépendent. Faire ensuite évoluer une API est très compliqué. Par conséquent, ce travail est critique pour l’adoption du système par les autres concepteurs et pour la pérennité du projet. Cf. le glossaire pour la définition du terme « visibilité/visibility ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 127 6 Conception, aspects langage et technique6.8 Encapsulation : visibilité / accessibilité des attributs et des opérations ' $ 6.8.1 Encapsulation avec le concept de Visibilité Les attributs sont en général inaccessibles (secrets). Ils sont alors qualifiés de : « private » : notation UML « − » Lecture ou modification uniquement possibles au travers des opérations (p.ex. les accesseurs : getAdresse(), setAdresse()) # 105 Les opérations sont en général accessibles par toutes les classes. Elles sont alors qualifiées de : « public » : notation UML « + » Certains attributs doivent être accessibles par les classes enfants et inaccessibles aux autres classes. Ils sont alors qualifiés de : « protected » : notation UML « # » Certaines opérations peuvent cependant être privées (factorisation interne de traitements) et certains attributs peuvent être publics (même si cela est non souhaitable selon le principe d’encapsulation) & % Pour respecter le principe d’encapsulation, les attributs sont privés (préfixés par le signe « − ») et les opérations sont publiques (préfixées par le signe « + »). Les opérations nécessaires au fonctionnement interne des classes sont elles-aussi privées. Dans le cas de la généralisation spécialisation, le travail à effectuer est de vérifier la visibilité des attributs pour les classes enfants. Si un attribut privé de la classe parente doit être « présent » dans ses classes enfants (c’est-à-dire doit être accessible par les classes enfants), ou si un attribut n’est accédé que par ses classes enfants, cet attribut possède la visibilité « protégée » (attribut préfixé par « # » dans la classe parente). Dans le cours sur la programmation orientée objet, nous verrons que certains languages comme Java introduisent d’autres types de visibilité. Par exemple, le langage Java ajoute aux trois visibilités étudiées ici (privée, protégée, publique) la visibilité « paquetage ». Dans ce cours sur la modélisation orientée objet, nous ignorons ces autres types de visibilité. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 128 6 Conception, aspects langage et technique6.8 Encapsulation : visibilité / accessibilité des attributs et des opérations ' $ 6.8.2 Notation UML # 106 & % Dans l’exemple de la classe Scrutin, tous les attributs sont privés, excepté l’attribut nbTotalScrutin. Ce dernier attribut est utilisé dans les classes enfants de la classe Scrutin, qui est une classe abstraite. Une opération est elle-aussi protégée (afficherScrutin()). Ainsi, uniquement les classes enfants peuvent appeler l’opération de cette classe parente, par exemple dans leur opération afficherScrutin(). Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 129 6 Conception, aspects langage et technique6.8 Encapsulation : visibilité / accessibilité des attributs et des opérations ' $ 6.8.3 Cas particulier des attributs/opérations protégés Attribut/opération protégé/e = Accessible par les classes enfants Inaccessible par les autres classes Par exemple, opération afficherScrutin() de la classe Scrutin # 107 La classe ScrutinPlagesHoraires peut utiliser l’opération de la classe Scrutin dans l’algorithme de son opération afficherScrutin() : String afficherScrutin() { ... appela de l’opération afficherScrutin() de classe parente ... } a. Nous étudions dans quelques diapositives comment faire cet appel. & % Dans cette diapositive, nous montrons un exemple typique expliquant pourquoi il est certaines fois nécessaire de mettre une opération protégée. Soit une classe abstraite possédant des attributs privés, par exemple la classe Scrutin. Afficher l’état d’un objet concret d’une classe enfant de la classe abstraite implique l’affichage des attributs contenus dans la classe parente et l’affichage des attributs ajoutés dans la classe enfant. Or, si les attributs de la classe parente sont privés, comme c’est le cas avec la classe Scrutin, il est nécessaire d’avoir une opération afficherScrutin dans la classe parente (pour accéder aux attributs privés de la classe parente). Comme la classe parente est une classe abstraite (qui ne possède pas d’instance), l’opération afficherScrutin n’a pas besoin d’être publique. Par ailleurs, si l’opération afficherScrutin reste publique, le concepteur qui étend la classe parente peut ne pas redéfinir l’opération afficherScrutin et seuls les attributs de la classe parente seront affichés. Donc, l’opération afficherScrutin ne doit pas être publique, mais protégée, et une opération afficherScrutin doit être définie dans la classe enfant. Cette méthode de la classe enfant doit être publique et faire appel à la méthode protégée de la classe parente pour afficher les attributs de la classe parente. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 130 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.9 Traduction des attributs dérivés Attribut dérivé =⇒ opération ou attribut selon qu’il est ou non recalculé à chaque fois que sa valeur est lue (p.ex. dans un accesseur) Par exemple, deux possibilités pour l’attribut nbBulletinsPour de la classe Choix # 108 1. Définition d’un attribut dans la classe Choix Dans l’opération voter(), incrémentation si le vote est « pour » Lorsque demandé, fourniture de la valeur de l’attribut Mais, attention à la suppression d’un bulletin ! 2. Définition d’une opération getNbBulletinsPour() L’opération getNbBulletinsPour parcourt tous les bulletins pour le calcul & % Un attribut dérivé peut être traduit soit en un attribut et une opération qui retourne la valeur de l’attribut à chaque appel, soit en une opération qui calcule la valeur lors de chaque appel. Cette décision est faite lors de la conception : c’est un détail inutile lors de l’analyse et c’est une décision importante pour la mise en œuvre. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 131 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.10 Qualification de certaines associations * numéroCompte et nom sont des attributs des classes CompteBancaire et Fichier, respectivement numéroCompte et nom sont les clefs de leur classe respective Le choix de l’association qualifiée peut être laissé à la phase de conception # 109 & % Les associations qualifiées sont en général utilisées dans les diagrammes de classes de la conception. C’est en effet une information le plus souvent peu pertinente pour l’analyste mais intéressante pour les concepteurs et ceux qui mettent en œuvre l’association : cela donne par exemple une indication pour l’élection des clefs lors de la construction du schéma de la base de données pour la persistance. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 132 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.11 Traduction des diagrammes d’interaction en algorithmes # 110 Impact sur la classe Bulletin Attributs I personne : @Personne I scrutin : @Scrutin I choix : @Choix I pourOuContre : boolean & constructeur(@Personne p, @Scrutin s, @Choix c, boolean poc) { personne = p scrutin = s choix = c pourOuContre = poc p.voter(b); s.voter(b); c.voter(b) } % Le diagramme de séquence de cette diapositive modélise la création d’un bulletin. Nous nous intéressons plus particulièrement à l’opération constructeur de la classe Bulletin. Nous en déduisons l’algorithme suivant : • les arguments passés en paramètres de l’opération sont utilisés pour initialiser les attributs correspondant dans la classe Bulletin. Les attributs concernés sont des références pour des associations ; • trois appels d’opération sont effectués. Sur l’objet p de la classe Personne, le constructeur appelle l’opération voter. Pour rappel, il est possible que le diagramme de séquence construit lors de l’analyse n’ait pas donné tous les détails des opérations appelées : par exemple, il est possible que les arguments des opérations voter n’ait pas été précisés. Dans ce cas, c’est lors de la conception, donc maintenant, que ces informations sont ajoutées. L’argument passé en paramètre des opérations voter sert à maintenir la navigabilité de l’association de l’objet p de la classe Personne vers l’objet b de la classe Bulletin. Ce passage de paramètre est imposé par le diagramme de classes : une personne connaît ses bulletins. De manière similaire, l’opération d’instance voter de la classe Scrutin et l’opération d’instance voter de la classe Choix sont appelées sur les objets s et c, respectivement. Notez que ces opérations possèdent le même nom, mais elles sont différentes car ce sont des opérations d’instance de trois classes différentes. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 133 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.12 Traduction des diagrammes de machine à états # 111 Attributs utilisés dans la machine à états Valeur des attributs dans les différents états dateDébut : date EnConstruction : valeurs par défaut dateLimite : date ScrutinOuvert : ouvert = true dateLimiteExistence : date ScrutinFermé : ouvert = false et (dateJour > dateLimite ou fermetureA = true) ouvert : boolean = false ouvertureAvancée : boolean = false fermetureAvancée : boolean = false EnDestruction : ouvert = false et (dateJour > dateLE ou destructionA = true) destructionAvancée : boolean = false & % Rappelons que les attributs d’une classe, ici la classe Scrutin, d’un diagramme de classes servent à construire un diagramme de machine à états, et vice versa (dans le sens où la construction d’un diagramme de machine à états peut permettre de découvrir des attributs non extraits directement du cahier des charges). Pour notre exemple de la classe Scrutin, il est fort probable que la première liste des attributs de la classe Scrutin construite lors de la première construction du diagramme de classes n’ait pas fait apparaître les attributs booléens qui permettent de gérer le cycle de vie par des actions de l’organisatrice, qui peut avancer l’ouverture, la fermeture, ou la destruction d’un scrutin. La traduction d’un diagramme de machine à états lors de la conception consiste en deux activités : premièrement, compléter la liste des attributs afin de permettre la gestion de tous les états et de toutes les transtions, et deuxièmement, compléter la liste des opérations afin de permettre de faire évoluer les valeurs des attributs pour respecter le diagramme de machine à états. Tout d’abord, concernant la liste des attributs, selon le diagramme de machine à états de cette diapositive, nous pouvons nous poser la question suivante : une ouverture avancée par l’organisatrice fait-elle changer la valeur de l’attribut dateOuverture ou ajoute-t-on un attribut pour distinguer une ouverture automatique d’une ouverture avancée ? Comme montré dans cette diapositive, nous avons choisi d’ajouter les attributs ouvertureAvancée, fermetureAvancée, et destructionAvancée. Ensuite, concernant la liste des opérations, les actions du diagramme de classes deviennent des opérations de la classe, et les contraintes sur les attributs deviennent aussi des opérations (par exemple, le passage du temps est modélisé par l’ajout d’une opération vérifierAuQuotidien). Les opérations avec leur algorithme sont décrits dans la diapositive qui suit. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 134 6 Conception, aspects langage et technique ' 6.12 Traduction des diagrammes de machine à états $ 6.12.1 Quelques opérations de la classe Scrutin # 112 constructeur(...) { ... vérification dateDébut < dateLimite < dateLimiteExistence } avancerOuverture() { ouvert = true ouvertureAvancée = true } avancerFermeture() { ouvert = false fermetureAvancée = true } avancerDestruction() { destructionAvancée = true } vérifierAuQuotidien() { si ((dateJour >= dateDébut) et (ouvertureAvancée == false)) alors ouvert = true si ((dateJour > dateLimite) et (fermetureAvancée == false)) alors ouvert = false si ((dateJour > dateLimiteExistence) et (destructionAvancée == false)) alors en destruction } & % Cette diapositive présente les algorithmes des opérations utilisées dans le diagramme de machine à états. La dernière opération vérifierAuQuotidien est implicitement1 créée pour faire évoluer de manière automatique l’état des objets d’un Scrutin : tous les matins, tous les scrutins sont parcourus. Par ailleurs, comme montré dans cet exemple, dans le constructeur, il est souvent utile de vérifier que les valeurs passées en paramètres sont cohérentes : ici, dateDebut < dateLimite < dateLimiteExistence. 1. Il n’est pas évident de trouver ce type d’opération lors de la lecture d’un diagramme de machine à états. Pour ce faire, demandez-vous quel est l’événement non donné (implicite) qui fait changer les valeurs des attributs pour que les conditions deviennent valides. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 135 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.13 Traduction des relations de généralisation spécialisation Dans les classes enfants, possibilité d’appel au constructeur de la classe parente (si public ou protégé) Par exemple, dans la classe enfant ScrutinPlageHoraire : # 113 constructeur(...) { super(...) // appel au constructeur de la classe parente Scrutin nbTotal = 0 } L’appel au constructeur de la classe parente doit être la première instruction Dans les classes enfants, possibilité d’appel des opérations de la classe parente (si publique ou protégée) Par exemple, dans la classe enfant ScrutinPlageHoraire : afficherScrutin() { // opération redéfinie dans la classe enfant super.afficherScrutin() // appel à l’opération de classe parente Scrutin afficher à l’écran la valeur de l’attribut nbTotal } & % Tous les algorithmes des principales opérations, ceux qui ne sont pas triviaux, doivent être écrits pendant la phase de conception. Le rôle de la programmation doit si possible être restreint à la traduction dans un langage particulier (Java en ce qui nous concerne) et à l’utilisation de canevas logiciels particuliers (par exemple, un canevas logiciel proposant des mises en œuvre de listes, de collections, d’arbre et d’autres structures de données complexes). Cette diapositive présente une nouveauté importante de l’orientation objet concernant l’écriture des algorithmes : l’appel à partir d’une opération définie dans une classe enfant d’opérations définies dans une classe parente. Lorsqu’un arbre de généralisation spécialisation est tracé dans un diagramme de classes, certaines opérations factorisées sont définies dans une classe parente, puis redéfinies dans les classes enfants. Par définition, toute opération protégée ou publique définie dans une classe peut être appelée dans le corps d’une opération d’une classe enfant. Nous distinguons deux cas particuliers : 1) le constructeur de la classe, ou 2) une opération redéfinissant l’opération de la classe parente appelée. Dans le premier cas, la notation « super() » permet d’appeler le constructeur de la classe parente. Cet usage courant permet d’écrire le constructeur d’une classe comme étant l’initialisation de la partie de l’état gérée par / définie dans la classe parente, puis l’initialisation des attributs spécifiques ajoutés dans la classe enfant. Dans le second cas, il est important de se rappeler l’effet de « la liaison dynamique ou tardive » (toujours active en Java) : si une opération définie dans une classe est redéfinie dans une classe enfant, et si c’est une référence sur un objet de type de la classe enfant qui est utilisée, alors c’est l’opération de la classe enfant (c’est-à-dire, l’opération de la classe spécialisée) qui est appelée. Dans certains cas, l’opération dans la classe enfant est une « extension » du corps de l’opération correspondante de la classe parente. Dans ces cas, la notation « super.op() » permet d’appeler explicitement l’opération de la classe parente « op » dans le corps de l’opération de la classe enfant. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 136 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.14 Traduction des classes d’association * # 114 & % La conception des classes d’association peut conduire à plusieurs solutions. La plus courante est de transformer la classe d’association en classe intermédiaire. L’association initiale est découpée en deux : une de la première classe vers la classe intermédiaire et une autre de la classe intermédiaire vers la seconde classe. Attention aux multiplicités : si l’association initiale est de type « 1 — * », la première association est de type « 1 — 1 » et la seconde est de type « * — 1 ». La figure qui suit donne les quatre possibilités de configuration des multiplictés avec les traductions correspondantes. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 137 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ 6.15 Méthodologie : une fiche par classe Collecter dans une fiche par classe Tous les attributs Toutes les opérations Sources : cahier des charges, et diagrammes de classes, de machine à états, de communications et de séquence # 115 Homogénéisation des noms : même terme pour le même concept métier La conception est une préparation de la phase de mise en œuvre Traduction des associations I Attribut « d’association » = référence Traduction des attributs dérivés en attributs ou opérations Traduction des diagrammes d’interaction et de machine à états I Définition des algorithmes des opérations Traduction des généralisations spécialisations & ' Fixation de l’accessibilité des attributs et des opérations % $ I Propriété d’encapsulation # 116 & % Comme nous l’avons vu tout au long de cette section, la conception consiste à reprendre tous les diagrammes élaborés et à repérer les attributs et les opérations nécessaires pour la réalisation des états, des transitions, des événements et des messages. Cette phase comprend aussi l’homogénéisation des noms et des arguments des messages (des diagrammes de machine à états, de séquence et de communications). « Homogénéiser » signifie le respect des mêmes conventions et l’utilisation des mêmes termes pour désigner les mêmes concepts métier. Nous rappelons que la phase de conception inclut aussi les choix techniques tels que le choix de serveur Web, le choix de base de données, etc. Ces choix n’ont pas été expliqués dans ce cours car ils sont hors propos. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 138 Introduction au langage de modélisation UML ' 6 Conception, aspects langage et technique $ QCM 1. Pour traduire une association binaire, faut-il regarder le sens de lecture de l’association ? 2. Une multiplicité « 0..1 » se traduit-elle par un attribut référence sur la classe à l’autre extrémité de l’association binaire ? # 117 3. La notation pour un attribut privé est-elle « − » ? 4. Étant donné une classe A contenant l’attribut a et une classe B contenant la méthode b, si a est privé et b est publique, b peut-elle utiliser a ? 5. Un attribut dérivé peut-il être traduit par un attribut ? 6. Un message d’un diagramme de séquence est-il la plupart du temps traduit en une opération privée ? 7. Le mot clef « super » permet-il d’appeler une opération de la classe parente ? & Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 % 139 Introduction au langage de modélisation UML ' $ 7 Conception, vues développement et physique # 118 7.1 7.2 7.3 7.4 7.5 Diagrammes de la vue développement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Diagramme de composants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Diagramme de paquetages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Diagramme de la vue physique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Diagramme de déploiement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 & % Lors de la conception, l’architecture logicielle du système comprend l’organisation des parties de logiciels spécifiées avec les termes utilisés par les développeurs : paquetage, composant, connecteur, assemblage, etc. Cette étape permet ensuite à chaque équipe de développement de connaître l’organisation du système et de positionner sa contribution dans l’ensemble. Ce modèle intéresse aussi les personnes qui déploient et administrent le système en production, car, implicitement, la vue développement définit les contributions de chaque équipe de développement, et donc les responsabilités, et donne une indication pour la préparation du déploiement (étudié dans la section qui suit celle-ci). La seconde partie de cette section présente la vue physique, c’est-à-dire comment les composants de la vue développement sont projetés sur une architecture matérielle. La projection s’appelle le déploiement. Les vues développement et physique sont présentées dans ce cours pour des raisons de complétude du cycle de vie et des diagrammes UML. Cependant, les décisions prises lors de la construction des diagrammes de ces vues dépendent beaucoup des technologies utilisées. Ces sujets sont étudiés plus précisément dans les voies d’approfondissement ASR (« Architecte des Services informatiques en Réseaux ») et DSI (« Intégration et Déploiement de Systèmes d’Information »), par exemple. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 140 Introduction au langage de modélisation UML ' 7 Conception, vues développement et physique $ 7.1 Diagrammes de la vue développement Composant = partie de logiciel réutilisable et remplaçable Paquetage = espace de nommage d’éléments de modélisation # 119 & % Lors du développement d’un système logiciel, il est rare de passer directement des exigences aux classes logicielles codées. Il est nécessaire de regrouper le développement de plusieurs classes et d’organiser le développement par groupes de classes. Les composants et les paquetages sont deux concepts de regroupement. Les composants sont des parties de logiciel réutilisables et remplaçables, selon l’approche COTS (en anglais, Components Off The Shelf, pour composants sur étagère). Les paquetages organisent des éléments, pas uniquement des classes, dans des espaces de nommages différents et permettent de gérer la complexité d’un logiciel de grande taille. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 141 Introduction au langage de modélisation UML ' 7 Conception, vues développement et physique $ 7.2 Diagramme de composants # 120 7.2.1 Composant, interfaces offertes et requises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 7.2.2 Composite, port, connecteurs de délégation et d’assemblage . . . . . . . . . . . . . . . . . 122 & % Le diagramme de composants définit l’architecture logicielle du système dans un environnement de développement donné. Il est issu de la conception et permet de représenter le système et les sous-systèmes du modèle physique de l’architecture logicielle à réaliser. Un système ou un sous-système définit un espace de visibilité et regroupe des classes. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 142 7 Conception, vues développement et physique ' 7.2 Diagramme de composants $ 7.2.1 Composant, interfaces offertes et requises # 121 & % Dans le monde du bâtiment, le modèle de l’architecture (logique) permet de visualiser, spécifier et documenter sur papier les caractéristiques de la future construction : positions des murs, des fenêtres, etc. Lors de la construction, on utilise des composants fenêtres, portes, murs. Ce sont des objets physiques qui existent dans le monde réel. Ils rendent des services mais définissent leurs exigences : taille, espace, etc. Par analogie, dans un système informatique, le modèle logique d’une application permet de visualiser, spécifier et documenter la structure et le comportement des entités qui collaborent. La construction s’appuie sur des composants logiciels. Un composant logiciel définit les services logiciels qu’il rend et aussi les services dont il est en attente pour pouvoir fonctionner. Ainsi, un composant spécifie les interfaces qu’il fournit (qu’il réalise) et les interfaces qu’il requiert. Un composant joue le même rôle qu’une classe : généralisation, association avec d’autres classes et composants, réalisation d’interfaces, etc. La principale différence entre une classe et un composant est qu’un composant regroupe des classes. Un composant est dessiné comme un rectangle avec le stéréotype «component». Si le composant est gros alors UML suggère de remplacer le stéréotype «component» par «subsystem». La diapositive montre les deux manières de spécifier les interfaces fournies (offertes) et requises d’un composant. La première notation graphique est plus concise et la seconde utilise uniquement des stéréotypes. Notez que le composant est relié à ses interfaces offertes par une association de réalisation alors qu’il est relié à ses interfaces requises par une relation de dépendance. Cf. le glossaire pour la définition du terme « composant/component ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 143 7 Conception, vues développement et physique ' 7.2 Diagramme de composants $ 7.2.2 Composite, port, connecteurs de délégation et d’assemblage # 122 & % La diapositive montre que les composants peuvent être de deux types. Les composants primitifs ne contiennent pas d’autres composants alors que les composites sont composés de composants primitifs et de composites. Les composants à l’intérieur d’un composite sont connectés par des connecteurs dits d’assemblage. Les interfaces offertes et requises sont connectées à des ports du composite et les ports sont à leur tour connectés aux composants de l’intérieur par des connecteurs dits de délégation. La notion de port matérialise le passage du contrôle de l’extérieur vers l’intérieur et vice versa. Non montré dans cette diapositive, les composants primitifs sont en général constitués de classes. Un modèle de composant hiérarchique, c’est-à-dire intégrant la notion de composants primitif et composite, permet d’étudier le système à différents niveaux de granularité : tout le système est un composite, que l’on peut ouvrir récursivement pour en connaître plus de détails, jusqu’à trouver les classes dans les composants primitifs. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 144 Introduction au langage de modélisation UML ' 7 Conception, vues développement et physique $ 7.3 Diagramme de paquetages # 123 7.3.1 Paquetage, espace de nommage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 7.3.2 Relation entre paquetages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 & % Un système informatique peut aisément contenir des centaines de classes ou d’éléments de modélisation. Pour gérer cette complexité, UML fournit le concept de paquetage (en anglais, package) qui organise un espace de nommage (en anglais, name space). Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 145 7 Conception, vues développement et physique ' 7.3 Diagramme de paquetages $ 7.3.1 Paquetage, espace de nommage # 124 & % Un paquetage est représenté par un rectangle avec une cartouche rectangulaire en haut à gauche. Lorsque le diagramme montre des éléments de modélisation (dans la diapositive, une classe) dans le paquetage, le nom du paquetage est indiqué dans la cartouche. Le diagramme de la diapositive montre les différentes notations pour indiquer qu’une classe est contenue dans un paquetage : • Classe1 possède dans son nom le nom du paquetage, la hiérarchie des paquetages étant indiquée par le symbole « :: » ; • la notation pour Classe2 possède en dessous de son nom le nom du paquetage entre parenthèse ; • la notation pour Classe3 utilise une notation proche de celle utilisée pour Classe2 ; • les classes Classe4 et Classe5 sont reliées au paquetage ; • Classe6 est directement visualisée dans le paquetage. Cf. le glossaire pour la définition des termes « paquetage/package » et « espace de nommage/namespace ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 146 7 Conception, vues développement et physique ' 7.3 Diagramme de paquetages $ 7.3.2 Relation entre paquetages Imbrication de paquetages = imbrication d’espaces de nommage Dépendance entre paquetages # 125 & % Les paquetages peuvent contenir d’autres paquetages pour construire une imbrication d’espaces de nommage. Si un élément d’un paquetage, par exemple paquetage3 dans la diapositive, utilise un élément d’un autre paquetage, par exemple du paquetage4, alors le premier paquetage dépend du second. La dépendance est notée par une flèche pointillée allant du paquetage utilisateur vers le paquetage contenant l’élément utilisé. Cf. le glossaire pour la définition du terme « dépendance/dependency ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 147 Introduction au langage de modélisation UML ' 7 Conception, vues développement et physique $ 7.4 Diagramme de la vue physique Placement des logiciels sur les matériels # 126 & % La vue physique modélise les éléments physiques (le matériel) et les logiciels montrant ainsi le placement des logiciels sur les machines pour l’exécution du système. Il n’y a donc qu’un type de diagramme dans la vue physique, le diagramme de déploiement. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 148 Introduction au langage de modélisation UML ' 7 Conception, vues développement et physique $ 7.5 Diagramme de déploiement # 127 7.5.1 Nœud et liaison de communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 7.5.2 Artefact et composant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 7.5.3 Dépendance entre artefacts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 & % Dans ce cours, nous ne nous intéressons qu’aux systèmes dans lesquels la partie logicielle est prépondérante. Le diagramme de déploiement permet de spécifier la projection des artefacts logiciels exécutables sur le matériel, ainsi que les liens logiques et physiques via le réseau utilisé. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 149 7 Conception, vues développement et physique ' 7.5 Diagramme de déploiement $ 7.5.1 Nœud et liaison de communication Ce modèle définit le diagramme de l’architecture matérielle du système Il représente les différentes machines et les logiciels Il montre les liens de communication entre ces différentes entités # 128 & % Un « nœud » est un matériel qui peut abriter des logiciels et des fichiers : hôte, disque, etc. UML étend la notion de nœud aux logiciels qui jouent le rôle d’environnement d’exécution tels que les systèmes d’exploitation, les serveurs Web et les serveurs d’application. Par opposition, des logiciels tels que les librairies, les fichiers de propriétés et les fichiers exécutables ne peuvent pas être des nœuds, mais restent des « artefacts ». Le diagramme de déploiement spécifie les liens de communication entre nœuds avec des associations stéréotypées par les noms des protocoles de communication utilisés. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 150 7 Conception, vues développement et physique ' 7.5 Diagramme de déploiement $ 7.5.2 Artefact et composant # 129 & % La diapositive montre trois façons de représenter un artefact : avec le stéréotype «artefact» et un icone, avec seulement le stéréotype «artefact», et sans stéréotype et sans icone. Le déploiement d’un artefact peut être montré de deux manières différentes : soit l’artefact est placé dans le nœud, soit l’artefact et le nœud sont reliés par une association stéréotypée «deploy». Enfin, le diagramme de déploiement peut modéliser par une association stéréotypée «manifest» le fait qu’un artefact est « empaqueté » dans un composant lui-même déployé sur un nœud. Cf. le glossaire pour la définition du terme « artefact ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 151 7 Conception, vues développement et physique ' 7.5 Diagramme de déploiement $ 7.5.3 Dépendance entre artefacts Dépendance entre artefacts Instance de nœud # 130 & % Cette diapositive montre d’une part comment les dépendances entre artefacts sont spécifiées et d’autre part que les diagrammes de déploiement peuvent aussi contenir des instances de nœuds plutôt que des « types » de nœuds. Cf. le glossaire pour la définition du terme « dépendance/dependency ». Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 152 Introduction au langage de modélisation UML ' $ 8 Conclusion Modèle pour appréhender la réalisation d’un système informatique # 131 Diagrammes UML qui permettent d’aider à la réflexion, à la discussion (clients, architectes, développeurs, etc.) Pas de solution unique mais un ensemble de solutions plus ou moins acceptables suivant les contraintes du client, et les logiciels et matériels disponibles Une solution acceptable est obtenue par itérations successives & Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 % 153 Introduction au langage de modélisation UML ' $ 9 Bibliographie Livres G. Booch, J. Rumbaugh, I. Jacobson, « The Unified Modeling Language User Guide », 2nd edition, Addison-Wesley, 2005 B. Charroux, A. Osmani, Y. Thierry-Mieg, « UML 2, Pratique de la modélisation », 2è édition, Pearson Education, 2008 J. Gabay, D. Gabay, « UML 2 : analyse et conception », Dunod, 2008 # 132 P. Roques « UML 2 par la pratique », 6è édition, Eyrolles, 2008 R. Miles et K. Hamilton, « Learning UML 2.0 : A pragmatic Introduction to UML », O’Reilly, 2006 Object Management Group, « OMG Unified Modeling Language, Infrastructure, Version 2.4.1 », OMG Document Number formal/2011-08-05, August 2011 Object Management Group, « OMG Unified Modeling Language, Superstructure, Version 2.4.1 », OMG Document Number formal/2011-08-06, August 2011 D. Pilone, « UML 2.0 Pocket Reference », O’Reilly, 2006 S.W. Ambler, « The Elements of UML 2.0 Style », Cambridge University Press, 2005 URL : OMG UML at http://www.omg.org/spec/UML/ & % L’ordre d’apparition des livres référencés n’a pas d’importance, hormis le fait que le document de référence de la spécification UML de l’OMG ainsi que les deux livres qui suivent sont d’un abord plus difficile pour les débutants. Télécom SudParis — D. Conan, C. Taconet, C. Bac — Octobre 2015 — CSC 4002 154 BE1–2 : Phase d’analyse Gestion des prêts dans une médiathèque Équipe enseignante Revision : 1302 CSC 4002 Octobre 2015 155 BE1–2 : Phase d’analyse Gestion des prêts dans une médiathèque Première étape : mise au point de la solution, aspect statique L’étape d’analyse nécessite un crayon, une GROSSE gomme et BEAUCOUP de papier : pensez à en apporter. 1 Sujet Nous souhaitons réaliser l’analyse et la conception d’un système de gestion du fond de CD audios, de DVD et de livres d’une médiathèque, et du prêt de ce fond à ses clients. Ce système doit être accessible par tous les employés de la médiathèque. Les fonctions de consultation des catalogues et de consultation de ses propres emprunts en cours doivent également être accessibles aux clients de la médiathèque. Le fonctionnement de la médiathèque est décrit de manière approfondie dans la section 3. 2 Méthodologie et objectifs Nous devons pour ce premier BE réaliser deux diagrammes UML, le diagramme de cas d’utilisation du système puis le diagramme de classes. 2.1 Première lecture : acteurs et cas d’utilisation La première étape consiste à bien comprendre le système à étudier. Dans le cadre de l’exercice, cela consiste à lire attentivement l’énoncé. Cette lecture doit permettre de délimiter les contours du système à réaliser : la méthode générale consiste à retrouver les « acteurs » qui interagissent avec lui. Il est très important de fixer des frontières au problème. Ensuite, recherchez les fonctionnalités du système par la définition de ses « cas d’utilisation ». Dans le cadre de ce module, il s’agit de rechercher les principales fonctions attendues du système. 2.1.1 Question 1 : diagramme de cas d’utilisation Pour réaliser le diagramme de cas d’utilisation à partir de l’analyse du texte : • rechercher les acteurs, • rechercher les fonctionnalités du système accessibles aux acteurs, ce qui vous permettra de dessiner le diagramme de cas d’utilisation. Nous vous proposons de nous limiter aux cas d’utilisation gérant les clients et les documents. 2.2 Analyse du texte : recherche des classes et opérations La seconde étape consiste à analyser le texte du BE afin d’y rechercher : • les classes métier1 de ce problème, ainsi que • les premiers attributs des classes avec leur type et leur valeur par défaut, • et de manière facultative, les premières opérations de chaque classe. Conseil 1 Il est préférable de sur-spécifier le modèle d’analyse avec beaucoup de classes métier ; il sera plus facile de les regrouper plus tard que de trouver celles que l’on a ignorées. Recherchez les noms qui correspondent le plus souvent aux classes métier, et les verbes qui les relient qui correspondent aux associations. Attention toutefois à certains verbes (comme le verbe être) qui peuvent correspondre à des attributs ou à des opérations. La méthode habituelle consiste à établir des listes exhaustives puis à les trier/sélectionner (suppression des classes métier trop vagues ou non pertinentes). Éliminez les noms ou les verbes inutiles (bruits introduits lors de la rédaction du texte qui ne sont pas significatifs). Faites la chasse aux synonymes afin de ne garder que les classes utiles à la résolution du problème. 1. Certains préfèrent utiliser le terme de concept ; il faut faire attention à ne pas mélanger la notion de classe/concept métier utilisées dans la phase d’analyse et la notion de classe utilisées dans la phase de conception. Télécom SudParis — Équipe enseignante — Octobre 2015 — CSC 4002 156 BE1–2 : Phase d’analyse Gestion des prêts dans une médiathèque Conseil 2 Une autre manière de trouver ces classes métier sont les « cas d’utilisation » : les classes métier sont les noms et les verbes utilisés dans les descriptions des actions effectuées par les acteurs. Conseil 3 Si un nom est associé à une valeur (nombre, texte, etc.) dans le monde réel, alors il s’agit certainement d’un attribut. Dans le doute, en faire une classe métier. Remarquez que, partant d’un énoncé, cette méthode d’analyse n’est pas une fin en soi. Les limites sont celles apportées par un texte ; cela nécessite un dialogue avec le « client ». Enfin, il est important de bien choisir le nom des classes métier et des associations. L’analyse permet de trouver en général des noms pour les classes métier et des verbes pour les associations. 2.2.1 Question 2 : liste des classes Cette deuxième lecture doit vous permettre de créer une liste de classes et de noter de manière informelle leurs relations ainsi que les attributs qui leurs sont associés. Cette liste se présente sous forme d’énumération. 2.3 Phase de construction du diagramme de classes Le diagramme de classes est un réseau statique de classes et d’associations (l’analogie avec le réseau routier peut aider : il s’agit de décrire les différentes voies de circulation, pas comment on voyage). En partant des classes et des associations trouvées précédemment, construisez un diagramme de classes. Ajoutez à ce schéma des informations concernant les classes et les associations. Nous vous conseillons de : • construire un premier diagramme de classes à partir des noms obtenus dans la phase précédente, • par étapes successives, enrichir ce diagramme par les associations à l’aide des verbes obtenus, • affiner le diagramme en éliminant les associations redondantes2 en simplifiant le schéma dès lors qu’il respecte les spécifications de l’énoncé, • ne chercher les généralisations et spécialisations qu’à la fin, lorsque les classes sont déjà bien établies. La notation UML doit impérativement être respectée. Elle conditionne la compréhension du schéma par l’équipe de développement (ou accessoirement du correcteur). Concernant les associations, recherchez les associations simples, les relations d’agrégation et de généralisation spécialisation. Ensuite, trouvez la multiplicité (cardinalité) de chaque relation qu’il faut porter sur le schéma. 2.3.1 Question 3 : diagramme de classes simple Une fois réalisées les étapes précédentes, vous devez vous appliquer à dessiner sous forme de diagramme de classes, les classes en recherchant les associations entre les classes et les généralisations/spécialisations. 2.4 Phase de recherche des attributs et opérations Enfin, trouvez les attributs et les opérations des classes. À ce niveau, quelques retours en arrière sont possibles à cause d’oublis ou de mauvaises compréhensions du système. Il s’agit des attributs ou opérations qui sont liés au modèle statique. Dans la partie conception (lors du BE5), d’autres attributs et opérations seront trouvés, comme par exemple ceux introduits par le modèle dynamique ou encore ceux des classes dites « techniques ». Conseil 4 Un critère de validité d’un attribut est qu’il doit être simple (type/valeur) : par exemple, date, nombre et texte. Dans le cas contraire, en faire une classe métier. D’autre part, les classes métier doivent être reliées avec des associations et non avec des attributs. Vous devez réfléchir sur le choix de la classe où placer les attributs. En cas de doute, analysez de nouveau la relation. Quelquefois, la solution consiste à ajouter une classe d’association (ce cas peut se présenter dans cet exercice avec la classe FicheEmprunt). Pensez à qualifier les attributs de classes (par opposition aux attributs d’instance). Il y en a un certain nombre qui ne sont pas forcément évidents à détecter avant d’aborder la phase dynamique de l’analyse. 2. Le cas des associations ou attributs dérivés n’est pas pris en compte à ce niveau de l’analyse. Ils seraient précédés par le caractère « / » dans le diagramme de classes. Télécom SudParis — Équipe enseignante — Octobre 2015 — CSC 4002 157 BE1–2 : Phase d’analyse Gestion des prêts dans une médiathèque Conseil 5 Pour placer une opération dans une classe, recherchez la classe responsable : • c’est celle qui détient toutes les informations nécessaires pour effectuer l’opération ; • en cas de création, cela devrait être la classe conteneur (agrégation/composition) ou celle qui détient les valeurs d’initialisation. Concernant les opérations, le niveau de détail doit rester faible afin de ne pas empiéter sur la phase de conception. 2.4.1 Question 4 : classes avec opérations Reprenez chaque classe du diagramme de classes et complétez-la en vérifiant l’ensemble de ses attributs et de ses opérations. 2.5 Phase de vérification de l’analyse, aspects statiques Après avoir dessiné le diagramme de classes (dans sa première version, il est sujet à raffinements dans les prochaines itérations), vérifiez que le système « fonctionne ». En partant des cas d’utilisation, vérifiez que la navigation entre les classes (associations et opérations) permet de réaliser ce qui est prévu dans le cahier des charges. Finalement, reprenez l’énoncé et vérifiez que toutes les spécifications demandées y sont présentes. Dans le cas contraire, reprenez le schéma et corrigez-le. Dans certains cas, cela peut remettre énormément de choses en question. Vous devez contrôler également si des fonctionnalités nouvelles ont été ajoutées par rapport à l’énoncé. Demandez à un enseignant de vous aider à effectuer ce contrôle et à valider les nouvelles spécifications. Ces nouveautés doivent rester mineures. 2.5.1 Question 5 : vérifications Vérifiez que les cas d’utilisations peuvent être réalisés sur le système décrit par le diagramme de classes. 3 Cahier des charges • La médiathèque contient un certain nombre de documents disponibles à la consultation ou à l’emprunt ; les personnes désirant emprunter des ouvrages pour une durée et à un tarif donnés doivent s’inscrire en tant que client. • Les clients s’inscrivent auprès d’un employé de la médiathèque, et empruntent et rendent un document par l’intermédiaire d’un employé de la médiathèque. • L’inscription des clients consiste à remplir une fiche datée sur laquelle sont notées les informations suivantes : nom et prénom du client ainsi que son adresse. • Les catégories de client actuelles permettent au client de choisir de payer à chaque emprunt effectué (catégorie « à tarif normal » ou « à tarif réduit ») ou de régler une cotisation annuelle (catégorie « abonné »). • Outre le tarif, la catégorie de client conditionne les critères d’emprunt suivants : le nombre de documents empruntables et la durée de prêt (voir ci-dessous). Dans le cas « tarif réduit », un justificatif est demandé à l’inscription, puis à chaque date anniversaire. Les justificatifs à prévoir sont les suivants : carte étudiant/scolaire, carte vermeil et carte « à caractère social ». • Les documents disponibles sont des CD audios, des DVD ou des livres. Chaque document est repéré par un code unique et une localisation (salle/rayon) dans la médiathèque. Certains documents ne peuvent pas être empruntés, mais uniquement consultés sur place. Les informations communes aux documents sont les suivantes : le titre, l’auteur (écrivain, groupe ou metteur en scène) et l’année de sortie. Le système devra permettre de disposer de statistiques d’utilisation, telles que le nombre d’emprunts effectués pour les différentes catégories et genres de documents. Les autres informations des documents sont les suivantes : Télécom SudParis — Équipe enseignante — Octobre 2015 — CSC 4002 158 BE1–2 : Phase d’analyse Gestion des prêts dans une médiathèque – les CD possèdent un genre musical (par exemple, « classique », « variétés françaises », « variétés internationales », « compilation ») et une classification (par exemple, « opéra » pour le genre « classique », « hardcore » pour le genre « variétés internationales » ou « rock » pour le genre « compilation ») ; – Les DVD possèdent un genre de vidéo (« documentaire », « comédie »...), une durée d’émission et une mention légale de diffusion (restrictions d’usage) ; cette mention doit être disponible lors de l’emprunt du DVD pour permettre un éventuel contrôle ; – Les livres possèdent un genre (« roman », « policier », etc.) et un nombre de pages. Les genres précisés sont libres ; ils sont donnés aux clients à titre indicatif pour aider au choix lors d’un emprunt. • Chaque sortie de document entraîne la constitution d’une fiche d’emprunt. Sur cette fiche, sont notés le client emprunteur, la date de début du prêt, le document emprunté et la date limite de restitution. Les durées de prêt dépendent du type de document et de la catégorie du client (voir les règles ci-dessous) ; • La médiathèque met à la disposition des clients des ordinateurs pour qu’ils consultent le catalogue, leurs emprunts, et puissent mettre à jour leur adresse. Le système de gestion doit prévoir toute opération d’ajout et de suppression de clients et de documents. Les informations les concernant ne sont pas construites par le système (par exemple, la localisation des documents dans les locaux), mais supposées fournies lors de l’invocation de ces opérations. Le système doit permettre de réviser les catégories et leurs conditions associées. D’autre part, les formats de la plupart des informations sont libres (chaînes de caractères) ; le système doit toutefois veiller à la cohérence des informations stockées (impossibilité d’avoir deux clients ou deux documents avec le même nom, emprunter deux fois le même document, etc.). 3.1 Règles de prêt L’emprunt d’un document par un client obéit à certaines règles : • un client ne peut pas emprunter plus d’un certain nombre de documents fixé par sa catégorie : 2 pour la catégorie « à tarif réduit », 5 pour la catégorie « à tarif normal » et 10 pour la catégorie « abonné ». Dès que ce nombre maximal est atteint pour un client donné, tout nouveau prêt doit être impossible ; • tout client qui n’a pas restitué un document avant sa date limite de restitution ne peut plus faire de nouvel emprunt tant qu’il n’a pas régularisé sa situation, ceci même si le nombre maximal d’emprunts n’est pas atteint. Pour ce faire, à chaque demande d’emprunt, le système vérifie s’il est à jour dans ses restitutions ; si ce n’est pas le cas, l’emprunt n’est pas autorisé. • l’ensemble des fiches d’emprunt est parcouru chaque jour afin de repérer s’il existe des documents pour lesquels la date limite de restitution est dépassée. Pour chacune de ces fiches trouvées, la date de rappel de la fiche est mise à la date du jour, le client concerné est marqué et la médiathèque envoie une lettre de rappel que nous considérons hors système. Les fiches ayant fait l’objet d’un rappel font l’objet d’une relance hebdomadaire. • le tarif des emprunts dépend du document et du client. Le tarif du document est fixé par son type : 0, 5 e pour un livre, 1 e pour un CD audio et 1, 5 e pour un DVD. La règle pour les clients « à tarif normal » est de payer le montant fixé pour chaque document emprunté (indiqué auparavant). Le tarif appliqué aux clients « à tarif réduit » est la moitié du « tarif normal ». Les « abonnés » réglant une cotisation annuelle empruntent les documents gratuitement ; • la durée des emprunts dépend du document et du client. Chaque type de document est empruntable pour une durée dite nominale : 2 semaines pour un DVD, 4 semaines pour un CD audio et 6 semaines pour un livre. Ensuite, la durée de prêt est modifiée selon la catégorie de client : aucun changement — la durée nominale — pour un client à tarif normal, la moitié de cette durée pour un client à tarif réduit et le double de cette durée pour un abonné ; • un client peut changer de statut. Par exemple, un client abonné devient un client à tarif normal si son abonnement n’est pas renouvelé à la date anniversaire. De la même façon, un client à tarif réduit devient un client à tarif normal si aucun justificatif n’est fourni à la date anniversaire. Télécom SudParis — Équipe enseignante — Octobre 2015 — CSC 4002 159 BE1–2 : Phase d’analyse Gestion des prêts dans une médiathèque Télécom SudParis — Équipe enseignante — Octobre 2015 — CSC 4002 160 BE3–4 : Phase d’analyse Diagrammes dynamiques Équipe enseignante Revision : 1502 CSC 4002 Octobre 2015 161 BE3–4 : Phase d’analyse Diagrammes dynamiques Deuxième étape : mise au point de la solution, aspect dynamique 1 Questions À partir de cette séance, nous ne réalisons que les fonctionnalités demandées par l’acteur Employé médiathèque. 1. Construire le diagramme de machine à états des classes FicheEmprunt, Document et Client. 2. Construire les diagrammes de communications et de séquence des opérations mettre consultable, emprunter, et restituer de la classe Médiathèque. 2 2.1 Méthodologie Construction des diagrammes de machine à états (DME) À partir du diagramme de classes établi dans le premier BE (dans sa version complète avec les concepts avancés), construisez un diagramme de machine à états (DME) pour certaines des classes. Ce diagramme permet de compléter la liste des opérations d’une classe (événements extérieurs et traitements internes). Les états initiaux et terminaux sont montrés. Ne conservez que les états ayant une certaine stabilité dans le temps ou bien les états pendant lesquels de nombreuses et/ou importantes actions sont effectuées. Les états de type en train de, en cours de, etc. sont très intéressants. Par exemple, pour une fiche d’emprunt, l’état en retard est intéressant car le comportement du système est spécifique : certaines actions sont déclenchées et d’autres sont interdites. La construction du DME de la classe FicheEmprunt nous permet dans la suite d’établir plus facilement les diagrammes de séquence et de communications pour spécifier les opérations complexes comme emprunter et restituer. Conseil 1 Les attributs booléens dans une classe aident à déduire les états possibles de cette classe. Concernant la classe Client, dans un premier temps, ignorez le fait que les clients peuvent changer de catégories. Dans un second temps, prenez en compte cette contrainte et adaptez votre DME. 2.2 Construction des diagrammes de communications (DC) et de séquence (DS) Le diagramme de communications et le diagramme de séquence sont des diagrammes duaux (on peut construire l’un à partir de l’autre). Le fait de choisir un des deux diagrammes plutôt que l’autre n’a pas de signification particulière ici. Conseil 2 Avant de dessiner un diagramme de communications ou de séquence, écrivez l’algorithme correspondant en langage naturel. Pour le diagramme de communications et de séquence de l’emprunt, nous supposons que le cas d’utilisation ne concerne qu’un document et que la procédure de vérification journalière des retards est lancée par exemple le matin, ce qui garantit que les emprunts sont possibles toute la journée. 2.3 Derniers conseils Bien que les questions (ainsi que la présentation) figurent dans un certain ordre, revenez sur tous les diagrammes pour les compléter ou les corriger. Il s’agit de l’élaboration d’une solution, qui passe nécessairement par une compréhension du problème tant d’un point de vue statique (BE précédent) que d’un point de vue dynamique (ce BE). N’hésitez pas à compléter vos diagrammes de tout commentaire facilitant la compréhension ou permettant d’attirer l’attention sur des points qui resteraient obscurs et à approfondir. Enfin, la documentation est une part très importante dans toute analyse/conception. Télécom SudParis — Équipe enseignante — Octobre 2015 — CSC 4002 162 BE5 : Conception des classes Équipe enseignante Revision : 1316 CSC 4002 Octobre 2015 163 BE5 : Conception des classes Troisième étape : la liste des classes de manière détaillée. Il s’agit d’établir de manière exhaustive la liste des attributs et des opérations avec leur algorithme afin de préparer la mise en œuvre. 1 Questions Nous étudions la conception d’un certain nombre de classes du système, en particuliers les classes : • Médiathèque, ce qui nous permet d’étudier la traduction des agrégations et des compositions, • FicheEmprunt, ce qui nous permet d’étudier la traduction des associations et des attributs dérivés, • Document et Livre, ce qui nous permet d’étudier la généralisation spécialisation. Pour chacune des classes étudiées, l’étude passe par les étapes suivantes : 1. en respectant les règles données en cours, donnez la liste exhaustive des attributs et des opérations pour la classe ; 2. pour chacun des attributs, donnez leur visibilité, leur pseudo-déclaration, et leurs éventuelles valeurs par défaut ; 3. pour chacune des opérations, donnez leur visibilité, leur pseudo-déclaration, ainsi que leur algorithme général de manière littérale ou en pseudo-code (par exemple l’opération Emprunter de la classe Mediatheque et le constructeur de la classe FicheEmprunt). 2 Méthodologie 2.1 Démarche de conception des objets L’étape finale avant le développement dans un langage de programmation orienté objet consiste à définir complètement les classes, les attributs, les opérations, les signatures des opérations et les algorithmes. Conseil 1 Nous vous recommandons de réserver une feuille de papier par classe et nous vous encourageons à documenter (commenter) les attributs ou opérations que vous trouvez. 2.2 Opérations à effectuer Les différents points à traiter sont : 1. concevoir les associations, 2. trouver tous les attributs et toutes les opérations, 3. concevoir la visibilité des attributs et des opérations, 4. concevoir les algorithmes, 5. optimiser les chemins de données (si la conception des algorithmes met en évidence des relations entre classes trop compliquées)1 . Les environnements orientés objet (système, langage, etc.) offrent le plus souvent des API (en anglais, Application Programming Interface) permettant de disposer de collections toutes faites, de fonctionnalités élaborées, etc. Le travail accompli ici nécessite peut-être alors des modifications afin de les prendre en compte. La conception n’est alors peut-être pas complètement terminée. 1. Cette étape n’est pas parcourue lors de ce BE car nous partons de diagrammes « corrects », c’est-à-dire d’une solution éprouvée (puisque l’équipe enseignante a réalisé l’ensemble du développement jusqu’à fournir une application qui correspond à la modélisation et qui fonctionne). Dans la pratique, cette étape peut être une nouvelle occasion de remettre en question des choix d’analyse ou de conception (même si cela provoque un retour en arrière qui prend du temps). Télécom SudParis — Équipe enseignante — Octobre 2015 — CSC 4002 164 BE6–7 : Analyse complète d’un cas Équipe enseignante Revision : 1510 CSC 4002 Octobre 2015 165 BE6–7 : Analyse complète d’un cas 1 Sujet L’équipage d’un avion est toujours constitué d’un pilote, d’un copilote, et de plusieurs personnels navigants et commerciaux (PNC). Chacune de ces personnes est identifiée par son nom et sa fonction. Nous supposons qu’un même équipage peut participer à plusieurs vols. Chaque membre d’équipage doit être opérationnel sur deux catégories d’avions (par exemple, le PNC Richard est opérationnel sur Airbus A320 et Boeing 747). Chaque catégorie d’avions requiert un nombre de PNC dans son équipage oscillant entre un minimum et un maximum (par exemple, les PNC des Airbus A320 doivent être entre six et huit, et ceux d’un B747 entre 12 et 16)1 . Voici ci-dessous un extrait du tableau de service de quelques employés de la compagnie Air France : Avion 13562 13562 13562 13562 13562 32156 32156 32156 32156 32156 Vol AF347 AF347 AF347 AF347 AF347 AF545 AF545 AF545 AF545 AF545 Dest. Londres Londres Londres Londres Londres New-York New-York New-York New-York New-York Date 11/10/06 11/10/06 11/10/06 11/10/06 11/10/06 12/10/06 12/10/06 12/10/06 12/10/06 12/10/06 Catégorie A320 A320 A320 A320 A320 B747 B747 B747 B747 B747 Site Orly Orly Orly Orly Orly Roissy Roissy Roissy Roissy Roissy Nom Corinne Amy Maureen Richard Ben Nicolas Jean-Marc Ségolène François Fabien Fonction Pilote Copilote PNC PNC PNC Pilote Copilote PNC PNC PNC Figure 1 : Extrait du tableau de service des vols AF347 et AF545 sur une période L’objectif du système à modéliser est de constituer le tableau de service. Les membres de l’équipage peuvent visualiser les vols sur lesquels ils sont affectés. L’administrateur du système peut créer et supprimer des entités dans le système. Le manager peut ajouter et supprimer des personnes dans un équipage pour un vol donné (un vol est désigné par un numéro de vol et une date). Les données du vol sont archivées après le vol pour une année2 . En guise de simplification, nous ne permettons pas à un membre d’équipage d’assurer la fonction de pilote pour certains vols et de copilote pour d’autres vols. 2 2.1 Questions Analyse du texte Après avoir réalisé une analyse du texte, ce qui vous a permis de trouver les noms et les verbes correspondant à ce problème, choisir les classes qui vous semblent devoir faire partie de la modélisation de ce système. Décrire textuellement ces classes et les attributs associés à chaque classe : donner le nom des classes, le nom des attributs et des explications textuelles (uniquement quand cela vous semble nécessaire). 2.2 Diagramme de cas d’utilisation Décrire les acteurs et les fonctionnalités significatives du système dans un diagramme de cas d’utilisation. 2.3 Diagramme de classes Construire un diagramme de classes qui représente le système. Précisez les noms des associations, les multiplicités et les sens de navigation des associations (lorsque nécessaire pour la compréhension). Spécifiez aussi les éventuels généralisations spécialisations et agrégations. 1. Pour simplifier, le tableau ci-dessous n’en représente que quelques-uns. 2. En raison du temps limité, nous ignorons la tenue à jour de la localisation des équipages et le décompte de leurs temps de vols et de repos. Télécom SudParis — Équipe enseignante — Octobre 2015 — CSC 4002 166 BE6–7 : Analyse complète d’un cas 2.4 Diagramme de machine à états Construire le diagramme de machine à états de la classe qui permet de décrire un groupe d’entrées du tableau de service correspondant à un vol un jour donné. 2.5 Conception des classes Dans cette question, nous nous intéressons à la classe qui permet de décrire un groupe d’entrées du tableau de service correspondant à un vol un jour donné. Traduire par des attributs les associations de cette classe (faites figurer le nom des attributs, leur type ainsi que leur visibilité). 2.6 Diagramme de communications ou de séquence Donner le diagramme de communications ou de séquence qui correspond au cas d’utilisation : « affecter un PNC à un vol ». Durant l’interaction, n’oubliez pas de vérifier que : • l’équipage n’est pas complet, • le PNC est en capacité d’effectuer un vol sur cette catégorie d’avion. Dans le cas contraire, le PNC ne pourra pas être affecté à ce vol. Nous supposons que les arguments de l’opération lancée par l’acteur sont une référence sur un PNC et une référence à un vol. Enfin, nous souhaitons que l’opération retourne un booléen indiquant si l’affectation rend l’équipage du vol au complet. Avant de vous lancer dans la réalisation du diagramme, nous vous conseillons de rédiger en langage naturel les différentes étapes logiques de l’interaction, c’est-à-dire ce qu’il faut faire. Télécom SudParis — Équipe enseignante — Octobre 2015 — CSC 4002 167 BE6–7 : Analyse complète d’un cas Télécom SudParis — Équipe enseignante — Octobre 2015 — CSC 4002 168 Introduction au langage de programmation Java Christian Bac, Denis Conan Revision : 1527 CSC 4002 Octobre 2015 169 Introduction au langage de programmation Java Table des matières Sommaire du cours 1 Introduction à Java 1.1 Vous avez dit Java ? . . . . . . . . 1.1.1 Android . . . . . . . . . . . 1.1.2 CAS . . . . . . . . . . . . . 1.1.3 Java partout ! . . . . . . . . 1.1.4 Pourquoi nous ? . . . . . . 1.2 Que recouvre le mot Java ? . . . . 1.2.1 Héros . . . . . . . . . . . . 1.2.2 Projet et Historique . . . . 1.3 Caractéristiques . . . . . . . . . . 1.3.1 Java un langage Objet . . . 1.3.2 Machine Virtuelle Java . . . 1.3.3 Robustesse . . . . . . . . . 1.4 Historique de l’API . . . . . . . . . 1.5 Environnements de développement 1.5.1 Java Standard Development 1.6 En savoir plus . . . . . . . . . . . 1.6.1 Sites Web . . . . . . . . . . Questions sur les concepts Java . . . . 173 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 174 174 175 175 176 176 177 177 178 179 180 180 181 182 182 183 184 184 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 185 186 186 188 188 189 189 190 190 191 192 192 3 Classes et objets en Java 3.1 Classe . . . . . . . . . . . . . . . . . . . . . 3.1.1 Classe Personne en Java . . . . . . . 3.1.2 Instance de classe en UML . . . . . 3.1.3 Instance de classe en Java . . . . . . 3.2 Objet . . . . . . . . . . . . . . . . . . . . . 3.2.1 Constructeurs en Java . . . . . . . . 3.2.2 Exemples de constructeurs . . . . . . 3.2.3 this . . . . . . . . . . . . . . . . . . 3.2.4 Exemples d’utilisation de this . . . 3.2.5 Destruction des objets . . . . . . . . 3.2.6 Abstraction et encapsulation . . . . 3.2.7 Visibilité des méthodes . . . . . . . . 3.3 Attributs et méthodes de classe . . . . . . . 3.3.1 Attributs et méthodes de classe Java 3.3.2 Attributs et méthodes de classe . . . 3.4 Association entre classes . . . . . . . . . . . 3.4.1 Exemple d’association . . . . . . . . 3.4.2 Association entre classes en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 194 194 196 196 197 197 198 198 198 199 200 200 201 201 202 203 203 204 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kit . . . . . . . . . 2 Concepts de bases de Java 2.1 Syntaxe de base . . . . . . . . . . . . 2.1.1 Premier en C . . . . . . . . . . 2.1.2 Premier en Java . . . . . . . . 2.2 Types Primitifs . . . . . . . . . . . . . 2.2.1 Conversions de type . . . . . . 2.2.2 Exemple de conversions . . . . 2.2.3 Tableaux . . . . . . . . . . . . 2.2.4 Exemple avec un tableau . . . 2.3 Tableaux . . . . . . . . . . . . . . . . 2.4 Méthodes . . . . . . . . . . . . . . . . 2.5 Exemple de passage d’arguments . . . Questions sur la syntaxe de base de Java . . . . . . . . . . . . . Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 170 Introduction au langage de programmation Java Questions sur les classes et objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 4 Généralisation spécialisation en Java 4.1 Généralisation spécialisation . . . . . . . . . . . . . . . . . . 4.1.1 Héritage : comment en Java . . . . . . . . . . . . . . 4.1.2 Héritage et constructeur . . . . . . . . . . . . . . . . 4.1.3 Exemple de classe parente et classe dérivée . . . . . 4.1.4 Utilisation de classe parente et dérivée . . . . . . . . 4.2 Polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Exemple de Upcast et Downcast . . . . . . . . . . . 4.3 Redéfinition de méthodes dans les classes dérivées . . . . . 4.3.1 Polymorphisme et liaison dynamique avec toString 4.4 Héritage, membres et visibilité . . . . . . . . . . . . . . . . Questions généralisation/spécialisation en Java . . . . . . . . . 4.5 Classes abstraites . . . . . . . . . . . . . . . . . . . . . . . . 4.5.1 Classes abstraites : principes . . . . . . . . . . . . . 4.5.2 Classes abstraites en Java . . . . . . . . . . . . . . . 4.6 Exemple de classe Abstraites . . . . . . . . . . . . . . . . . 4.6.1 Exemple : classes abstraites . . . . . . . . . . . . . . 4.7 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7.1 Interfaces en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 206 207 207 208 209 210 211 212 212 213 213 214 214 215 215 216 218 218 5 Organisation des sources Java 5.1 Programme en C (rappel) . . . . . . . . . . . . . . . . 5.2 Exécution d’un programme (rappel) . . . . . . . . . . 5.3 Exécution d’un programme sur une machine virtuelle 5.4 Dans le cas de Java . . . . . . . . . . . . . . . . . . . 5.5 Unités de compilation . . . . . . . . . . . . . . . . . . 5.6 Paquetages . . . . . . . . . . . . . . . . . . . . . . . . 5.6.1 Chemin de recherche . . . . . . . . . . . . . . . 5.6.2 Exemple . . . . . . . . . . . . . . . . . . . . . . 5.7 Visibilité en Java . . . . . . . . . . . . . . . . . . . . . 5.7.1 Table de visibilité . . . . . . . . . . . . . . . . . Questions organisation des sources en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 220 220 221 222 222 223 224 224 224 225 226 6 API Java 6.1 Premières classes de l’API . . . . . . . . . . 6.2 Classe java.lang.Object . . . . . . . . . . 6.2.1 Égalité . . . . . . . . . . . . . . . . . 6.2.2 Exemple d’égalité . . . . . . . . . . . 6.2.3 Exemple de méthode equals . . . . . 6.3 Interface de programmation . . . . . . . . . 6.3.1 Quelques paquetages Java . . . . . . 6.4 java.lang.* . . . . . . . . . . . . . . . . . . . 6.4.1 Exemple avec la classe Integer . . . 6.4.2 Classe String . . . . . . . . . . . . . 6.4.3 Exemple pour String . . . . . . . . Questions API java.lang . . . . . . . . . . . . . 6.5 java.util.* . . . . . . . . . . . . . . . . . . . 6.5.1 Classe paramétrée . . . . . . . . . . 6.5.2 Classes Abstraites des collections . . 6.5.3 Classes instanciables des collections 6.5.4 Collections . . . . . . . . . . . . . . 6.5.5 Interface Iterable . . . . . . . . . . 6.5.6 Interface Collection<E> . . . . . . 6.5.7 Interface List<E> . . . . . . . . . . 6.5.8 Classe Vector<E> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 227 227 229 229 230 231 231 232 233 233 233 234 234 235 236 237 237 238 238 239 239 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 171 Introduction au langage de programmation Java 6.5.9 Boucle pour les collections . . . . 6.5.10 Exemple for-each sur un Vector 6.5.11 Exemple de classe avec Vector 6.5.12 Interface Iterator . . . . . . . 6.5.13 Exemple avec Iterator . . . . 6.5.14 Dictionnaires Map<K,V> . . . . . 6.5.15 Exemple pour Map . . . . . . . . 6.5.16 Dictionnaire Hashtable<K,V> . 6.5.17 Exemple pour Hashtable . . . . 6.5.18 Représentation d’une Hashtable Questions collections en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 241 241 242 243 244 244 245 246 246 247 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 248 249 250 250 251 251 252 253 254 8 Concepts objets avancés en Java 8.1 Copie simple/légère . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.1 Copie pour studs . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.2 Représentation graphique d’une copie légère dans studs . . . . 8.1.3 Exemple de copie légère . . . . . . . . . . . . . . . . . . . . . . 8.1.4 Représentation graphique d’une copie plus profonde dans studs 8.1.5 Copie plus profonde dans studs . . . . . . . . . . . . . . . . . . 8.1.6 Représentation graphique d’une copie profonde . . . . . . . . . 8.1.7 Clone de Scrutin . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.8 Clone en copie profonde de Personne . . . . . . . . . . . . . . 8.1.9 Suite exemple de copie profonde . . . . . . . . . . . . . . . . . 8.2 Retour sur hashCode() . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 Exemple hashCode . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 Retour sur les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1 Test des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2 RuntimeException . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 256 257 257 257 259 259 261 262 263 264 265 266 266 267 269 7 Exceptions en Java 7.1 Motivation : retours sur un bug . . . 7.2 Principes . . . . . . . . . . . . . . . 7.2.1 Mise en œuvre . . . . . . . . 7.2.2 Exemple de traitement . . . . 7.3 Réalisation . . . . . . . . . . . . . . 7.3.1 java.lang.Exception . . . . . . 7.4 Traitement des exceptions . . . . . . 7.5 Exemple de traitement d’exceptions Questions sur les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . Bibliographie 271 Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 172 Introduction au langage de programmation Java ' $ Sommaire du cours #2 1 2 3 4 5 6 7 8 Introduction à Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Concepts de bases de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Classes et objets en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Généralisation spécialisation en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Organisation des sources Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 API Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Exceptions en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Concepts objets avancés en Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143 & % La structure du cours est la suivante : 1. généralités sur le langage et présentation de la machine virtuelle Java, 2. syntaxe de base et types primitifs, 3. classes et objets, associations entre objets, 4. généralisation et spécialisation entre classes, 5. organisation des fichiers sources et compilés, 6. classes Java indispensables de la bibliothèque, 7. types paramétriques et collections, 8. gestion des exceptions, 9. concepts avancés de Java : interface, copie d’objet. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 173 1 Introduction à Java ' 1.1 Vous avez dit Java ? $ 1 Introduction à Java #3 1.1 1.2 1.3 1.4 1.5 1.6 Vous avez dit Java ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Que recouvre le mot Java ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Caractéristiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Historique de l’API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Environnements de développement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 En savoir plus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 & % Cette section présente les concepts généraux du langage Java. Ces concepts sont souvent partagés par les langages postérieurs aux années 1990. Cette introduction mélange la culture générale et les spécificités techniques. Les grandes lignes de cette section sont proches de la page wikipedia sur Java. ' $ 1.1 Vous avez dit Java ? #4 À quoi cela sert-il ? Pourquoi nous ? & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 174 1 Introduction à Java ' 1.1 Vous avez dit Java ? $ 1.1.1 Android #5 Android : Java est le logiciel prépondérant des + 500 000 applications. & % ' $ 1.1.2 CAS #6 & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 175 Introduction au langage de programmation Java ' 1 Introduction à Java $ 1.1.3 Java partout ! #7 & % ' $ 1.1.4 Pourquoi nous ? #8 & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 176 1 Introduction à Java ' 1.2 Que recouvre le mot Java ? $ 1.2 Que recouvre le mot Java ? Un projet et des évolutions sur + de 20 ans #9 Un langage objet Une architecture basée sur une machine virtuelle Des interfaces de programmation objet Des outils (Java Development Kit) & % Nous détaillons chacun de ces points dans les diapositives suivantes. $ ' 1.2.1 Héros # 10 & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 177 Introduction au langage de programmation Java ' 1 Introduction à Java $ 1.2.2 Projet et Historique 1990 : équipe autour de James Gosling et sous l’impulsion de Bill Joy 1993 : projet de langage pour l’électronique grand public 1995 : Java Development Kit (JDK) 1.0 b1 + support dans le navigateur Netscape 1998 : mise en place du Java Community Process # 11 1999 : Java 2 Standard Edition (J2SE) 1.2 (Java DataBase Connector amélioré, interface graphique Swing, collections) 2005 : J2SE 1.5, alors renommé J2SE 5 (types paramétrés, annotations, collections revues) 2006-2007 : J2SE6 et libération du code passage sous licence General Public License, alias GNU/GPL 2009 : rachat de SUN microsystems par ORACLE 2011 : J2SE 7 & % L’historique de Java est décrit à la page http://www.oracle.com/technetwork/java/javase/overview/javahistory-in C’est un projet qui débute dans la première moitié de la décennie 1990. À l’époque, SUN travaille sur l’informatique répartie et a réalisé un système d’exploitation appelé NEXT (Unix sur un ensemble de stations de travail). Le PC d’IBM et Microsoft est encore absent du paysage pour eux. Les objectifs de l’équipe sont principalement de pallier les difficultés à programmer en langage C++, tout en conservant une compatibilité avec la syntaxe de base connue des programmeurs C. Les membres du projet ciblent le support de petites machines de type assistant personnel, ou consoles de jeux. Les événements suivants sont importants dans cet historique : • le navigateur Web de la société Netscape supporte Java dès 1995. • la constitution du Java Community Process (JCP) en 1998. Cette constitution répond à la nécessité de standardiser le langage par un processus ouvert comparable à celui des standards Internet. Ce processus est indispensable pour le langage apparaisse indépendant de la compagnie . • les versions J2SE se succèdent à peu près tous les deux ans, par des ajouts de classes et de fonctionnalités décidées selon le JCP. • Fin 2006 et courant 2007, SUN entreprend d’expurger son code de toute partie pouvant poser problème en matière de propriété intellectuelle et place le code obtenu sous licence GNU/GPL ; • en 2009, Oracle rachète SUN, ce qui questionne les communautés libres sur l’avenir de Java mais aussi sur celui de MySQL dont SUN était propriétaire par le rachat de la compagnie MySQL AB en 2008. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 178 1 Introduction à Java ' 1.3 Caractéristiques $ 1.3 Caractéristiques Objet # 12 Exécuté par une machine virtuelle Permettant d’écrire des programmes robustes Simple : C comme syntaxe de base Sûr, multi-activité, réparti & % Nous détaillons certains de ces points dans les diapositives suivantes. Nous ne traitons pas des parties sûreté, multi-activité et répartition. Ces sujets sont, en effet, trop avancés pour ce cours. Certains sont abordés en troisième année dans les VAP ASR (« Applications et Services informatiques Répartis ») ou SSR (« Sécurité des Systèmes et des Réseaux »). ' $ 1.3.1 Java un langage Objet Tout est classe sauf les types primitifs (int, float, double, etc.) Tout objet est manipulé à travers une référence # 13 La spécialisation est simple entre les classes Toutes les classes dérivent de java.lang.Object Les tableaux sont construits à partir d’une classe particulière L’API (en anglais, Application Programming Interface) est un ensemble de classes & % Java est un langage orienté objet. La notion de classe est centrale dans ce langage et tout le code est contenu dans des classes. Seules les variables de type primitif ne sont pas des objets. Les types primitifs correspondent aux types du langage C. Ces types primitifs servent à créer des variables locales dans les méthodes et des attributs pour les classes. Les objets ne sont pas manipulés directement mais à travers des pointeurs dé-référencés de manière automatique et appelés références. Nous présentons l’implication de cette propriété relativement aux égalités Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 179 1 Introduction à Java 1.3 Caractéristiques et aux copies d’objets dans la section 6.2.1. Comme tous les langages orientés objet, Java supporte la généralisation spécialisation. Pour simplifier la réalisation, Java ne permet que la généralisation spécialisation simple, c’est-à-dire qu’une classe dérive d’une classe et d’une seule. Toutes les classes dérivent d’une classe racine appelée java.lang.Object. Cette classe définit des comportements stéréotypés dont nous reparlons de manière approfondie dans le section 6.2. Les tableaux sont des objets traités de manière particulière. Ils sont construits à partir d’une classe qui est manipulée par l’environnement de programmation. L’ensemble des bibliothèques de fonctions est réalisé à base de classes. $ ' 1.3.2 Machine Virtuelle Java Les compilateurs génèrent du code intermédiaire (en anglais, bytecode) Ce code intermédiaire est interprété par les « Java Virtual Machines » (JVM) Modèle « compile once execute everywhere » Java Virtual Machine (JVM) : # 14 s’exécutent sur les systèmes d’exploitation (par exemple avec la commande java) ou sont intégrées dans les navigateurs Web Sémantique du langage plus stricte que celle du langage C Taille et domaine de valeur des types primitifs identiques sur toutes les plate-formes Code source Unicode (accents et autres glyphes) Bibliothèques standards riches & % La portabilité du code Java a toujours été un objectif pour ses concepteurs. Cette portabilité n’a pas toujours été parfaite mais elle est bien plus grande que celle des langages des générations précédentes. Contrairement à une chaîne de compilation de langage C qui génère du code directement exécutable sur un processeur, un compilateur Java génère du code intermédiaire appelé en anglais bytecode. Ce code est contenu dans un fichier dont le suffixe est .class. Un fichier .class peut être chargé par une machine virtuelle Java et interprété par celle-ci. Le code intermédiaire est totalement indépendant de la machine sur laquelle il a été généré. Il est aussi indépendant du compilateur qui l’a produit. Ce code permet de recréer le fichier source facilement. Le modèle de compilation est appelé en anglais « compile once, execute everywhere ». Les tailles et les domaines de valeur des types primitifs sont identiques sur toutes les plates-formes. Ainsi, quelle que soit l’architecture matérielle sur laquelle le programme s’exécute, un entier utilisé par un programme Java possède une taille identique. Le principe du bytecode date des années 1980 avec son introduction dans certains compilateurs du langage Pascal. Il se retrouve aussi aujourd’hui dans l’ensemble de la chaîne de compilation de Microsoft associée aux langages C et C#. Les JVM s’exécutent directement sur les systèmes d’exploitation. C’est par exemple la commande java sous Linux. Elles peuvent être embarquées dans les navigateurs Web. La sémantique du langage Java est plus contraignante que celle du langage C. Par exemple, il est obligatoire d’avoir une expression booléenne dans un test. Le code source des classes peut être écrit en caractères Unicode. La collaboration entre développeurs préconise l’utilisation de variables dont le nom est compréhensible par le plus grand nombre. Comme nous le verrons dans la section 6, les bibliothèques standards sont très nombreuses. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 180 Introduction au langage de programmation Java ' 1 Introduction à Java $ 1.3.3 Robustesse Conçu pour du logiciel embarqué Gestion de la mémoire avec ramasse miettes (en anglais, garbage collector ) Pas d’accès à la mémoire physique # 15 Gestion des erreurs par exception (voir section 7) Contrôle des types à l’exécution Compilateurs stricts et prévenants par exemple : Avertissement lorsqu’une variable est affectée et non utilisée Erreur à l’utilisation de variables non initialisées Erreur lorsque les exceptions ne sont pas gérées & % Le langage Java permet de réaliser des programmes robustes. Il a été conçu pour réaliser des logiciels embarqués. Il tend à pallier les difficultés dues à la gestion de la mémoire en C ou C++. Pour cela, le langage est doté d’un ramasse miettes. Les allocations d’objets sont dynamiques et la récupération de l’espace mémoire inutilisé est réalisée par ce ramasse miettes (Garbage Collector ou GC). Les langages modernes sont dotés de ramasse miettes. Le GC est déclenché lorsque la mémoire disponible de la JVM est faible ou périodiquement. Le GC est un processus qui consomme du temps et il doit être contrôlable pour permettre des applications de type temps réel. Contrairement au langage C, il n’est pas possible d’adresser directement une zone mémoire physique à partir d’un programme Java. Comme nous le verrons dans la section 7, la gestion des erreurs est réalisée en utilisant un mécanisme qui permet de signaler l’erreur en un point du programme et de traiter cette erreur en un autre point. Le flot de contrôle des erreurs est matérialisé par des instructions de contrôle particulières que nous présentons dans la section 7. Il n’existe pas d’équivalent à l’édition de liens pour produire un binaire exécutable. En Java, un programme est composé d’un ensemble de fichiers de bytecode interprétables par la JVM. La JVM charge ces fichiers, que l’on appelle aussi classes, à partir de leurs noms comme nous le décrirons dans la section 5.6. La JVM réalise des contrôles de type au même titre que le compilateur lorsqu’elle charge une classe. Les classes peuvent aussi être télé-chargées. Dans ce cas, elles sont vérifiées à partir d’une chaîne de certification. Les classes télé-chargées sont exécutées dans un environnement limité. Par exemple, elles ne peuvent pas accéder au système de fichiers. Le compilateur Java est plus strict qu’un compilateur C. Par exemple, il n’autorise pas l’utilisation d’une variable si elle n’a pas été explicitement initialisée. Il émet des avertissements si une variable est affectée mais non utilisée. Il interdit aussi que les exceptions ne soient pas traitées. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 181 1 Introduction à Java ' 1.5 Environnements de développement $ 1.4 Historique de l’API Années de réalisation, et nombre de classes et d’interfaces des versions de Java Java SE 7 2011 : 3 977 Java SE 6 2007 : 3 777 # 16 J2SE 5.0 2004 : 3 270 J2SE 1.4 2002 : 2 723 J2SE 1.3 2000 : 1 840 J2SE 1.2 1998 : 1 524 JDK 1.1 1997 : 477 JDK 1.0 1996 : 211 & % Outre les évolutions du langage, les bibliothèques de programmation associées à Java ont crû de manière impressionnante, passant de 211 classes et interfaces dans la première version stable à presque 4000 dans la version actuelle. Nous verrons de ces bibliothèques quelques classes indispensables et dont les caractéristiques stéréotypées vous permettront d’aborder d’autres bibliothèques si le besoin se présente. ' $ 1.5 Environnements de développement # 17 Java Development Kit : compilateur, JVM, Appletviewer... Eclipse, NetBeans, Jbuilder, Visual J++... & % Les environnements de programmation permettant de programmer en Java sont nombreux. Nous utiliserons pendant les travaux pratiques le JDK et l’environnement eclipse. L’utilisation du JDK nous permet de matérialiser l’étape de compilation du bytecode puis l’exécution dans l’environnement de la machine virtuelle. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 182 Introduction au langage de programmation Java ' 1 Introduction à Java $ 1.5.1 Java Standard Development Kit javac : compilateur java : JVM interpréteur de bytecode javadoc : générateur de documentation # 18 appletviewer : environnement pour applet javah : générateur d’entêtes pour mélange avec code natif en C (JNI) javap : désassembleur de code intermédiaire jdb : dévermineur javakey : générateur de clés pour signer le code & % Le JDK permet de matérialiser les différentes parties de la chaîne de production utilisée dans le développement d’un programme Java. Ainsi, il est nécessaire de traduire les fichiers contenant du langage Java en des fichiers contenant du bytecode. C’est le rôle du compilateur (javac). La commande java est la machine virtuelle dans laquelle le bytecode peut s’exécuter. La commande javadoc permet d’extraire la documentation du code pour réaliser des pages semblables à celles de la documentation des bibliothèques. La commande appletviewer permet d’exécuter du code destiné à être interprété dans un navigateur Web. Ce type de code est appelé applet. $ ' 1.6 En savoir plus Java Series : http://docs.oracle.com/javase// The Java Tutorial, Campione, Walrath, 5th edition, 2013, The Java Programming Language, Arnold, Gosling, Holmes, 5th edition, 2013, The Java Language Specification, J. Gosling, B. Joy, G. Steele, G. Bracha, A. Bukley, 4th edition, 2013, # 19 The Java Virtual Machine Specification, T. Lindholm, F. Yellin, G. Bracha, A. Bukley, 3rd edition, 2013 Livres D. Flanagan, « Java in a Nutshell : A Desktop Quick Reference, 5th Edition », O’Reilly, 2005 D. Flanagan, « Java Examples in a nutshell : A Tutorial Companion to Java in a Nutshell », 3rd Edition, 2004 P. Niemeyer and J. Knudsen, « Learning Java », O’Reilly, 2005 J. Bloch, « Effective Java, 2nd Edition », Addison Wesley, 2008 & % Les documents du site d’Oracle sont les références écrites par les auteurs du langage ou des personnes de leur équipe. Ils sont accessibles et nous vous recommandons de les consulter pour répondre à vos questions Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 183 Introduction au langage de programmation Java 1 Introduction à Java plutôt que de naviguer dans un océan de questions-réponses plus ou moins appropriées via les moteurs de recherche. Nous pensons aussi que le tutoriel en ligne est bien fait et qu’il mérite que vous y passiez du temps en complément de ce cours. À cette fin nous avons mis ce tutoriel en accès local sur l’URL suivant : http://www-inf.int-evry.fr/cours/java/javatutorial/ Les livres sont les préférés des différents membres de l’équipe pédagogique. ' $ 1.6.1 Sites Web http://moodle.tem-tsp.eu/moodle/view.php?id=26 http://www-inf.it-sudparis.eu/COURS/CSC4002/ # 20 http://http://www.oracle.com/technetwork/java/index.html: Oracle Java(tm) Technology Home Page http://www.javaworld.com: Infos http://www.developer.com/java: Infos Liens & % Voici les sites Webs qui vous permettront de gagner du temps dans votre apprentissage. Les deux premiers représentent les liens vers les ressources pédagogiques propres à ce cours. Les autres sont des points d’entrée vers des sites riches en informations et en exemples de programmes en Java. ' $ Questions sur les concepts Java En Java tout est-il objet ? # 21 La machine virtuelle Java : garantit-elle l’uniformité des variables de type primitif ? met-elle en œuvre la gestion mémoire et en particulier le ramasse miettes ? & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 184 Introduction au langage de programmation Java ' 2 Concepts de bases de Java $ 2 Concepts de bases de Java # 22 2.1 2.2 2.3 2.4 2.5 Syntaxe de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Types Primitifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Exemple de passage d’arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 & % Cette partie se concentre sur les bases du langage Java. Nous supposons que vous connaissez le langage C. Dans cette partie, nous focalisons notre attention sur les concepts nouveaux et les différences relativement à ce langage connu. Cette partie permet de traduire les algorithmes. La partie 1 « Bien commencer en Java » du site du zéro sur Java (http:http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-java) correspond aux notions que nous présentons ici. Son parcours est recommandé à ceux qui n’ont pas programmé depuis longtemps. ' $ 2.1 Syntaxe de base Syntaxe de base C Instructions de contrôle : if, switch, for, while, do while Opérateurs : tous les opérateurs du C par exemple, + - / * %, # 23 Blocs, instructions simples : {}, « ; » Quelques différences final remplace const espaces de nommage plus nombreux : classe, fichier, groupe de classes private remplace static static prend un sens associé au concept de classe & % La syntaxe de base du langage est inspirée de celle du langage C. L’ensemble des instructions de contrôle du langage C est repris. Les opérateurs sont identiques. Les blocs d’instructions sont semblables. Ainsi, un programmeur connaissant le langage C trouve la syntaxe familière et comprend rapidement les algorithmes mis en œuvre. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 185 2 Concepts de bases de Java 2.1 Syntaxe de base Une syntaxe nouvelle pour l’instruction de boucle for est utilisée pour faciliter l’écriture des parcours de collections. Elle est détaillée dans la section 6.5.9. Il existe de nombreuses différences sur l’utilisation de mots réservés et en particulier des mots final, static et private. Nous étudierons ces différences dans leurs différents contextes durant ce cours. ' $ 2.1.1 Premier en C 1 2 3 #i n c l u d e < s t d l i b . h> #i n c l u d e < s t d i o . h> t y p e d e f enum { FAUX=0 , VRAI=1 } B o o l e e n ; 4 5 6 s t a t i c B o o l e e n e s t P r e m i e r ( i n t nombre ) { i n t b o r n e=nombre / 2 ; 7 i f ( nombre==1) r e t u r n FAUX ; f o r ( i n t p r e d =2; p r e d<=b o r n e ; p r e d++) { i f ( nombre%p r e d ==0) { r e t u r n FAUX ; } } r e t u r n VRAI ; 8 9 # 24 10 11 12 13 14 15 } 16 17 18 19 20 i n t main ( ) { int nb ; p r i n t f ( " S a i s i r ␣ une ␣ v a l e u r ␣>␣ 0 ␣ : ␣ " ) ; s c a n f ( "%d " , &nb ) ; 21 i f ( nb<=0) { 22 # 25 & % ' $ 23 p r i n t f ( " E r r e u r ␣ de ␣ s a i s i e \n " ) ; 24 return EXIT_FAILURE ; 25 } 26 p r i n t f ( " Le ␣ nombre ␣%d␣ " , nb ) ; 27 i f ( e s t P r e m i e r ( nb ) ) { p r i n t f ( " e s t ␣ p r e m i e r \n " ) ; 28 } else { 29 p r i n t f ( " n ’ e s t ␣ p a s ␣ p r e m i e r \n " ) ; 30 } 31 r e t u r n EXIT_SUCCESS ; 32 33 } & % Dans cet exemple nous reprenons un exercice simple d’algorithmique qui consiste à saisir un nombre entier et à déterminer si ce nombre est premier. Vous pouvez noter de grandes similitudes sur la partie algorithme des deux programmes en C et en Java. La différence majeure entre les deux versions de la méthode estPremier tient au fait qu’en langage C, il n’existe pas de type correspondant à une valeur booléenne. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 186 2 Concepts de bases de Java ' 2.1 Syntaxe de base $ 2.1.2 Premier en Java 1 2 3 4 5 6 7 8 9 # 26 10 11 12 13 14 15 16 17 18 19 20 21 22 package c o m p l e m e n t s . commeenc ; public c l a s s Premier { p r i v a t e s t a t i c b o o l e a n e s t P r e m i e r ( f i n a l i n t nb ) { i f ( nb == 1 ) { r e t u r n f a l s e ; } f o r ( i n t i =2; i <= nb / 2 ; i ++) { i f ( nb%i == 0 ) { return false ; } } return true ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { i n t nombre = C o n s o l e . r e a d I n t ( " E n t r e z ␣ un ␣ nombre ␣ e n t i e r " ) ; System . o u t . p r i n t l n ( " Le ␣ nombre ␣ " + nombre + " ␣ e s t − i l ␣ p r e m i e r ␣ ? " ) ; System . o u t . p r i n t ( " Le ␣ nombre ␣ " + nombre ) ; i f ( e s t P r e m i e r ( nombre ) ) { System . o u t . p r i n t l n ( " ␣ e s t ␣ p r e m i e r " ) ; } else { System . o u t . p r i n t l n ( " ␣n ’ e s t ␣ p a s ␣ p r e m i e r " ) ; } } } & % Dans l’exemple précédent, nous avons besoin de réaliser des entrées au clavier. Cette opération est relativement complexe, car elle utilise des classes de l’interface standard Java. C’est pourquoi, nous avons réalisé la classe utilitaire Console pour masquer la complexité de ces opérations et fournir des méthodes simples pour obtenir des nombres entiers ou des chaînes de caractères du flux d’entrée. Le code de cette classe est donné ci-après, vous n’aurez les connaissances nécessaires pour la comprendre que vers la fin du module. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 package complements . commeenc ; import j a v a . i o . ∗ ; /∗∗ ∗ Permet de l i r e d e s nombres e t d e s c h a i n e s de c a r a c t e r e s ∗ au c l a v i e r . ∗/ public c l a s s C o n s o l e { /∗∗ ∗ La c o n s o l e e s t un f l o t de c a r a c t e r e s b u f f e r i s e . ∗/ private s t a t i c B u f f e r e d R e a d e r c o n s o l e = new B u f f e r e d R e a d e r (new I n p u t S t r e a m R e a d e r ( System . i n ) ) ; /∗∗ ∗ A f f i c h e un message a l ’ ecran s ans f i n de l i g n e . ∗ @param prompt Message a a f f i c h e r ∗/ public s t a t i c void p r i n t P r o m p t ( f i n a l S t r i n g prompt ) { System . o u t . p r i n t ( prompt + " ␣ " ) ; System . o u t . f l u s h ( ) ; } /∗∗ ∗ L e c t u r e d ’ une c h a i n e de c a r a c t e r e s au c l a v i e r . La c h a i n e ne ∗ c o n t i e n t pas l e c a r a c t e r e ’ f i n de l i g n e ’ . En c a s de f i n de ∗ f i c h i e r ou d ’ e r r e u r , l a c h a i n e r e t o u r n e e v a u t <code>n u l l </code >. ∗ @return La c h a i n e l u e ∗/ public s t a t i c S t r i n g r e a d L i n e ( ) { String r = " " ; try { r = console . readLine ( ) ; } catch ( I O E x c e p t i o n e ) { r = n u l l ; } return r ; } /∗∗ ∗ L e c t u r e d ’ une c h a i n e de c a r a c t e r e s au c l a v i e r a vec a f f i c h a g e d ’ un ∗ prompt . ∗ @param prompt Message a a f f i c h e r ∗ @return La c h a i n e l u e ∗ @see #printPrompt ( S t r i n g ) ∗ @see #r e a d L i n e ( ) ∗/ public s t a t i c S t r i n g r e a d L i n e ( f i n a l S t r i n g prompt ) { p r i n t P r o m p t ( prompt ) ; return r e a d L i n e ( ) ; } Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 187 2 Concepts de bases de Java 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 } 2.2 Types Primitifs /∗∗ ∗ L e c t u r e d ’ un e n t i e r au c l a v i e r . ∗ @param prompt Message a a f f i c h e r ∗ @return L ’ e n t i e r l u ∗ @ e x c e p t i o n NumberFormatException en c a s d ’ e r r e u r ∗/ public s t a t i c i n t r e a d I n t ( f i n a l S t r i n g prompt ) throws NumberFormatException { p r i n t P r o m p t ( prompt ) ; return I n t e g e r . v a l u e O f ( r e a d L i n e ( ) . t r i m ( ) ) . i n t V a l u e ( ) ; } /∗∗ ∗ L e c t u r e d ’ un d o u b l e au c l a v i e r . ∗ @param prompt Message a a f f i c h e r ∗ @return Le d o u b l e l u ∗ @ e x c e p t i o n NumberFormatException en c a s d ’ e r r e u r ∗/ public s t a t i c double r e a d D o u b l e ( f i n a l S t r i n g prompt ) throws NumberFormatException { p r i n t P r o m p t ( prompt ) ; return Double . v a l u e O f ( r e a d L i n e ( ) . t r i m ( ) ) . d o u b l e V a l u e ( ) ; } $ ' 2.2 Types Primitifs pas des classes # 27 short(2 octets), int (4 octets), long (8 octets) float (4 octets), double (8 octets) boolean (true/false), byte (1 octet), char (2 octets) Variables déclarées n’importe où dans un bloc & % Les types primitifs ne sont pas des classes. Ils permettent de définir des variables ou des attributs. Comme nous l’avons dit dans la section précédente, les tailles et domaines de valeurs sont définis strictement. Vous retrouvez les types communs correspondant aux nombres entiers signés du langage C : short, int, long. Les nombres en virgule flottantes float et double sont conformes à la norme IEEE 754. Le type boolean est nouveau. Il ne peut prendre que les valeurs true ou false. Le type byte correspond au type char du langage C. C’est un type entier exprimé sur 8 bits en complément à 2 dont la valeur peut varier de -128 à +127. Le type char quant à lui est utilisé pour contenir un caractère codé sur 16 bits en Unicode. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 188 2 Concepts de bases de Java ' 2.2 Types Primitifs $ 2.2.1 Conversions de type Conversions sur les types primitifs : # 28 Conversions sûres OK (d’un type vers un type plus complexe) Conversions non sûres (d’un type vers un type plus pauvre) nécessitent un transtypage (en anglais, cast) explicite & % Les conversions entre types primitifs sont plus strictes qu’en langage C. Ainsi, les conversions qui vont d’un type simple vers un type plus complexe sont acceptées. Cependant, celles qui vont d’un type complexe vers un type plus simple doivent être associées à un transtypage explicite. ' $ 2.2.2 Exemple de conversions 1 p u b l i c c l a s s CastExampleFixed { p u b l i c s t a t i c v o i d main ( f i n a l 2 # 29 String [ ] args ) { i = 2127272 ; // 0 x002075A8 3 int 4 l o n g m; 5 short s ; 6 byte b ; 7 m = i ; // p r o m o t i o n OK 8 // E x p l i c i t c a s t n e e d e d i = ( i n t ) m; 9 10 s = ( s h o r t ) i ; // 0 x75A8 11 b = ( byte ) i ; 12 System . o u t . p r i n t l n ( "m=␣ " + m + " ; ␣ s=␣ " + s + " ; ␣b=␣ " + b ) ; } 13 14 // 0xA8 } Résultat de l’exécution : m= 2127272; s= 30120; b= -88; & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 189 Introduction au langage de programmation Java ' 2 Concepts de bases de Java $ 2.2.3 Tableaux Les tableaux sont des objets Leur taille est fixe # 30 Leur taille est allouée dynamiquement par l’utilisation du mot réservé new L’accès aux entrées est identique à celle en langage C une fois l’allocation faite Erreur d’accès en cas de dépassement de taille & % Nous avons dit précédemment que les tableaux étaient des objets. Ils n’ont pas la capacité à changer de taille, mais ils doivent être alloués dynamiquement. Ils sont traités de manière à empêcher les erreurs d’accès relativement au nombre d’entrées qu’ils contiennent. $ ' 2.2.4 Exemple avec un tableau 1 p u b l i c c l a s s ArrayExample { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] 2 # 31 a r r a y O f I n t ; // o r args ) { 3 int [] i n t a r r a y O f I n t [ ] ; // d e c l a r a t i o n de l a v a r i a b l e a r r a y O f I n t 4 a r r a y O f I n t = new i n t [ 4 2 ] ; // c r e a t i o n du t a b l e a u e t a s s o c i a t i o n a a r r a y O f I n t 5 a r r a y O f I n t [ 0 ] = 3 ; // a f f e c t a t i o n d ’ un e l e m e n t du t a b l e a u 6 7 System . o u t . p r i n t l n ( " A r r a y ␣ l e n g t h ␣ "+ a r r a y O f I n t . l e n g t h ) ; // o b t e n t i o n de l a 8 System . o u t . p r i n t l n ( a r r a y O f I n t [ 4 2 ] ) ; } 9 10 t a i l l e du t a b l e a u ( 4 2 ) // i m p o s s i b l e l e v e e d ’ un e x c e p t i o n } Résultat de l’exécution : Array length 42 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 42 at ArrayExample.main(ArrayExample.java:8) & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 190 Introduction au langage de programmation Java ' 2 Concepts de bases de Java $ 2.3 Tableaux Déclaration de la référence int[] arrayOfInt; // or int arrayOfInt[]; Création avec association de taille # 32 arrayOfInt = new int[42]; Taille int t = arrayOfInt.length; Compatibilité avec C : int[] primes = {1, 2, 3, 5, 7, 7+4}; & % Les tableaux sont des objets gérés de manière particulière par l’infrastructure du langage. Les variables de type tableau sont déclarées comme des références et ne sont pas associées à l’espace mémoire correspondant. La création d’un tableau est réalisée par l’appel du mot réservé new. C’est à ce moment que la taille du tableau est fixée et que la référence est associée à l’objet tableau. La taille d’un tableau est connue en accédant à l’attribut en lecture seule length. La syntaxe du langage Java pour accéder à un attribut ou une méthode associée à un objet correspond à celle du langage C pour accéder à un membre d’une structure : le point (« . ») permet de passer de la référence de l’objet à ses attributs ou méthodes. Nous approfondirons ceci dans la section 3. Pour des raisons de compatibilité ascendantes avec le langage C, les tableaux initialisés sont acceptés lors de la définition de la référence. ' $ 2.4 Méthodes Nom donné aux opérations Méthodes associées aux classes (pas de méthode sans classe) Surcharge (en anglais, overloading) des méthodes possible # 33 Méthode d’instance Méthode de classe avec mot réservé static Prototype de la méthode public static void main(final String []) Passage d’arguments Par valeur pour les types primitifs Par référence pour les objets et les tableaux & % Ce que vous connaissez sous le concept de fonction en langage C (partie de code, associée à une liste Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 191 Introduction au langage de programmation Java 2 Concepts de bases de Java de paramètres et un type de retour) est appelé opération en UML et méthode en Java ainsi que dans de nombreux langages objets. En Java, les méthodes ne sont pas définies dans un seul espace de nommage comme en langage C. Chaque méthode est définie à l’intérieur d’une classe. Dans une classe les méthodes sont identifiées par leur nom et la liste de leurs paramètres, ce qui donne la possibilité d’avoir plusieurs méthodes dans une classe qui portent le même nom mais qui travaillent sur des paramètres de types différents. Cette possibilité est appelée surcharge de méthodes (overloading en anglais). Dans le cas le plus courant, les méthodes sont associées aux objets d’une classe. Elles sont utilisées à travers une référence d’objet. Nous approfondirons ceci dans le chapitre 3. Les méthodes de ce type sont appelées méthodes d’instance car elles agissent sur un objet à la fois. Les méthodes peuvent aussi être associées à la classe lorsqu’elles sont qualifiées de static, comme les méthodes que nous avons vues jusqu’à maintenant, et en particulier la méthode main. Ce type de méthode est dit de classe. Ces méthodes de classe peuvent être utilisées directement en associant le nom de la classe et le nom de la méthode reliés par un point comme dans Math.sqrt(4). La méthode de classe public static void main(String []) joue un rôle identique à la méthode int main(int argc, char *argv[]) du langage C. Elle sert de point d’entrée pour un programme. Les variables de type primitif sont passées par copie de la valeur. Les variables de type tableau ou objet sont manipulées en Java à travers une référence. Lors du passage d’une référence à une méthode, cette référence permet de manipuler l’objet d’origine. Ainsi toute modification réalisée à travers une référence dans une méthode appelée modifie l’objet qui est référencé de manière visible par la méthode appelante. $ ' 2.5 Exemple de passage d’arguments 1 p u b l i c c l a s s EssParm { p r i v a t e s t a t i c v o i d add ( i n t c , 2 i n t [ ] as ) { 4 a s [ 0 ] ++; 5 System . o u t . p r i n t l n ( " add ␣ : ␣ c=" + c + " , ␣ a s [ 0 ] = " + a s [ 0 ] ) ; 6 } 7 p u b l i c s t a t i c v o i d main ( f i n a l int 8 # 34 final c++; 3 i n t s [ ] = new i n t [ 1 0 ] ; 9 10 s [0] = 0; 11 add ( i , s ) ; System . o u t . p r i n t l n ( " main ␣ : ␣ i=" + i + " , ␣ s [ 0 ] = " + s [ 0 ] ) ; 12 } 13 14 String argv [ ] ) { i = 0; } Résultat de l’exécution : add : c=1, as[0]=1 main : i=0, s[0]=1 & % Les variables de type primitif sont passées par copie. La modification de la copie c de la variable i dans la méthode add n’a pas de répercussion sur la valeur de la variable i. La variable c est donc bien une variable différente de la variable i. Cette variable a été initialisée avec la valeur de la variable i lors de l’appel. Dans notre exemple les variables s et as font référence au même tableau. Ainsi, lorsque l’entrée 0 du tableau est modifiée dans la méthode add en utilisant la variable as, l’entrée correspondante vue à travers la variable s paraît modifiée de manière identique. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 192 Introduction au langage de programmation Java ' 2 Concepts de bases de Java $ Questions sur la syntaxe de base de Java En Java un fichier source peut-il contenir des méthodes ? Dans un bloc d’instructions (partie entre accolades) : la ligne suivante est-elle acceptable en C et en Java ? # 35 int a = 0, b = 1, c; la ligne suivante est-elle acceptable en C et en Java ? if ( a = b ) { c = a; } L’accès à un élément de tableau est-il réalisé de manière identique en C et en Java ? & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 193 3 Classes et objets en Java ' 3.1 Classe $ 3 Classes et objets en Java # 36 3.1 3.2 3.3 3.4 Classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Attributs et méthodes de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Association entre classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 & % Cette section décrit la syntaxe du langage Java relative à la création des classes et à celle des objets. Elle s’appuie sur la connaissance de base des notations UML relatives aux classes et aux objets. ' $ 3.1 Classe Classe Personne en UML # 37 & % Ce schéma décrit plusieurs notations possibles en UML de la classe Personne du cas d’étude Studs. La partie gauche contient la description des attributs et des opérations. C’est ce schéma que nous traduisons en Java dans la diapositive suivante. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 194 3 Classes et objets en Java ' 3.1 Classe $ 3.1.1 Classe Personne en Java 1 package s t u d s ; 2 p u b l i c c l a s s Personne { p r i v a t e S t r i n g nom , prenom ; 3 4 private int nbParticipations = 0 , nbOrganisations = 0; 5 p u b l i c Personne ( f i n a l # 38 String n , final 7 } 8 public void voter ( f i n a l 9 public void c o n s u l t e r R e s u l t a t ( f i n a l B u l l e t i n b ){ } Scrutin s ) { 10 public void seRetirerDUnScrutin ( f i n a l 11 @Override 12 public String toString (){ Scrutin s ) { } } r e t u r n " P e r s o n n e ␣ " + nom + " , ␣ "+ prenom +" , ␣ "+ n b O r g a n i s a t i o n s + " , ␣ " + n b P a r t i c i p a t i o n s ; 13 } 14 15 String p) { nom = n ; prenom = p ; 6 } & % Une description de classe commence par une ligne contenant le mot réservé class. Lorsque la classe est publique, le fichier qui contient celle-ci doit porter un nom identique à la classe : dans notre cas, le fichier doit s’appeler Personne.java. Nous décrivons plus précisément ce qu’est un paquetage qui correspond à la première ligne contenant le mot réservé package dans la section 5.6. De même, nous présentons les possibilités associées à la visibilité par l’utilisation des mots réservés public et private dans la section 5.7. De manière traditionnelle, une classe commence par la description des attributs. Comme nous l’avons vu en UML, les attributs peuvent être spécifiques à chaque objet. Ce sont des attributs d’instance. Ils peuvent aussi être partagés entre tous les objets de la classe. Ce sont des attributs de classe. Nous détaillons ces points à partir de la section 3.3. Les attributs peuvent correspondre à des types primitifs ou non. Dans notre cas, la variable nbParticipations est du type primitif int. La variable nom est une référence sur un objet de la classe java.lang.String, que nous approfondirons dans le chapitre 6. Les attributs d’instance sont le plus souvent initialisés par une méthode appelée constructeur et qui porte le même nom que la classe. Nous en reparlons de manière approfondie dans la section 3.2.1. Une classe définit les comportements de ses objets à travers des méthodes d’instance. Une méthode d’instance réalise une opération s’appliquant sur les attributs d’un objet. C’est le cas dans notre exemple des méthodes : voter, consulterResultat, et seRetirerDUnScrutin. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 195 3 Classes et objets en Java ' 3.1 Classe $ 3.1.2 Instance de classe en UML # 39 & % Cette figure représente en UML une instance de la classe Personne. Elle précise les valeurs des attributs. Elle donne aussi la possibilité de nommer l’objet. ' $ 3.1.3 Instance de classe en Java 1 import studs . Personne ; 2 class InitPersonne { p u b l i c s t a t i c v o i d main ( f i n a l 3 # 40 String [ ] args ) { 4 Personne j ; // r e f e r e n c e 5 j = new P e r s o n n e ( " Dupont " , " J u l i e n " ) ; // i n s t a n c e c r e a t i o n 6 System . o u t . p r i n t l n ( j ) ; } 7 8 } Résultat de l’exécution : studs.Personne@f62373 & % Cet exemple montre la création d’un objet de la classe Personne. La première ligne du fichier contient une directive import qui permet de nommer plus facilement la classe Personne. Nous approfondissons les explications sur import dans la section 5. Ce code est contenu dans une classe appelée InitPersonne. Cette classe est dotée d’une méthode publique, statique appelée main et recevant comme argument un tableau de chaînes de caractères. Elle peut servir de point d’entrée à l’exécution du programme. La ligne 4 définit une variable locale appelée j qui permet de référencer un objet de la classe Personne. L’instance est créée à la ligne 5 par l’appel du mot réservé new suivi d’un appel au constructeur de la classe Personne. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 196 3 Classes et objets en Java 3.2 Objet L’instance est ensuite manipulée à partir de la référence j comme dans l’appel de la méthode println, ligne 6. ' $ 3.2 Objet # 41 Création d’un objet Disposer d’une référence : Personne p; Créer l’objet : new + appel à un constructeur I p = new Personne("Dupont", "Julien"); & % Pour manipuler un objet, il est nécessaire de disposer d’une référence qui correspond à la classe de l’objet. Il faut ensuite créer un objet. Pour ceci, le mot réservé new est suivi d’un appel à l’un des constructeurs de la classe de l’objet. C’est à cet endroit que les paramètres qui servent à initialiser les attributs sont fournis. Une fois créé, l’objet n’est jamais manipulé directement mais toujours à travers une référence. $ ' 3.2.1 Constructeurs en Java Méthode particulière : Nom identique à la classe Aucun type de retour # 42 Appelé directement à travers new Si aucun constructeur n’est spécifié, le compilateur en fabrique un par défaut qui initialise les attributs à 0 (correspondant à leur type) La surcharge des méthodes (overloading) permet à une classe d’avoir plusieurs constructeurs qui diffèrent par le nombre et le type de leurs arguments & % Les constructeurs sont des méthodes particulières. Ils portent le même nom que la classe. Ils ne peuvent pas être appelés par un appel de méthode classique. De l’extérieur de la classe, ils sont appelés en utilisant le mot réservé new. Les constructeurs n’ont pas de type de retour. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 197 3 Classes et objets en Java 3.2 Objet Comme nous l’avons déjà dit dans le transparent 2.4, le langage Java permet d’avoir plusieurs méthodes portant le même nom dans une classe à la condition que ces méthodes puissent être distinguées à l’aide de leurs paramètres. Cette propriété s’applique aux constructeurs. Ainsi, nous pouvons avoir plusieurs constructeurs avec des listes de paramètres différentes. De l’intérieur de la classe, les constructeurs peuvent s’appeler directement. ' $ 3.2.2 Exemples de constructeurs 1 package s t u d s c t r s ; 2 import studs . B u l l e t i n ; 3 import studs . S c r u t i n ; 4 p u b l i c c l a s s Personne { p r i v a t e S t r i n g nom , prenom ; 5 6 private int nbParticipations = 0 , nbOrganisations = 0; 7 p u b l i c Personne ( f i n a l final String p) { final String p , } 9 # 43 String n , nom = n ; prenom = p ; 8 10 p u b l i c Personne ( f i n a l 11 final String n , i n t nbp , final i n t nbo ) { nom = n ; prenom = p ; 12 n b P a r t i c i p a t i o n s = nbp ; n b O r g a n i s a t i o n s = nbo ; 13 14 } 15 public void voter ( f i n a l 16 public void c o n s u l t e r R e s u l t a t ( f i n a l 17 public void seRetirerDUnScrutin ( f i n a l 18 Bulletin b) { } Scrutin s ) { Scrutin s ) { } } } & % Cette classe contient deux constructeurs. Le premier initialise les attributs nom et prenom et laisse les attributs nbParticipations et nbOrganisations aux valeurs par défaut 0. Le second constructeur initialise les attributs nom et prenom, puis initialise les attributs nbParticipations et nbOrganisations avec les arguments correspondants. ' $ 3.2.3 this this permet de référencer l’instance courante ; # 44 Est associé au concept d’auto-référence de l’objet this permet de décrire un attribut ou une méthode de l’instance courante sans ambiguïté this(...) en tant que méthode fait appel à un constructeur & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 198 3 Classes et objets en Java ' 3.2 Objet $ 3.2.4 Exemples d’utilisation de this 1 package s t u d s t h i s ; 2 import studs . B u l l e t i n ; 3 import studs . S c r u t i n ; 4 p u b l i c c l a s s Personne { 5 p r i v a t e S t r i n g nom , prenom ; 6 private int nbParticipations = 0 , nbOrganisations = 0; 7 p u b l i c Personne ( f i n a l 8 # 45 S t r i n g nom , final S t r i n g prenom ) { t h i s . nom = nom ; t h i s . prenom = prenom ; 9 10 } 11 p u b l i c Personne ( f i n a l 12 final i n t nbp , String n , final final String p , i n t nbo ) { 13 this (n , p ) ; 14 n b P a r t i c i p a t i o n s = nbp ; n b O r g a n i s a t i o n s = nbo ; 15 } 16 void voter ( f i n a l 17 void c o n s u l t e r R e s u l t a t ( f i n a l 18 void seRetirerDUnScrutin ( f i n a l 19 B u l l e t i n b ){ } Scrutin s ) { Scrutin s ) { } } } & % L’utilisation de this à la ligne 10 de cette diapositive permet de distinguer l’attribut de l’objet courant this.nom, du paramètre nom du constructeur. Cette pratique est courante car les programmeurs utilisent souvent le même nom pour l’attribut et pour le paramètre qui permet de l’initialiser. Quant à la ligne 12 this(n,p), elle correspond à l’appel du constructeur de la ligne 6. Cette pratique est courante afin de factoriser le code. $ ' 3.2.5 Destruction des objets Pas de technique particulière pour détruire un objet Objet détruit lorsqu’il n’est plus référencé Utilisation d’un ramasse miettes # 46 Le Garbage Collector détruit les objets non référencés La destruction est asynchrone Il n’y a pas de garantie sur la destruction (le programme peut se terminer avant que l’objet ne soit détruit) Si la classe décrit une méthode appelée finalize, cette méthode est appelée avant la libération de la mémoire de l’objet & % Comme nous l’avons dit dans l’introduction, le langage Java a été pensé pour pallier les principales difficultés du langage C++ et en particulier, les erreurs associées à la gestion des références vers les objets. Il est en effet difficile de garantir qu’un objet est désalloué lorsqu’il n’est plus utilisé. Les langages modernes et Java en particulier prennent à leur charge la gestion des allocations et des libérations de la mémoire en tenant à jour la liste des références vers les blocs alloués. Pour Java, c’est la machine virtuelle Java qui réalise ces opérations et qui met en œuvre un ramasse miettes pour vérifier Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 199 3 Classes et objets en Java 3.2 Objet périodiquement que les objets alloués sont toujours référencés. Lorsque les objets ne sont plus référencés, le ramasse miettes récupère l’espace mémoire qu’ils occupent. Puis, il met cet espace mémoire à la disposition de la création de nouveaux objets. Ce ramasse miettes fonctionne de manière périodique et asynchrone à l’intérieur d’un fil d’exécution séparé de la JVM. Il n’y a pas de garantie qu’un objet soit détruit. Il est possible de déclencher le fonctionnement du ramasse miettes par l’appel à la méthode de classeSystem.gc(). $ ' 3.2.6 Abstraction et encapsulation Une classe correspond aux concepts d’abstraction et d’encapsulation C’est une abstraction car elle présente une interface (ensemble de méthodes) qui permettent d’interagir avec les objets # 47 Une classe encapsule des données (ensemble d’attributs) Pour garantir sa robustesse et son indépendance du reste du code, une classe doit masquer son implantation En particulier, elle ne doit pas permettre la modification de ses attributs sans contrôle & % Une classe correspond aux concepts d’abstraction et d’encapsulation. C’est une abstraction car elle présente une interface qui permet d’utiliser les objets de cette classe. Cette interface est constituée par un ensemble de méthodes. Une classe encapsule des données qui sont un ensemble d’attributs. Pour garantir sa robustesse et son indépendance du reste du code, une classe doit masquer sa réalisation, appelée aussi implantation. Une classe doit permettre l’utilisation de son interface mais protéger ses attributs des modifications. L’accès direct aux attributs d’une classe viole le concept d’information encapsulée dans la classe. Pour prendre un exemple de la vie courante, lorsqu’une montre affiche une heure, nous voyons cet affichage selon la technologie qui est apportée par l’interface (aiguilles, cristaux liquides, diodes lumineuses). Cette interface ne nous laisse pas deviner si la montre est à pile, à quartz, à mouvement mécanique ou autre. De plus, nous ne pouvons pas intervenir directement sur l’endroit qui stocke l’information permettant d’afficher l’heure. Nous ne pouvons qu’accéder à des boutons qui permettent de modifier cette information. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 200 3 Classes et objets en Java ' 3.3 Attributs et méthodes de classe $ 3.2.7 Visibilité des méthodes Les méthodes publiques (public) d’une classe définissent son interface publique # 48 Les méthodes privées (private), ne sont accessibles que depuis l’intérieur de la classe Les méthodes protégées (protected), sont accessibles depuis l’intérieur de la classe et de l’intérieur de ses classes dérivées & % Comme nous le reverrons dans la partie 5.7, les mots réservés public, private et protected peuvent être utilisés sur les méthodes pour permettre leur utilisation de l’extérieur ou uniquement de l’intérieur de la classe. $ ' 3.3 Attributs et méthodes de classe # 49 & % Ce schéma montre une classe qui contient des attributs et des opérations soulignés. Ces attributs et opérations sont partagés par l’ensemble des membres d’une classe. Ils sont appelés attributs ou méthodes de classes alors que les attributs et méthodes qui ne sont pas soulignés sont appelés attributs ou méthodes d’instance. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 201 3 Classes et objets en Java ' 3.3 Attributs et méthodes de classe $ 3.3.1 Attributs et méthodes de classe Java 1 2 3 4 5 6 7 8 9 # 50 10 11 12 13 14 15 16 17 18 19 20 21 22 package s t u d s s t a t ; p u b l i c c l a s s Personne { p r i v a t e S t r i n g nom , prenom ; private int nbParticipations = 0 , nbOrganisations = 0 ; private static int nbTotalParticipations = 0; p u b l i c P e r s o n n e ( f i n a l S t r i n g nom , f i n a l S t r i n g prenom ) { t h i s . nom = nom ; t h i s . prenom = prenom ; } p u b l i c P e r s o n n e ( f i n a l S t r i n g nom , f i n a l S t r i n g prenom , f i n a l i n t nbp , f i n a l i n t nbo ) { t h i s ( nom , prenom ) ; n b P a r t i c i p a t i o n s = nbp ; n b T o t a l P a r t i c i p a t i o n s += nbp ; n b O r g a n i s a t i o n s = nbo ; } public static int getNbTotalParticipations () { return nbTotalParticipations ; } public String toString () { r e t u r n nom + " ␣ " + prenom + " ␣ nbp ␣ " + n b P a r t i c i p a t i o n s + " ␣ nbo ␣ " + n b O r g a n i s a t i o n s + " ␣ n b t ␣ " + nbTotalParticipations ; & % ' $ } 23 24 } 1 import s t u d s s t a t . Personne ; 2 public class TestStaticPersonne { 3 p u b l i c s t a t i c v o i d main ( f i n a l args ) { 5 P e r s o n n e m = new P e r s o n n e ( " M a r t i n " , " M a r i e " , 5 , 1 ) ; 6 System . o u t . p r i n t l n ( j ) ; System . o u t . p r i n t l n (m) ; 7 # 51 String [ ] P e r s o n n e j = new P e r s o n n e ( " Dupont " , " J u l i e n " , 7 , 3 ) ; 4 } 8 9 } Affichage : Dupont Julien nbp 7 nbo 3 nbt 12 Martin Marie nbp 5 nbo 1 nbt 12 & % La traduction du schéma UML est donnée dans le code ci-dessus. Le mot réservé static permet de décrire les attributs ou méthodes de classe. Ces attributs ou méthodes sont partagés par l’ensemble des instances de la classe. Lorsque la visibilité qui leur est associée le permet, ils peuvent aussi être accédés directement en utilisant le nom de la classe suivi d’un point et du nom de l’attribut ou de la méthode. La classe Personne définit une méthode toString qui permet d’obtenir la représentation en chaîne de caractères d’un objet. Nous étudierons avec plus de précision cette méthode dans la partie 6.2. Il est cependant nécessaire de comprendre que l’appel à la méthode System.out.println associée à un objet, fait appel à la méthode toString() de l’objet et affiche la chaîne de caractères ainsi produite. L’affichage montre ainsi que le nombre total de participations est identique dans les deux objets. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 202 3 Classes et objets en Java ' 3.4 Association entre classes $ 3.3.2 Attributs et méthodes de classe Les attributs statiques sont partagés par toutes les instances de la classe Les méthodes statiques ne peuvent accéder qu’aux attributs statiques Il n’est pas nécessaire d’instancier la classe pour accéder à ses membres statiques # 52 Les instances peuvent accéder aux attributs statiques Les instances peuvent invoquer les méthodes statiques Les méthodes statiques ne sont jamais associées à l’auto référence de l’objet (this) Quelques exemples avec la classe java.lang.math : pi = Math.PI; // static attribute ’PI’ b = Math.sqrt(2.0);// method call of static ’sqrt’ & % La classe java.lang.Math est un bon exemple de l’usage qui peut être fait des attributs et des méthodes de classe. Cette classe rassemble les constantes et les méthodes mathématiques les plus utilisées qui se trouvent rassemblées en langage C dans le fichier d’en-têtes /usr/include/math.h et dans le fichier archive /lib/libm.so. Les exemples donnés correspondent à l’utilisation de la variable PI et de la fonction racine carrée. $ ' 3.4 Association entre classes # 53 & % L’extrait de diagramme de classes montre une association entre les classes Personne et Scrutin. Cette association matérialise le fait qu’un participant peut organiser un ou plusieurs scrutins. L’association est bidirectionnelle. Elle matérialise le fait qu’un scrutin est organisé par un participant et un seul. L’instanciation de ce diagramme de classe donne le diagramme d’objets en dessous sur le schéma. Dans ce diagramme d’objets, l’objet référencé par m de la classe Personne organise le scrutin référencé par listeBDE. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 203 3 Classes et objets en Java ' 3.4 Association entre classes $ 3.4.1 Exemple d’association 1 2 3 4 5 6 7 8 9 # 54 10 11 12 13 14 15 16 17 18 19 20 1 package s t u d s o r g ; p u b l i c c l a s s Personne { p r i v a t e S t r i n g nom , prenom ; private int nbParticipations = 0 , nbOrganisations = 0; private Scrutin [ ] scrutinsOrganises ; p u b l i c P e r s o n n e ( f i n a l S t r i n g nom , f i n a l S t r i n g prenom ) { t h i s . nom = nom ; t h i s . prenom = prenom ; s c r u t i n s O r g a n i s e s = new S c r u t i n [ 1 0 ] ; } p u b l i c S c r u t i n o r g a n i s e r S c r u t i n ( f i n a l S t r i n g nom ) { S c r u t i n s = new S c r u t i n ( nom ) ; scrutinsOrganises [ nbOrganisations ] = s ; n b O r g a n i s a t i o n s ++; return s ; } public String toString () { r e t u r n g e t C l a s s ( ) . getName ( ) + " ␣ "+nom+" ␣ "+prenom+" ␣ nbp ␣ " + n b P a r t i c i p a t i o n s + " ␣ nbo ␣ " + n b O r g a n i s a t i o n s ; } } package s t u d s o r g ; & % ' $ 2 public class Scrutin { 3 p r i v a t e S t r i n g nomScrutin ; 4 public Scrutin ( final S t r i n g nom ) { n o m S c r u t i n = nom ; 5 6 } 7 /∗ @see j a v a . l a n g . O b j e c t#t o S t r i n g ( ) 8 @Override 9 public String toString () { ∗/ r e t u r n " S c r u t i n ␣ [ n o m S c r u t i n=" + n o m S c r u t i n + " ] " ; 10 } 11 12 # 55 13 } 1 import s t u d s o r g . ∗ ; 2 public class InitScrutin { p u b l i c s t a t i c v o i d main ( f i n a l 3 String [ ] args ) { 4 Personne p ; // r e f e r e n c e 5 p = new P e r s o n n e ( " Dupont " , " J u l i e n " ) ; // i n s t a n c e c r e a t i o n 6 S c r u t i n bde = p . o r g a n i s e r S c r u t i n ( " E l e c t i o n ␣ bde ␣ 2010 " ) ; 7 System . o u t . p r i n t l n ( bde ) ; } 8 9 } & % Pour modéliser la relation avec les scrutins organisés, nous ajoutons à la classe Personne un tableau de références vers des objets de la classe Scrutin. Le nombre d’entrées valides dans le tableau, est contenu dans la variable nborganisations. La taille du tableau est initialisée à 10 dans le constructeur à la ligne 8 de la classe Personne. Les éléments du tableau sont affectés lorsque le participant organise un nouveau scrutin. C’est la méthode organiserScrutin qui doit créer l’objet de type Scrutin. Pour que cet objet puisse initialiser la relation dans le sens inverse, il doit recevoir la référence sur l’objet qui a fait appel à cette méthode. C’est le rôle du second paramètre du constructeur. Dans la classe Scrutin, le constructeur reçoit en argument la référence vers l’organisateur du scrutin et la mémorise dans l’attribut organisateur à la ligne 8. La classe InitScrutin montre un exemple d’utilisation des deux classes. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 204 Introduction au langage de programmation Java ' 3 Classes et objets en Java $ 3.4.2 Association entre classes en Java Mise en place à l’aide d’attributs Dans l’une ou l’autre des classes selon la navigabilité de l’association # 56 Mise en place au moment de la construction des instances Multiplicité de l’association représentée à l’aide d’un tableau ou d’une collection Difficulté lorsque l’association est bidirectionnelle, par quoi commencer ? Utilisation d’une méthode qui permet d’affecter un attribut d’une classe en dehors du constructeur Passage de la référence d’un des objets dans l’appel au constructeur de l’autre & % La mise en place de l’association est le plus souvent réalisée par le constructeur de la classe qui doit recevoir en paramètre la référence de l’objet de l’autre classe. Lorsque l’association est bidirectionnelle, il est nécessaire de passer la référence d’un objet à l’autre et réciproquement. Ce type de constructeur est expliqué dans la section 8.1. $ ' Questions sur les classes et objet Les attributs d’instance d’une classe servent-ils à représenter l’état des objets de la classe ? # 57 Les objets sont-ils créés par l’appel à un constructeur de la classe ? Dans la section 3.3.1, est-il légal d’écrire : ligne 12 this.nbParticipations au lieu de nbParticipations ligne 17 this.nbTotalParticipations au lieu de nbTotalParticipations & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 205 Introduction au langage de programmation Java ' 4 Généralisation spécialisation en Java $ 4 Généralisation spécialisation en Java # 58 4.1 4.2 4.3 4.5 4.5 4.6 4.7 Généralisation spécialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Redéfinition de méthodes dans les classes dérivées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Héritage, membres et visibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Classes abstraites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Exemple de classe Abstraites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 & % Dans cette section, nous abordons la généralisation spécialisation en Java. Nous étudions les relations entre les références et les objets lorsqu’une généralisation spécialisation existe entre les classes. Puis nous abordons les possibilités liées à la généralisation spécialisation relativement à la gestion des attributs et à leur visibilité. Enfin, nous décrivons la possibilité de modifier un comportement d’une classe dans une classe spécialisée. ' $ 4.1 Généralisation spécialisation # 59 & % Une classe concrétise un type de donnée abstrait et un comportement. Deux cas se présentent le plus souvent : 1. besoin d’étendre une classe : le programmeur désire réaliser une nouvelle classe qui apporte de nouvelles fonctionnalités tout en restant proche d’une classe existante. Plutôt que de copier/coller du code d’un fichier à un autre, la nouvelle classe est spécialisée à partir de la classe initiale par un lien d’héritage. La nouvelle classe est appelée classe dérivée à partir d’une classe de base ; Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 206 4 Généralisation spécialisation en Java 4.1 Généralisation spécialisation 2. des classes développées séparément présentent des parties identiques dans leurs attributs et dans leurs méthodes. Dans ce cas, les parties identiques sont factorisées dans une classe qui généralise les classes existantes. Les classes spécialisées sont modifiées pour supprimer la partie commune et sont liées à la classe de généralisation par un lien d’héritage. Une classe D qui hérite d’une classe B, partage tous les membres de B. Une classe D qui hérite d’une classe B peut étendre ou modifier les structures de données et le comportement hérité de la classe B. ' $ 4.1.1 Héritage : comment en Java Une classe ne peut hériter que d’une autre classe (héritage simple) Une classe hérite d’une autre par l’utilisation du mot réservé extends # 60 Une classe pour laquelle aucune spécialisation n’est explicitée spécialise implicitement la classe java.lang.Object L’opérateur instanceof permet de tester si une référence correspond à un objet d’une classe donnée Le mot réservé final utilisé devant le mot clé class interdit toute spécialisation de la classe sur laquelle il est utilisé & % En Java, la spécialisation entre classes est simple. Une classe ne peut spécialiser qu’une autre classe. Une classe en spécialise une autre par l’utilisation du mot réservé extends suivi du nom de la classe qu’elle spécialise. Une classe, pour laquelle aucune spécialisation n’est explicitée, spécialise implicitement la classe java.lang.Object. Comme nous le verrons dans la section 6.2, cette propriété garantit un comportement de base à toutes les classes. L’opérateur instanceof permet de tester si une référence correspond à un objet d’une classe. Il s’utilise avec une référence sur un objet et un nom de classe. Il retourne true si la référence décrit un objet correspondant à la classe, et false sinon. Le mot réservé final utilisé devant class interdit toute spécialisation de la classe sur lequel il est utilisé. Cette propriété peut être utilisée afin de protéger des parties sensibles ou vitales du code. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 207 4 Généralisation spécialisation en Java ' 4.1 Généralisation spécialisation $ 4.1.2 Héritage et constructeur Création d’un objet de classe dérivée =⇒ création de la partie de l’objet correspondant à la classe parente # 61 Appel dans le constructeur de la classe dérivée d’un des constructeurs de la classe parente par utilisation du mot réservé super() En première ligne du constructeur de la classe enfant Si aucun appel =⇒ appel au constructeur sans argument de la classe parente & % Comme nous l’avons dit, un objet d’une classe dérivée est un objet de la classe parente plus une partie qui correspond à la classe dérivée. Il est donc nécessaire d’initialiser la partie provenant de la classe parente lorsque l’objet est créé. Le constructeur de la classe dérivée doit donc faire appel au constructeur de la classe parente pour réaliser cette initialisation. Le plus souvent un constructeur de classe dérivée reçoit un ensemble de paramètres pour initialiser les attributs de la classe parente. Il utilise ces paramètres pour faire appel au constructeur de la classe parente. ' $ 4.1.3 Exemple de classe parente et classe dérivée # 62 1 package p e r s o n n e s ; 2 p u b l i c c l a s s Personne { 3 p r i v a t e S t r i n g nom , prenom , numSecu ; 4 p u b l i c Personne ( f i n a l String n , 6 } 7 public String toString (){ String p , final S t r i n g ns ){ r e t u r n " P e r s o n n e : ␣ " + nom + " ␣ " + prenom + " ␣ " + numSecu ; 8 } 9 10 final nom = n ; prenom = p ; numSecu = n s ; 5 } & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 208 4 Généralisation spécialisation en Java ' 1 package p e r s o n n e s ; 2 p u b l i c c l a s s Enseignant extends Personne { 3 p r i v a t e i n t nbCours ; p r i v a t e S t r i n g 4 public Enseignant ( f i n a l final 5 i n t nbc , 6 super ( n , p , ns ) ; 7 n b C o u r s = nbc ; final specialite ; final String String p , final S t r i n g ns , specialite ) { } 9 public String toString (){ 10 r e t u r n " E n s e i g n a n t : ␣ " + nbCours + " ␣ " +s p e c i a l i t e ; 11 } 12 13 String n , this . specialite = specialite ; 8 # 63 4.1 Généralisation spécialisation $ } & % La classe Personne est notre classe parente. Elle contient des attributs privés nom, prenom, et numSecu. Ces attributs sont initialisés dans le constructeur. Les autres méthodes de la classe ne sont pas décrites. Seule la méthode toString dont nous parlerons dans la section 4.2 sur le polymorphisme est décrite. La classe Enseignant est une spécialisation de la classe Personne. Elle contient des attributs privés : nbCours et specialite. Ces attributs privés sont initialisés dans le constructeur. Le constructeur de la classe Enseignant reçoit des paramètres pour initialiser ses attributs et des paramètres qu’il utilise pour faire appel au constructeur de la classe Personne. Comme pour la classe parente, seule la méthode toString est réalisée. $ ' 4.1.4 Utilisation de classe parente et dérivée 1 import personnes . ∗ ; 2 public class InheritExample { p u b l i c s t a t i c v o i d main ( f i n a l 3 args ) { " 1831291... " ); 5 # 64 String [ ] P e r s o n n e p = new P e r s o n n e ( " Dupont " , " J u l i e n " , 4 E n s e i g n a n t e = new E n s e i g n a n t ( " Durand " , " E m i l i e " , 6 " 2 7 8 0 6 3 3 . . . " , 3 , " C l o u d ␣ Computing " ) ; 7 System . o u t . p r i n t l n ( " p␣ e s t ␣ une ␣ P e r s o n n e ␣ " 8 + ( p i n s t a n c e o f Personne ) ) ; 9 System . o u t . p r i n t l n ( " p␣ e s t ␣ un ␣ E n s e i g n a n t ␣ " 10 + (p instanceof Enseignant ) ) ; 11 12 System . o u t . p r i n t l n ( " e ␣ e s t ␣ une ␣ P e r s o n n e ␣ " 13 + ( e i n s t a n c e o f Personne ) ) ; 14 System . o u t . p r i n t l n ( " e ␣ e s t ␣ un ␣ E n s e i g n a n t ␣ " 15 + ( e instanceof Enseignant ) ) ; 16 } 17 18 } & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 209 Introduction au langage de programmation Java ' Résultat de l’exécution : p p e e est est est est une une une une 4 Généralisation spécialisation en Java $ Personne true Enseignant false Personne true Enseignant true # 65 & % Dans cet exemple, la classe Enseignant étend la classe Personne. Le constructeur de la classe Enseignant fait appel au constructeur de la classe Personne à la ligne 6 par l’utilisation du mot réservé super. Le résultat de l’exécution permet de vérifier qu’un objet de la classe Enseignant est bien une instance de la classe Personne. ' $ 4.2 Polymorphisme Affectation de références dans un arbre d’héritage Upcast : une référence d’une classe B peut référencer toute instance de la classe B ou de ses classes dérivées # 66 Downcast : une référence d’une classe D dérivée d’une classe B peut recevoir une référence de la classe B si et seulement si : L’objet référencé est bien du type D ou d’un de ses types dérivés Le changement de type doit être explicite (en anglais, cast) vers le nouveau type (D) & % Le polymorphisme revêt plusieurs aspects en matière de programmation. Nous prendrons la définition de [Armstrong, 2006] : « Different classes may respond to the same message and each implement it appropriately ». L’opérateur + permet une approche simple de cette propriété. En effet, le même opérateur peut être utilisé avec des types différents (entier ou en virgule flottante). La réalisation de 1 + 2 n’est pas la même que celle de 1.0 + 2. Le symbole plus dénote l’addition mais ne s’adresse pas au même type de données. La possibilité de généraliser ou spécialiser des classes donne une relation qui se traduit par un arbre d’héritage. Le sommet de cet arbre correspond à la classe la plus générale et les feuilles représentent les Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 210 4 Généralisation spécialisation en Java 4.2 Polymorphisme classes les plus spécialisées. La possibilité de mettre la référence d’un objet d’une classe dérivée une référence de la classe parente est un aspect objet du polymorphisme. Cette opération est appelée Upcast car l’arbre d’héritage est parcouru du bas vers le haut. Réciproquement, lorsqu’une référence d’un objet d’une classe dérivée a été mise dans une variable pouvant recevoir une référence sur un objet de la classe de base, nous pouvons mettre cette référence dans une variable qui peut contenir une référence sur un objet de la classe dérivée. Cette opération est appelée Downcast car l’arbre d’héritage est parcouru du haut vers le bas. ' $ 4.2.1 Exemple de Upcast et Downcast 1 2 3 4 5 6 7 8 9 # 67 10 11 12 13 14 15 16 17 18 19 import personnes . Personne ; import personnes . Enseignant ; p u b l i c c l a s s UpDownExample { p u b l i c s t a t i c v o i d main ( f i n a l S t r i n g [ ] a r g s ) { Personne p ; E n s e i g n a n t e = new E n s e i g n a n t ( " Durand " , " E m i l i e " , " 2 7 8 0 6 3 3 . . . " , 3 , " C l o u d ␣ Computing " ) ; p = e; // UpCast System . o u t . p r i n t l n ( " A p r e s ␣p␣=␣ e ; ␣p␣ e s t ␣ une ␣ P e r s o n n e ␣ " + ( p i n s t a n c e o f Personne ) + " ; ␣p␣ e s t ␣ un ␣ E n s e i g n a n t ␣ " + (p instanceof Enseignant ) ) ; e = ( E n s e i g n a n t ) p ; // Downcast System . o u t . p r i n t l n ( " A p r e s ␣ e ␣=␣p ; ␣ e ␣ e s t ␣ une ␣ P e r s o n n e ␣ " + ( e i n s t a n c e o f Personne ) + " ; ␣ e ␣ e s t ␣ un ␣ E n s e i g n a n t ␣ " + ( e instanceof Enseignant ) ) ; } } Apres p = e; Apres p = e; & ' Apres e=p; e Apres e=p; e p est une Personne true p est un Enseignant true % $ est une Personne true est un Enseignant true # 68 & % Dans cet exemple, la variable p de type référence de classe parente peut recevoir la référence d’un objet de classe dérivée, contenue dans e. Inversement, une fois qu’une référence de classe parente contient une référence vers un objet de la classe dérivée, il est possible de mettre cette valeur dans une variable pouvant Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 211 4 Généralisation spécialisation en Java 4.3 Redéfinition de méthodes dans les classes dérivées contenir une référence de la classe parente. Il faut cependant informer le compilateur de cette possible perte de sens en castant la référence. ' $ 4.3 Redéfinition de méthodes dans les classes dérivées Redéfinition possible des méthodes publiques héritées (en anglais overriding) Peut être annotée par @Override. # 69 Liaison dynamique : Redéfinition la plus proche dans l’arbre d’héritage invoquée Même à travers une référence d’une classe parente Accès explicite à une méthode redéfinie de la classe parente par super & % Une classe peut redéfinir les méthodes publiques dont elle hérite (en anglais overriding). Dans ce cas la méthode peut être annotée avec l’annotation @Override. Java réalise une liaison dynamique lors des appels de méthodes, ainsi les objets des classes dérivées ont leur comportement propre même lorsqu’ils sont utilisés à travers une référence de classe parente. Lorsqu’il n’y a pas de définition dans la classe feuille, c’est la définition dans la classe la plus proche en remontant dans l’arbre d’héritage qui est invoquée. Cette liaison dynamique est réalisée même lorsque l’on utilise la méthode à travers une référence d’une classe parente. Depuis une classe dérivée, l’accès explicite à une méthode redéfinie de la classe parente est possible en utilisant le mot réservé super. Ainsi dans nos exemples précédents, la méthode toString() est redéfinie dans la classe dans la classe Enseignant. $ ' 4.3.1 Polymorphisme et liaison dynamique avec toString 1 import personnes . Personne ; 2 import personnes . Enseignant ; 3 p u b l i c c l a s s TestPolyMorph { p u b l i c s t a t i c v o i d main ( f i n a l 4 E n s e i g n a n t e = new E n s e i g n a n t ( " Durand " , " E m i l i e " , 7 " 2 7 8 0 6 3 3 . . . " , 3 , " C l o u d ␣ Computing " ) ; 8 System . o u t . p r i n t l n ( p . t o S t r i n g ( ) ) ; 9 10 System . o u t . p r i n t l n ( e . t o S t r i n g ( ) ) ; 11 p = e; 12 System . o u t . p r i n t l n ( p . t o S t r i n g ( ) ) ; // UpCast } 13 14 args ) { " 1831291... " ); 6 # 70 String [ ] P e r s o n n e p = new P e r s o n n e ( " Dupont " , " J u l i e n " , 5 } Personne: Dupont Julien Enseignant: 3 Cloud Computing Enseignant: 3 Cloud Computing & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 212 Introduction au langage de programmation Java 4 Généralisation spécialisation en Java Cet exemple montre plusieurs aspects du polymorphisme et de la liaison dynamique : 1. à la ligne 11 : bien que définie dans la classe Personne, la méthode toString de la classe Enseignant est utilisée lorsqu’on utilise une référence de la classe Enseignant. Cet aspect est appelé liaison tardive. Java utilise la méthode qui correspond à la classe de l’objet. En fait elle utilise la méthode qui est définie dans l’arbre d’héritage le plus près de la classe réelle de l’objet ; 2. à la ligne 12 : une référence de la classe dérivée peut être affectée à une variable correspondant à la classe de base ; 3. à la ligne 13 : la liaison dynamique fait que l’appel de toString() fait appel à la méthode contenue dans la classe dérivée, alors que l’appel est réalisé à travers une référence de la classe parente. ' $ 4.4 Héritage, membres et visibilité Une classe D héritant d’une classe B hérite de tous ses membres : # 71 Les membres private de B sont inaccessibles depuis D Les membres protected de B sont accessibles depuis D Les membres public sont accessibles depuis D comme depuis les autres classes & % Une classe D spécialisant une classe B hérite de tous ses membres. Elle peut accéder directement aux attributs et méthodes publics. Les langages objets ont introduit un lien privilégié entre les classes dérivées et leur classe parente. Ce lien privilégié se traduit à travers le mot réservé protected qui permet aux classes dérivées d’accéder à certaines parties non publiques de la classe parente. Bien que, en partie constitué des attributs privés en provenance de la classe de base, un objet de classe dérivée ne peut accéder à ces attributs que via les méthodes publiques ou protected de la classe parente. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 213 4 Généralisation spécialisation en Java ' 4.5 Classes abstraites $ Questions généralisation/spécialisation en Java À quoi sert le mot réservé extends dans une déclaration de classe ? # 72 À quoi sert le mot super ? Peut-on interdire la redéfinition d’une méthode dans une classe dérivée ? Peut-on interdire la généralisation/spécialisation d’une classe ? & % $ ' 4.5 Classes abstraites En UML : # 73 & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 214 4 Généralisation spécialisation en Java ' 4.6 Exemple de classe Abstraites $ 4.5.1 Classes abstraites : principes Classe qui ne peut pas être instanciée. Par exemple la classe Média de la diapositive précédente # 74 Spécialisation nécessaire jusqu’à obtenir des classes instanciables : par exemple, la classe Livre dans la même diapositive Impose un comportement commun à toutes les classes dérivées Possibilité de créer des tableaux ou des collections de références de classe abstraite & % Une classe abstraite décrit une classe qui ne peut pas être instanciée. En d’autre mots, il n’y a pas d’objet de cette classe. Par exemple la classe Média de la diapositive précédente. Une classe abstraite doit être spécialisée pour obtenir des classes instanciable. Dans l’exemple, la classe Livre est instanciable. La classe abstraite impose un comportement commun à toutes les classes dérivées. Il est possible de créer des tableaux ou des collections de références sur une classe abstraite. Bien entendu, cette collection contiendra des références vers des objets des classes dérivées de la classe abstraite. $ ' 4.5.2 Classes abstraites en Java Méthodes abstraites sans corps de méthode # 75 Classe abstraite si méthode abstraite Classe dérivée : définit toutes les méthodes ou reste abstraite Classe qualifiée abstraite pour empêcher la création d’instances & % Les méthodes peuvent être qualifiées abstraites et ne pas être associées à un corps de méthode. Une classe ayant une méthode abstraite doit être qualifiée abstraite. Une classe qui étend une classe abstraite reste abstraite tant qu’elle ne définit pas l’ensemble des méthodes abstraites imposé par sa classe parente. Une classe peut être qualifiée abstraite même si toutes ses méthodes sont définies. Ceci empêche la création d’objet de cette classe. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 215 4 Généralisation spécialisation en Java ' 4.6 Exemple de classe Abstraites $ 4.6 Exemple de classe Abstraites # 76 & % ' $ 4.6.1 Exemple : classes abstraites 1 2 3 4 5 6 7 8 9 # 77 10 11 12 13 14 15 16 17 18 19 20 21 22 package s t u d s a b s t r a c t ; p u b l i c a b s t r a c t c l a s s Choix { private Bulletin [ ] lesBulletins ; int nbBulletinsPour , nbBulletinsContre , indexBulletins ; p u b l i c Choix ( ) { l e s B u l l e t i n s = new B u l l e t i n [ 1 0 0 ] ; indexBulletins = 0; nbBulletinsPour = 0; nbBulletinsContre = 0; } public int addBulletin ( Bulletin b) { l e s B u l l e t i n s [ i n d e x B u l l e t i n s ++] = b ; i f (b . getValue ()){ n b B u l l e t i n s P o u r++ ; } else { n b B u l l e t i n s C o n t r e++ ; } return indexBulletins ; } public int getNbBulletinsPour () { return nbBulletinsPour ; } & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 216 4 Généralisation spécialisation en Java ' public int getNbBulletinsContre (){ return nbBulletinsContre ; } p u b l i c i n t chercherRang ( B u l l e t i n b ){ f o r ( i n t i = 0 ; i < i n d e x B u l l e t i n s ; i ++){ i f (b . equals ( l e s B u l l e t i n s [ i ] ) ) return i ; } r e t u r n −1; } public void r e t i r e r B u l l e t i n ( f i n a l B u l l e t i n r e t r a i t ) { i n t rang = chercherRang ( r e t r a i t ) ; i f ( r a n g > −1){ c o m p a c t e r B u l l e t i n s ( rang ) ; } } p u b l i c void c o m p a c t e r B u l l e t i n s ( i n t r ){ f o r ( i n t i = r ; i < i n d e x B u l l e t i n s ; i ++){ l e s B u l l e t i n s [ i ] = l e s B u l l e t i n s [ i +1]; } i n d e x B u l l e t i n s −−; } p u b l i c v o i d m o d i f i e r B u l l e t i n ( f i n a l B u l l e t i n changed ) { i n t rang = chercherRang ( changed ) ; i f ( r a n g >=0) { 23 24 25 26 27 28 29 30 31 32 33 # 78 4.6 Exemple de classe Abstraites $ 34 35 36 37 38 39 40 41 42 43 44 45 46 & ' $ B u l l e t i n aChanger = l e s B u l l e t i n s [ rang ] ; i f ( a C h a n g e r . g e t V a l u e ( ) != c h a n g e d . g e t V a l u e ( ) ) { aChanger . s e t V a l u e ( changed . g e t V a l u e ( ) ) ; } i f ( aChanger . ge tV al ue ( ) ) { n b B u l l e t i n s C o n t r e −− ; n b B u l l e t i n s P o u r ++; } else { n b B u l l e t i n s C o n t r e++ ; n b B u l l e t i n s P o u r −−; } 47 48 49 50 51 52 53 54 55 56 57 # 79 } 58 } 59 60 1 2 3 4 5 6 7 8 9 % } package s t u d s a b s t r a c t ; p u b l i c c l a s s Studs { p r i v a t e Choix [ ] l e s C h o i x ; private Scrutin [ ] lesScrutins ; private Bulletin [ ] lesBulletins ; p r i v a t e Personne [ ] l e s P a r t i c i p a n t s ; p u b l i c Studs () { l e s C h o i x = new C h o i x [ 1 0 0 ] ; l e s S c r u t i n s = new S c r u t i n [ 1 0 0 ] ; & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 217 4 Généralisation spécialisation en Java ' # 80 4.7 Interfaces $ 10 l e s B u l l e t i n s = new B u l l e t i n [ 1 0 0 ] ; 11 l e s P a r t i c i p a n t s = new P e r s o n n e [ 1 0 0 ] ; 12 } 13 @Override 14 public String toString () { return " Studs ␣" + l e s C h o i x + l e s S c r u t i n s + l e s B u l l e t i n s + l e s P a r t i c i p a n t s 15 17 ; } 16 } & % Dans cet exemple, nous avons la classe abstraite Choix, qui est rendue instanciable dans la classe PlageHoraire. Les collections dans la classe Studs référencent des objets abstraits Scrutin et Choix. Les objets référencés seront bien entendu instanciés. Ce sont des objets des classes PlageHoraire ou Preference dans la collection des Choix. $ ' 4.7 Interfaces UML : # 81 & % Les interfaces servent à noter des comportements qui doivent être réalisés par les classes qui réalisent cette interface. Vous pouvez considérer une interface comme une classe sans attribut et avec uniquement des méthodes abstraites. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 218 4 Généralisation spécialisation en Java ' 4.7 Interfaces $ 4.7.1 Interfaces en Java Les membres d’une interface sont principalement des méthodes abstraites # 82 Une interface est déclarée avec le mot réservé interface Une interface peut hériter (extends) de plusieurs interfaces Une classe peut implémenter (implements) une ou plusieurs interfaces Rappel : une classe n’hérite (extends) que d’une seule classe & % Une interface est une classe dont les membres sont principalement des méthodes abstraites. Une interface est déclarée avec le mot réservé interface. Une interface peut hériter (extends) de plusieurs interfaces. Une classe peut implémenter (implements) une ou plusieurs interfaces. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 219 Introduction au langage de programmation Java ' 5 Organisation des sources Java $ 5 Organisation des sources Java # 83 5.2 5.2 5.3 5.5 5.5 5.6 5.7 Programme en C (rappel) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Exécution d’un programme (rappel) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Exécution d’un programme sur une machine virtuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Dans le cas de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Unités de compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Paquetages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Visibilité en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 & % Ce chapitre traite de l’organisation des fichiers sources et de leurs contreparties compilées en bytecode. Cette organisation est fortement liée à l’infrastructure des compilateurs Java et des machines virtuelles Java. ' $ 5.1 Programme en C (rappel) # 84 & % Nous prenons ici l’exemple d’un programme en langage C, mais cet exemple peut être généralisé à l’ensemble des programmes issus de langages compilés et obtenus avec une phase d’édition de liens. La figure exprime qu’un programme compilé est un ensemble de modules qui se compilent de manière individuelle et qui sont construits pour être réunis entre eux mais aussi avec des fonctions provenant de bibliothèques. Sur la figure, nous montrons trois fichiers sources qui donnent trois fichiers objets relogeables. Ces trois fichiers objets sont associés entre eux et complétés par les fonctions provenant d’une bibliothèque. Cette bibliothèque peut-être associée statiquement ou dynamiquement. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 220 Introduction au langage de programmation Java ' 5 Organisation des sources Java $ 5.2 Exécution d’un programme (rappel) # 85 & % Nous continuons notre exemple en montrant le programme en cours d’exécution appelé processus. Notre schéma focalise sur les zones mémoires associées au programme et au système d’exploitation. Parmi ces zones, vous pouvez voir la partie texte qui contient les instructions exécutables, la partie données, la pile qui permet de réaliser les appels de fonctions et le tas qui permet la gestion dynamique de la mémoire. Le schéma montre aussi la bibliothèque du langage C liée dynamiquement au programmes. La présence du processeur en dessous du processus et du système montre que le processus exécute directement les instructions contenues dans la zone texte de la mémoire sur le processeur. Pour mémoire, un processus saute dans le système d’exploitation pour réaliser des opérations privilégiées et contrôlées par le système d’exploitation comme les entrées sorties. ' $ 5.3 Exécution d’un programme sur une machine virtuelle # 86 & % Pour ce qui est de l’exécution d’un programme par une machine virtuelle java, le programme est constitué d’un ensemble de modules qui se trouvent dans des fichiers. Les modules sont compilés dans un langage intermédiaire qui est compris par la machine virtuelle. Aucun code correspondant à la machine physique Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 221 Introduction au langage de programmation Java 5 Organisation des sources Java n’est généré. Les modules sont chargés dans la mémoire de la machine virtuelle qui les interprète et exécute les opérations que les modules décrivent. ' $ 5.4 Dans le cas de Java # 87 Point d’entrée public static void main(String args[]) dans une classe Classes chargées à la demande (en anglais dynamic loading) & % Les caractéristiques de la machine virtuelle Java font qu’il n’existe pas d’équivalent au programme en binaire exécutable obtenu dans une chaîne de compilation classique et en particulier en langage C. En effet, pour qu’un programme Java soit exécutable, il suffit d’un point d’entrée et d’un ensemble de classes. Le point d’entrée est matérialisé par la méthode main au prototype ci-dessus. Cette méthode constitue les instructions de départ du programme. La machine virtuelle charge dynamiquement les classes qui sont référencées à partir de cette méthode. Le chargement des classes de l’API ne différe pas de celui des autres classes. $ ' 5.5 Unités de compilation # 88 Un fichier source Java = une unité de compilation Recommandation : une seule classe par fichier source Obligation : nom du fichier source = nom de sa classe publique & % Un fichier source en Java correspond à une unité de compilation. Une unité de compilation n’est compilable que si le compilateur dispose de l’ensemble des classes utilisées dans ce fichier. Ceci peut conduire un Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 222 Introduction au langage de programmation Java 5 Organisation des sources Java compilateur à compiler plusieurs classes lors d’une demande de compilation d’une seule classe. Il est fortement recommandé d’avoir une seule classe par fichier source. Un fichier source contenant une classe publique doit porter le même nom que cette classe. ' $ 5.6 Paquetages Paquetages : regroupement de classes dans un espace de nommage Noms des classes : « packagename.classname » # 89 Espace de nommage associé à la compilation et à l’exécution Classe Personne du paquetage studs doit être dans un fichier correspondant au chemin « studs/Personne.java » Ceci permet au compilateur et à la JVM de trouver les fichiers compilés Mot réservé package : nom de paquetage des classes dans l’unité de compilation & % Les paquetages permettent de regrouper un ensemble de classes dans un espace de nommage. Les noms des classes suivent le schéma « packagename.classname ». Cet espace de nommage est associé à la compilation et à l’exécution. La classe Personne du paquetage studs doit être dans un fichier correspondant au chemin « studs/Personne.java ». Ceci permet au compilateur et à la JVM de trouver les fichiers compilés. Le mot réservé package permet d’indiquer le nom de paquetage pour chaque unité de compilation. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 223 Introduction au langage de programmation Java ' 5 Organisation des sources Java $ 5.6.1 Chemin de recherche # 90 variable d’environnement CLASSPATH liste des répertoires de recherche pour le compilateur et la JVM Noms des classes complets contient le nom de paquetage import : permet d’établir un alias API Java est organisée en paquetages (java.lang, java.io...) & % Les répertoires dans lesquels le compilateur et la JVM cherchent les paquetages sont décrits dans une variable d’environnement appelée CLASSPATH. À l’extérieur d’un paquetage, les noms des classes sont composé du nom de paquetage, d’un point et du nom de la classe. Un nom de paquetage peut être composé de plusieurs parties séparées elles aussi par des points. L’instruction import permet d’utiliser le nom de la classe importée sans le nom du paquetage en préfixe. L’API Java est organisée en paquetages (java.lang, java.io...). $ ' 5.6.2 Exemple CLASSPATH : CLASSPATH=/src:/java Fichier /java/studs/Personne.java contient le code suivant : package studs; public class Personne { private String nom, prenom; private int nbParticipations = 0, nbOrganisations = 0; public Personne(String n, String p){ n = nom; prenom = p; } public void voter(Bulletin b){ } public void consulterResultat(Scrutin s) { public void seRetirerDUnScrutin(Scrutin s) { # 91 } } } Fichier InitPersonne.java dans le répertoire /src peut contenir le code suivant : import studs.Personne; class InitPersonne { public static void main(String[] args) { Personne j; j = new Personne("Dupont", "Julien"); System.out.println(j); } } // reference // instance creation & % Pour compiler le fichier InitPersonne.java, le compilateur recherche le fichier source Personne.java du paquetage studs à partir des chemins décrits dans le CLASSPATH. Il commence, donc, par chercher le sous répertoire studs dans le répertoire /src. Il ne trouve pas ce sous répertoire et passe au chemin suivant. Il cherche dans /java et trouve un répertoire studs. Dans ce répertoire il trouve le fichier class Personne.class ou il compile le fichier Personne.java pour obtenir le fichier .class. Avec ce fichier .class, il est à même de compiler le fichier InitPersonne.java. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 224 5 Organisation des sources Java ' 5.7 Visibilité en Java $ 5.7 Visibilité en Java Un membre de la classe C peut être : # 92 private : accessible seulement à la classe package friendly (défaut) : accessible aux classes dans le même paquetage protected : accessible aux classed du paquetage et à toute classe dérivée en dehors du paquetage public : accessible à toutes les classes & % Un membre de la classe C peut être : • private : accessible seulement à la classe ; • package friendly : valeur par défaut, accessible aux classes dans le même paquetage ; • protected : accessible aux classes dans le même paquetage et à toute classe dérivée en dehors du paquetage ; • public : accessible à toutes les classes. ' $ 5.7.1 Table de visibilité # 93 a b c d Accessible de C2 oui oui oui - Accessible de C3 oui oui oui - Accessible de C4 oui oui - - Accessible de C5 & oui - - % La variable a est accessible à l’ensemble des classes car elle est publique. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 225 Introduction au langage de programmation Java 5 Organisation des sources Java La variable b est accessible à l’ensemble des classes dérivées de C1. Ce sont les classes C2 et C4. Elle est aussi accessible aux classes du même paquetage, soit C2 et C3. La variable c est accessible à l’ensemble des classes de son paquetage, soit C2 et C3. La variable d n’est accessible que dans la classe C1. ' $ Questions organisation des sources en Java Le nom d’un paquetage est-il lié à l’organisation des fichiers sources ? # 94 Dans quel paquetage se trouve java.lang.Object ? Les paquetages servent-ils seulement à la compilation des classes ? Les paquetages impactent-ils la visibilité des membres des classes ? & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 226 Introduction au langage de programmation Java ' 6 API Java $ 6 API Java # 95 6.2 6.2 6.3 6.4 6.5 Premières classes de l’API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Classe java.lang.Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Interface de programmation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .102 java.lang.* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 java.util.*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108 & % Dans cette section, nous traitons une partie importante de l’API java, en particulier certaines classes associées au paquetage java.lang et une partie des collections associées au paquetage java.util. ' $ 6.1 Premières classes de l’API # 96 java.lang.Object java.lang.String java.lang.Integer & % Nous étudions plus particulièrement les classes ci-dessus dans la suite de cette section. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 227 Introduction au langage de programmation Java ' 6 API Java $ 6.2 Classe java.lang.Object public String toString() protected Object clone() throws CloneNotSupportedException # 97 public boolean equals(Object obj) protected void finalize() throws Throwable public final Class getClass() public int hashCode() & % Cette classe est fondamentale. Elle impose un ensemble de comportements pour tous les objets car elle est la racine de l’arbre d’héritage. Elle garantit par exemple que les méthodes toString et equals peuvent être appelées sur tous les objets. Parmi les méthodes de la classe Object, nous trouvons par fréquence d’utilisation : • public String toString() Retourne une représentation sous forme de chaîne de caractères de cet objet (conversion). Toute classe devrait redéfinir cette méthode. La chaîne retournée par la méthode toString() de la classe Object est constituée du nom de la classe suivi de @ et du code de hachage hexadécimal de l’objet. Formellement, l’instruction exécutée pour générer cette chaîne est : getClass().getName() + ’@’ + Integer.toHexString(hashCode()) • public boolean equals(Object obj) Comparaison de référence entre l’objet courant et l’objet passé en argument obj (voir la section 6.2.1 plus loin) • protected Object clone() throws CloneNotSupportedException Retourne une copie légère de cet objet (voir dans la section 8.1 • protected void finalize() throws Throwable Appelée par le ramasse miettes lorsque le ramasse miettes récupère l’espace correspondant à l’objet. L’objet n’est bien entendu plus associé à une référence. • public final native Class getClass() Retourne la classe de l’objet sous forme d’un objet de la classe java.lang.Class • public native int hashCode() Retourne un code de hachage pour cet objet. Ce code sert pour les tables de hachage que nous étudierons dans la section 6.5.3 sur les collections. La définition d’une fonction de hachage telle que donnée dans Wikipédia est la suivante : « On nomme fonction de hachage une fonction particulière qui, à partir d’une donnée fournie en entrée, calcule une empreinte servant à identifier rapidement, bien qu’incomplètement, la donnée initiale. Les fonctions de hachage sont utilisées en informatique et en cryptographie. » • d’autres méthodes qui concernent le multithreading et que nous n’étudions pas dans ce cours : Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 228 6 API Java 6.2 Classe java.lang.Object public public public public public final final final final final void wait() throws InterruptedException native void notify() native void notifyAll() native void wait(long) throws InterruptedException void wait(long, int) throws InterruptedException ' $ 6.2.1 Égalité Les objets sont manipulés par des références ⇒ o1 == o2 Teste si les références sont égales o1.equals(o3) # 98 Teste si le contenu de l’objet référencé par o3 est comparable au contenu de l’objet référencé par o1 & % La méthode equals a été conçue pour permettre de décrire que deux objets sont identiques du point de vue métier de la classe. Par exemple, deux objets de type chaîne de caractères, qui sont lexicographiquement équivalents, doivent être considérés comme identiques. La classe Object implante cependant la méthode equals en testant l’égalité entre les références. Les classes dérivées doivent redéfinir la méthode equals en garantissant qu’elle est correcte du point de vue métier associé à la classe. Dans notre schéma, la comparaison par l’égalité de références ne permet pas de détecter que les chaînes de caractères référencées par o1 et o3 sont lexicographiquement les mêmes. La surcharge de la méthode equals dans une classe consiste à choisir la liste des champs significatifs de l’état des objets de la classe. L’objet courant est équivalent à l’objet en référence si chacun des champs entrant dans la comparaison est équivalent au champ correspondant dans l’objet en référence. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 229 6 API Java ' 6.2 Classe java.lang.Object $ 6.2.2 Exemple d’égalité 1 public class StringEquals { p u b l i c s t a t i c v o i d main ( f i n a l 2 # 99 String argv [ ] ) { S t r i n g s = " Ja " , j = " J a v a " ; 3 4 S t r i n g m = s + " va " ; 5 System . o u t . p r i n t l n (m) ; 6 i f ( j == m) { System . o u t . p r i n t l n ( " j ␣==␣m␣ V r a i " ) ; 7 } e l s e { System . o u t . p r i n t l n ( " j ␣==␣m␣ Faux " ) ; 8 } 9 i f ( j . e q u a l s (m) ) { System . o u t . p r i n t l n ( " j . e q u a l s (m) ␣ V r a i " ) ; 10 } else { 11 System . o u t . p r i n t l n ( " j . e q u a l s (m) ␣ Faux " ) ; 12 } 13 } 14 15 } Traces d’exécution : Java j == m Faux j.equals(m) Vrai & % Cet exemple construit deux chaînes de caractères m et j contenant chacune le mot Java. La ligne 6 teste si les deux références pointent vers le même objet. L’affichage confirme que les deux chaînes de caractères sont deux instances différentes. La ligne 9 teste utilise la méthode equals depuis l’objet référencé par j en lui passant en argument la référence vers l’objet m. L’affichage confirme que les deux objets sont équivalents conformément à la définition de la surcharge de equals dans la classe String : «Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.» $ ' 6.2.3 Exemple de méthode equals 1 2 3 4 5 6 7 8 9 # 100 10 11 12 13 14 15 16 17 18 19 20 21 package s t u d s e q u a l s ; p u b l i c c l a s s Personne { p r i v a t e S t r i n g nom , prenom ; p u b l i c P e r s o n n e ( f i n a l S t r i n g nom , f i n a l S t r i n g prenom ) { t h i s . nom = nom ; t h i s . prenom = prenom ; } @Override p u b l i c boolean e q u a l s ( Object obj ) { i f ( t h i s == o b j ) r e t u r n t r u e ; i f ( o b j == n u l l ) r e t u r n f a l s e ; i f ( ! ( obj i n s t a n c e o f Personne )) return f a l s e ; Personne other = ( Personne ) obj ; i f ( nom == n u l l ) { i f ( o t h e r . nom != n u l l ) r e t u r n f a l s e ; } e l s e i f ( ! nom . e q u a l s ( o t h e r . nom ) ) r e t u r n f a l s e ; i f ( prenom == n u l l ) { i f ( o t h e r . prenom != n u l l ) return false ; } e l s e i f ( ! prenom . e q u a l s ( o t h e r . prenom ) ) r e t u r n f a l s e ; return true ; } } & % Dans cet exemple, nous considérons que deux objets de la classe Personne représentent la même personne si leurs attributs nom et prenom sont deux à deux comparables. Cette comparaison ne tient donc pas compte des autres attributs que nous n’avons pas représenté dans l’exemple. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 230 6 API Java 6.3 Interface de programmation L’attribut nom des deux objets est comparé à l’aide de la méthode equals de sa classe (à savoir String). Lorsque les noms sont identiques, nous procédons de même pour l’attribut prenom. La méthode equals a été générée avec eclipse. Il a suffit de lui préciser que les champs à comparer étaient le nom et le prénom. Le code est stéréotypé. En voici quelques points clés : • l’argument reçu par la méthode est de la classe Object. Cela vient du fait que la méthode est héritée et doit être redéfinie. Si nous mettions à la place une référence de la classe Personne, la méthode serait une surcharge. • la ligne 15 vérifie si la référence de l’objet passée en argument est égale à la référence de l’objet courant. • la ligne 16 vérifie que la référence passée n’est pas nulle. • la ligne 17 vérifie que la référence correspond à un objet de la classe courante ou de ses classes dérivées. • la ligne 18 fait un « downcast » de l’argument vers une référence correspondant à la classe courante. • les lignes suivantes testent l’égalité à l’aide de equals entre les attributs discriminants. $ ' 6.3 Interface de programmation # 101 API Java organisée en paquetages java.lang.* importé de manière automatique Interface de programmation disponible quelle que soit la plate-forme & % L’API Java est organisée en paquetages qui regroupent des classes participant à une même thématique de programmation, par exemple java.net pour la programmation des interfaces réseau. Le paquetage java.lang.* est importé de manière automatique. Il n’est donc pas nécessaire de faire les imports des classes de ce paquetage. Ceci explique le fait que nous ayons utilisé String depuis nos premiers exemples sans importer java.lang.String. L’API Java est réalisée ou accessible dans l’ensemble des machines virtuelles et permet ainsi d’avoir une interface de programmation disponible quelle que soit la plate-forme. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 231 Introduction au langage de programmation Java ' 6 API Java $ 6.3.1 Quelques paquetages Java java.lang # 102 java.util java.io java.net & % ' $ 6.4 java.lang.* # 103 & % La majorité des classes sur la figure sont des classes finales, c’est-à-dire qu’il n’est pas possible de les dériver. Les seules classes non finales sont Object, Throwable, Thread et ThreadGroup. Les classes Boolean et Void ainsi que les sous-classes de la classe Number (Byte, Double, Float, Integer, Long et Short) sont des classes conteneurs. Elles encapsulent un champ du type primitif. Cela permet de disposer d’objets de ces types, pour pouvoir les référencer (ne pas oublier que les types prédéfinis ne sont pas des objets). Ces classes conteneurs offrent des méthodes de conversion de et vers le type String. Il faut noter que ces classes n’offrent pas de méthode permettant la modification de leurs champs. Depuis, java 1.5, ces classes sont dotées d’un caractéristique appelée auto-boxing qui permet la promotion d’une variable de type primitif en un objet de son type conteneur de manière automatique. De manière réciproque, le langage réalise l’extraction automatique de la valeur en type primitif à partir d’un objet si nécessaire. La classe Character est également une classe conteneur du type char ; elle offre des méthodes de test Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 232 6 API Java 6.4 java.lang.* du type du caractère (isDigit(), isLetter(), etc.) et des méthodes de transformation (toLowerCase(), toTitleCase(), etc.). Les caractères en Java sont de type Unicode (voir http://unicode.org) sur deux octets. La classe Math regroupe les constantes π avec Math.PI et e avec Math.E et uniquement des opérations mathématiques de classe (avec des méthodes statiques) : abs, sqrt, acos, cos, exp, log, pow, random, etc. Cette fonction random utilise la classe Random du paquetage java.util décrit plus loin. ' $ 6.4.1 Exemple avec la classe Integer 1 public class IntegerExample { p u b l i c s t a t i c v o i d main ( f i n a l 2 # 104 3 Integer 4 int j = i . intValue (); String argv [ ] ) { i = new I n t e g e r ( " 4567 " ) ; 5 i = 4567; 6 j = i ; // u n b o x i n g i . i n t V a l u e ( ) System . o u t . p r i n t l n ( " I n t e g e r ␣ i ␣ : " + i + " ␣ i n t ␣ j ␣ : " + j + " \n " ) ; 7 } 8 9 // b o x i n g i = new I n t e g e r ( 4 5 6 7 ) ; } & % ' $ 6.4.2 Classe String Gestion des chaînes de caractères # 105 Un objet de type String n’est pas modifiable Les constantes littérales comme “abc” sont converties en String L’opérateur « + » permet la concaténation des String & % Il s’agit de chaînes de caractères (char) non modifiables. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 233 Introduction au langage de programmation Java ' 6 API Java $ 6.4.3 Exemple pour String 1 2 3 4 5 6 7 8 9 # 106 10 11 12 13 14 i m p o r t j a v a . u t i l . Date ; public c l a s s StringExample { p u b l i c s t a t i c v o i d main ( f i n a l S t r i n g a r g v [ ] ) { S t r i n g s = " \ u 0 0 c a t r e ␣ ou ␣ ne ␣ p a s ␣ \ u 0 0 e a t r e " ; int lg = s . length (); System . o u t . p r i n t l n ( s + " ␣ " + l g ) ; System . o u t . p r i n t l n ( " J a v a " . s u b s t r i n g ( 2 , 3 ) ) ; System . o u t . p r i n t l n ( " J a v a " + " S o f t " ) ; char [ ] data = { ’ J ’ , ’ a ’ , ’ v ’ , ’ a ’ }; S t r i n g n = new S t r i n g ( d a t a ) ; System . o u t . p r i n t l n ( n ) ; S t r i n g p = S t r i n g . v a l u e O f ( Math . P I ) ; System . o u t . p r i n t l n ( p ) ; S t r i n g d = S t r i n g . v a l u e O f ( new Date ( ) ) ; System . o u t . p r i n t l n ( d ) ; } } Résultat de l’exécution : Être ou ne pas être 19 v JavaSoft Java 3.141592653589793 Wed Sep 22 12:25:04 CEST 2010 Java & % Les caractères en Java ne sont pas ASCII mais Unicode sur 16 bits. Dans l’exemple, la notation "\u00ea" désigne un caractère Unicode correspondant à la lettre « ê ». Les méthodes comme substring() ou toUpperCase() retournent des copies de la chaîne de caractères. La méthode valueOf de la classe String permet de convertir les variables de type primitif en chaîne de caractères sans créer d’objet intermédiaire. ' $ Questions API java.lang Pourquoi faire dériver toutes les classes de java.lang.Object ? # 107 Pourquoi cette classe fournit-elle les méthodes suivantes : 1. toString 2. equals La classe integer est finale, à votre avis pourquoi ? (hors cours) & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 234 6 API Java ' 6.5 java.util.* $ 6.5 java.util.* # 108 & % Le paquetage java.util contient des classes utilitaires, en particulier celles qui servent à manipuler les dates et les collections. Cette diapositive représente quelques classes de ce paquetage qui ne sont pas associées à la gestion des collections. Remarquez que ces classes ne sont pas associées à d’autres classes par généralisation spécialisation et donc qu’elles sont directement liées à la classe Object du paquetage java.lang. De plus, ces classes respectent les interfaces Cloneable et Serializable. Cette dernière interface provient du paquetage java.io et est associée au fait de pouvoir sauvegarder et restaurer l’état d’un objet. Cette sauvegarde et restauration peut se faire à partir de fichiers. Les objets peuvent aussi être restaurés après téléchargement en provenance d’un autre site. Nous nous intéressons plus particulièrement aux collections dans les diapositives qui suivent et en particulier : • java.util.Collection • java.util.List • java.util.Map • java.util.Iterator • java.util.Vector • java.util.Hashtable Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 235 6 API Java ' 6.5 java.util.* $ 6.5.1 Classe paramétrée # 109 Comme en UML, classe associée à la classe des objets qu’elles servent à manipuler Classe associée spécifiée entre « <> » Exemple : Vector<String> myStringVector = new Vector<String>(); & % La notion de classe paramétrée est présente dans Java depuis la version 5.0. Dans la terminologie Java, ce type de classe est dite « generics ». Cette notion a été empruntée au langage C++ et permet, entre autre, de spécialiser les classes qui gèrent les collections en fonction de la classe des objets que ces collections servent à manipuler. Ainsi, nous désirons avoir une liste de chaînes de caractères ou une liste de personnes. Nous avons besoin des mêmes opérations sur les deux listes : ajouter, rechercher, retirer. Nous ne voulons cependant pas mélanger les personnes et les chaînes de caractères. C’est à cela que sert la paramétrisation des classes permettant de gérer des collections. Cette paramétrisation simplifie la vie du programmeur en lui garantissant que les collections ne contiennent que des objets d’un type donné. La paramétrisation est réalisée en spécifiant le type des objets manipulés entre les symboles inférieur et supérieur. Il est nécessaire de préciser ce type lors de la déclaration de la référence et lors de la création de l’objet. ' $ 6.5.2 Classes Abstraites des collections # 110 & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 236 6 API Java 6.5 java.util.* Cette figure montre les relations entre les classes abstraites et les interfaces du paquetage ainsi que celles associées à l’interface Iterable de java.lang. ' $ 6.5.3 Classes instanciables des collections # 111 & % Parmi les nombreuses collections fournies par le paquetage java.util, nous nous intéressons à un sousensemble, et plus précisément, à la classe Vector qui permet de manipuler des tableaux dynamiques, ainsi qu’à la classe Hashtable qui permet de gérer des collections rangées par hachage. Comme nous le verrons plus loin, nous utiliserons ces collections à travers les interfaces qu’elles réalisent. Les classes instanciables réalisent aussi les interfaces java.lang.Cloneable et java.io.Serializable. ' $ 6.5.4 Collections Collection : interface commune à toutes les collections ; List : interface permettant de gérer une liste ; # 112 Iterator : interface permettant de parcourir une collection ; Vector : réalisation de liste dans une sorte de tableau à taille variable ; Map : interface permettant de gérer des tables associant une clé à un objet ; Hashtable : tableau associatif & % La gestion des collections a beaucoup évolué avec la maturité du langage Java. Les premières versions du langage permettaient de faire des collections de Object. Depuis Java 1.5, les collections sont paramétrées. Nous concentrerons notre attention sur les deux interfaces, List et Map. La première interface permet de Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 237 6 API Java 6.5 java.util.* gérer des listes comme s’il s’agissait d’un tableau de taille variable. La seconde interface permet de gérer des ensembles de paires clé, valeur que nous appelerons dictionnaires. Ensuite, nous utiliserons l’interface List fournie par la classe Vector pour la manipulation de cette dernière. De même, nous utiliserons l’interface Map fournie par la classe Hashtable pour manipuler les éléments contenus dans une HashTable. ' $ 6.5.5 Interface Iterable # 113 provient de java.lang Préconise : Iterator<T> iterator() Iterator<> décrit 6.5.12 & % $ ' 6.5.6 Interface Collection<E> Collection la plus générale Insertion à la fin avec boolean add(E ) Suppression de tous les éléments avec void clear() # 114 Test de la présence d’un objet dans la collection avec boolean contains(E) Test permettant de savoir si la collection est vide avec boolean isEmpty() Suppression du premier élément égal selon equals(E) au paramètre avec boolean remove(E) Nombre d’éléments dans la collection avec int size(). & % L’interface collection préconise une ensemble de méthodes qui sont applicables aussi bien sur les listes que sur les dictionnaires. Nous trouvons parmi ces méthodes : • l’ajout en fin de collection avec boolean add(E ) ; • la mise à vide de la collection avec void clear() ; Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 238 6 API Java 6.5 java.util.* • le test de présence d’un objet dans la collection avec boolean contains(E) ; • un test pour savoir si la collection est vide avec boolean isEmpty() ; • la suppression du premier élément de la collection égal à un objet avec boolean remove(E) ; • la taille de la collection avec int size(). ' $ 6.5.7 Interface List<E> Collection ordonnée supportant les objets dupliqués # 115 Accès à un élément avec E get(int index ) Insertion à une position donnée avec add(int, E) Suppression de l’élément à une position donnée avec E remove(int)) Recherche de l’indice d’un objet s’il est dans le vecteur avec int indexOf(E) & % L’interface List préconise des méthodes supplémentaires à l’interface Collection. Ces méthodes correspondent au caractère ordonné de la liste. Elles concernent la manipulation des éléments par leur indice. Nous trouvons parmi ces méthodes : • l’ajout d’un élément à un indice avec boolean add(int, E ) ; • la suppression d’un élément correspondant à l’indice avec E remove(int) ; • le test de présence d’un objet dans la collection boolean contains(E) ; • la recherche de l’indice d’un objet dans la collection int indexOf(E). Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 239 6 API Java ' 6.5 java.util.* $ 6.5.8 Classe Vector<E> Gestion d’une collection d’éléments de la classe E dans un tableau dynamique Pas de contrainte d’unicité sur les éléments # 116 Dérive de la classe AbstractList donc implémente l’interface List donc implémente l’interface Collection donc implémente aussi l’interface Iterable. & % Les vecteurs en Java sont des tableaux d’objets dont la taille varie en fonction des éléments que l’on ajoute ou enlève. Les objets placés dans un Vector doivent correspondre, au sens de l’instruction instanceOf, au paramètre de type associé. L’accroissement de la taille de la collecrion est automatique, ce qui rend cette classe facile à utiliser. La classe Vector réalise les interfaces List, Collection et Iterable. Il existe trois constructeurs pour cette classe : 1. le premier sans argument crée un vecteur de taille initiale 10 : Vector<Integer> v1 = new Vector<Integer>() ; 2. le second accepte un argument qui donne la taille initiale du vecteur : Vector<Integer> v1 = new Vector<Integer>(15) ; 3. le troisième accepte deux arguments, le premier correspond à la taille initiale du vecteur et le second à l’incrément de taille : Vector<Integer> v3 = new Vector(16,10);. ' $ 6.5.9 Boucle pour les collections Simplification de l’écriture des parcours de collections à partir de Java 5. Utilisation du for avec une collection, un tableau # 117 Syntaxe : for(Type t : collection) Itère les objets de la collection dans la référence t Type de collection et type de t compatibles Ressemble aux foreach de php & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 240 6 API Java 6.5 java.util.* Le parcours d’une collection ressemble à une boucle for. La version 5 du langage a introduit une nouvelle interprétation du for qui s’inspire du foreach des langages tels que php, python et perl. Cette notation condense l’écriture en focalisant sur la collection et sur l’objet itéré. ' $ 6.5.10 Exemple for-each sur un Vector 1 import j a v a . u t i l . L i s t ; 2 import j a v a . u t i l . Vector ; 3 p u b l i c c l a s s VectorForExample { p u b l i c s t a t i c v o i d main ( S t r i n g a r g v [ ] ) { 4 # 118 5 L i s t <S t r i n g > v = new V e c t o r <S t r i n g > ( ) ; 6 v . add ( " John " ) ; 7 System . o u t . p r i n t l n ( " T a i l l e ␣ de ␣ l a ␣ l i s t e ␣ " + v . s i z e ( ) ) ; 8 f o r ( S t r i n g s : v ){ System . o u t . p r i n t l n ( " ␣ "+s ) ; 9 } 10 } 11 12 v . add ( " G e o r g e s " ) ; } & % ' $ 6.5.11 Exemple de classe avec Vector 1 2 3 4 5 6 7 8 9 # 119 10 11 12 13 14 15 16 17 18 import j a v a . u t i l . Vector ; import j a v a . u t i l . L i s t ; publi c c l a s s VectorExampleBis { p u b l i c s t a t i c v o i d main ( S t r i n g a r g v [ ] ) { L i s t <S t r i n g > v=new V e c t o r <S t r i n g > ( ) ; v . add ( " un " ) ; v . add ( " deux " ) ; v . add ( 2 , " t r o i s " ) ; System . o u t . p r i n t l n ( " Contenu ␣ du ␣ v e c t e u r ␣ : " ) ; f o r ( i n t i =0; i <v . s i z e ( ) ; i ++) { System . o u t . p r i n t l n ( " ␣ ␣ " + v . g e t ( i ) ) ; } i f ( v . remove ( " un " ) ) System . o u t . p r i n t l n ( " un ␣ removed " ) ; v . remove ( 0 ) ; System . o u t . p r i n t l n ( " Contenu ␣ du ␣ v e c t e u r ␣ : " ) ; f o r ( i n t i =0; i <v . s i z e ( ) ; i ++) { System . o u t . p r i n t l n ( " ␣ ␣ " + v . g e t ( i ) ) ; } } } Trace de l’exécution : Contenu du vecteur : & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 241 6 API Java ' # 120 6.5 java.util.* $ un deux trois un removed Contenu du vecteur : trois & % Dans cet exemple : 1. nous manipulons le vecteur à travers l’interface List ; 2. le vecteur est créé à la ligne 5 ; 3. la chaîne de caractères contenant « un » est ajoutée à la ligne 6 comme premier élément ; 4. la chaîne de caractères contenant « trois » est ajoutée à la ligne 6 comme second élément ; 5. la chaîne de caractères contenant « deux » est insérée à la ligne 6 en troisième position (rang deux) ; 6. puis chaque élément du vecteur est affiché par un parcours utilisant une itération bornée par la taille du vecteur (lignes 8 à 10) ; 7. la ligne 11 utilise la méthode remove de la classe Collection pour supprimer le premier élément de la collection comparable à « un ». Cette méthode dépend de la méthode equals du type paramétré. En effet, elle réalise un parcours du vecteur et compare son argument avec chacun des objets du vecteur en utilisant la méthode equals. 8. la ligne 12 réalise la suppression de l’élément de rang 0 de la liste. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 242 6 API Java ' 6.5 java.util.* $ 6.5.12 Interface Iterator Il s’agit d’une interface qui fournit une technique pour parcourir les éléments d’une collection Iterator est spécialisé dans le parcours séquentiel des éléments d’une collection. Il propose les méthodes suivantes : # 121 hasNext() retourne vrai si l’itérateur contient encore une élément next() retourne l’élément suivant remove() supprime le dernier élément retourné par next() de la collection toutes les collections possèdent la méthode iterator() & % En dehors de l’utilisation du for, le parcours d’une collection en utilisant un itérateur est fortement recommandé pour la lisibilité et la compréhension du code. Le parcours en utilisant Iterator permet la suppression d’éléments ce que ne permet pas l’utilisation du for-each. ' $ 6.5.13 Exemple avec Iterator 1 import j a v a . u t i l . Vector ; 2 import j a v a . u t i l . L i s t ; 3 import j a v a . u t i l . I t e r a t o r ; 4 public class VectorIterator { p u b l i c s t a t i c v o i d main ( S t r i n g a r g v [ ] ) { 5 # 122 6 L i s t <S t r i n g > v = new V e c t o r <S t r i n g > ( ) ; 7 v . add ( " John " ) ; v . add ( " G e o r g e s " ) ; 8 I t e r a t o r <S t r i n g > e = v . i t e r a t o r ( ) ; 9 while ( e . hasNext ( ) ) { System . o u t . p r i n t l n ( " ␣ " + e . n e x t ( ) ) ; 10 11 } 12 // P a r c o u r s a v e c une b o u c l e f o r 13 f o r ( e = v . i t e r a t o r ( ) ; e . hasNext ( ) ; ) { System . o u t . p r i n t l n ( " ␣ " + e . n e x t ( ) ) ; 14 } 15 } 16 17 } & % Cet exemple montre deux parcours de la collection v avec un itérateur une fois avec une boucle while et une fois avec une boucle for. Vous remarquerez que pour réaliser le parcours deux fois, il est nécessaire d’initialiser l’itérateur deux fois. La première initialisation est réalisée avant la boucle while à la ligne 8. La seconde initialisation est réalisée dans la partie initialisation de la boucle for à la ligne 13. L’exécution de ce code donne le résultat suivant : John Georges John Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 243 6 API Java 6.5 java.util.* Georges ' $ 6.5.14 Dictionnaires Map<K,V> Les tables de correspondance permettent, à partir d’une clé, de retrouver une valeur Cette interface est associée à deux paramètres qui correspondent à la classe de la clé et à celle de la valeur C’est pourquoi sa définition est notée Map<K,V> Par exemple, Map<String,String> myMap # 123 Map supporte les méthodes supplémentaires suivantes, en plus de celles prescrites par Collection : boolean containsKey(K key) boolean containsValue(V value) Set<K> keysSet() Collection<V> values() V get(K key) V put(K key, V value) & % Un dictionnaire permet d’associer des clés avec des valeurs. Les clés doivent être uniques et la comparaison des clés doit utiliser la méthode equals de la classe de la clé. Les tables de correspondance ajoutent des méthodes relativement à l’interface des collections. Ces méthodes permettent d’ajouter et de retrouver une valeur associée à une clé. L’ensemble des clés peut être obtenu dans un objet de type Set. De même, l’ensemble des valeurs peut être obtenu dans un objet de type Collection. ' $ 6.5.15 Exemple pour Map 1 2 3 4 5 6 7 8 9 # 124 10 11 12 13 14 15 16 import j a v a . u t i l . Hashtable ; i m p o r t j a v a . u t i l . Map ; p u b l i c c l a s s HashMapExample { p u b l i c s t a t i c v o i d main ( f i n a l S t r i n g a r g v [ ] ) { Map<S t r i n g , S t r i n g > h t = new H a s h t a b l e <S t r i n g , S t r i n g > ( ) ; h t . p u t ( " Ba " , " Bah " ) ; h t . p u t ( " Aa " , " aha " ) ; h t . p u t ( "BB" , " b e b e " ) ; f o r ( S t r i n g k : ht . keySet ( ) ) { System . o u t . p r i n t l n ( " C l e ␣ : ␣ "+ k + "␣ Valeur ␣ : ␣" + ht . get ( k ) ) ; } f o r ( S t r i n g v : ht . v a l u e s ( ) ) { System . o u t . p r i n t l n ( " ␣ V a l e u r ␣ : ␣ " + v ) ; } } } Le résultat de l’exécution de l’exemple est le suivant : Cle : Ba Valeur : Bah Cle : BB Valeur : bebe Cle : Aa Valeur : aha & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 244 6 API Java ' Valeur : Bah Valeur : bebe Valeur : aha 6.5 java.util.* $ # 125 & % L’exemple montre un dictionnaire réalisé dans une Hashtable. Ce dictionnaire est rempli avec trois paires de clé, valeur : ("Ba", "Bah"), ("Aa", "aha") et ("BB", "bebe"). À la ligne 8, une boucle permet le parcours du Set obtenu avec les clés par l’appel de la méthode keySet(). À la ligne 12, une boucle foreach permet le parcours de la Collection obtenue avec les valeurs par l’appel à la méthode values(). ' $ 6.5.16 Dictionnaire Hashtable<K,V> # 126 Ces dictionnaires réalisent l’interface Map. La classe associée à la clé doit supporter les méthodes hashCode() et equals() & % Les dictionnaires de type tableau associatif présente les propriété suivantes : • les objets sont rangés dans un tableau de conteneurs. Idéalement, il y a un seul objet par conteneur ; • la valeur hachée d’une clé permet d’obtenir le rang du conteneur ; • si plusieurs objets donnent le même valeur hachée, ils sont rangés dans le même conteneur comme dans un vecteur ; Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 245 6 API Java 6.5 java.util.* • les clés doivent être uniques, • la durée de recherche d’une clé est idéalement en O(1) temps constant pour le calcul du rang du conteneur puis accès. • le temps peut être en O(M) lorsqu’il y a des collisions de hachage. Vous pouvez trouver plus de détails sur les fonctions de hachage dans la section 6.4, pages 506 à 549 du livre de D. E. Knuth, « The Art of Computer Programming, Vol 3. : sorting and searching ». La classe de la clé doit garantir que ses méthodes equals et hashCode sont correctes, ce sont elles qui sont utilisées. ' $ 6.5.17 Exemple pour Hashtable 1 import j a v a . u t i l . Hashtable ; 2 i m p o r t j a v a . u t i l . Map ; 3 p u b l i c c l a s s HashtableExample { p u b l i c s t a t i c v o i d main ( f i n a l 4 Map<S t r i n g , S t r i n g > h t = new H a s h t a b l e <S t r i n g , S t r i n g > ( ) ; 6 h t . p u t ( " Ba " , " Bah " ) ; h t . p u t ( " Aa " , " aha " ) ; 7 h t . p u t ( "BB" , " b e b e " ) ; 8 f o r ( S t r i n g k : ht . keySet ( ) ) { System . o u t . p r i n t l n ( " C l e ␣ : ␣ "+ k + " ␣ Hash ␣ : ␣ "+ k . hashCode ( ) 9 # 127 String argv [ ] ) { 5 + "␣ Valeur ␣ : ␣" + ht . get ( k ) ) ; 10 } 11 } 12 13 } Le résultat de l’exécution de l’exemple est le suivant : Cle : Ba Hash : 2143 Valeur : Bah Cle : BB Hash : 2112 Valeur : bebe Cle : Aa Hash : 2112 Valeur : aha & % L’exemple montre qu’il est possible que deux clés d’une même hastable donnent la même valeur pour la fonction de hachage. ' $ 6.5.18 Représentation d’une Hashtable # 128 & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 246 Introduction au langage de programmation Java 6 API Java Cette figure représente une table de hachage dans laquelle les conteneurs possèdent 5 entrées. Cette table correspond au programme précédent. Le premier conteneur correspond à la valeur de hachage 2112 et le second à la valeur 2143. Le premier conteneur contient deux éléments, le premier correspond avec la chaîne de caractères « Bebe » et le second avec la chaîne de caractères « Aha ». Le second conteneur contient l’élément correspondant à la chaîne de caractères « Bah ». ' $ Questions collections en Java # 129 Quelles sont les opérations préconisées par l’interface Collection ? À quel usage est destiné un Iterator ? Quelle est l’utilité du concept de Map ? & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 247 Introduction au langage de programmation Java ' 7 Exceptions en Java $ 7 Exceptions en Java # 130 7.1 7.2 7.3 7.4 7.5 Motivation : retours sur un bug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Principes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Réalisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .136 Traitement des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Exemple de traitement d’exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 & % Cette partie s’intéresse au traitement des erreurs et à leur gestion à travers les classes d’exceptions. ' # 131 $ 7.1 Motivation : retours sur un bug & % Après avoir visionné l’accident du vol, voici quelques explications extraites du rapport d’experts réalisés en 1996. Les parties expliquant la cause informatique de cet accident ont été mise en gras. « In general terms, the Flight Control System of the Ariane 5 is of a standard design. The attitude of the launcher and its movements in space are measured by an Inertial Reference System (SRI). It has its own internal computer, in which angles and velocities are calculated on the basis of information from a “strapdown” inertial platform, with laser gyros and accelerometers. The data from the SRI are transmitted through the databus to the On-Board Computer (OBC), which executes the flight program and controls the nozzles of the solid boosters and the Vulcain cryogenic engine, via servovalves and hydraulic actuators. In order to improve reliability there is considerable redundancy at equipment level. There are two SRIs operating in parallel, with identical hardware and software. One SRI is active and one is in stand-by, and if Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 248 Introduction au langage de programmation Java 7 Exceptions en Java the OBC detects that the active SRI has failed it immediately switches to the other one, provided that this unit is functioning properly. Likewise there are two OBCs, and a number of other units in the Flight Control System are also duplicated. The design of the Ariane 5 SRI is practically the same as that of an SRI which is presently used on Ariane 4, particularly as regards the software. Based on the extensive documentation and data on the Ariane 501 failure made available to the Board, the following chain of events, their inter-relations and causes have been established, starting with the destruction of the launcher and tracing back in time towards the primary cause. • The launcher started to disintegrate at about H0 + 39 seconds because of high aerodynamic loads due to an angle of attack of more than 20 degrees that led to separation of the boosters from the main stage, in turn triggering the self-destruct system of the launcher. • This angle of attack was caused by full nozzle deflections of the solid boosters and the Vulcain main engine. • These nozzle deflections were commanded by the On-Board Computer (OBC) software on the basis of data transmitted by the active Inertial Reference System (SRI 2). Part of these data at that time did not contain proper flight data, but showed a diagnostic bit pattern of the computer of the SRI 2, which was interpreted as flight data. • The reason why the active SRI 2 did not send correct attitude data was that the unit had declared a failure due to a software exception. • The OBC could not switch to the back-up SRI 1 because that unit had already ceased to function during the previous data cycle (72 milliseconds period) for the same reason as SRI 2. • The internal SRI software exception was caused during execution of a data conversion from 64-bit floating point to 16-bit signed integer value. The floating point number which was converted had a value greaterthan what could be represented by a 16-bit signed integer. This resulted in an Operand Error. The data conversion instructions (in Ada code) were not protected from causing an Operand Error, although other conversions of comparable variables in the same place in the code were protected. » $ ' 7.2 Principes Séparation entre flot de gestion des erreurs et flot d’exécution normale Contrôle de flot spécifique pour les exceptions Parties de code balisées relativement au traitement d’erreurs (régions gardées) # 132 Parties de code spécifiques pour le traitement d’erreurs Méthode constatant l’erreur et ne possédant pas suffisamment d’informations dans son contexte pour la traiter Nécessité de remonter le chemin d’appel jusqu’à trouver une méthode possédant suffisamment d’informations pour traiter cette erreur & % La gestion des erreurs dans les programmes orientés objet tente de distinguer les instructions associées au contrôle de flot normal du programme et celles qui sont associées à la gestion des erreurs. Pour ce faire, Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 249 7 Exceptions en Java 7.2 Principes Java introduit la notion d’exception. Une exception est un événement qui ressemble à une interruption logicielle, comme lorsque votre programme fait une division par 0. La gestion des exceptions permet au programme de prévenir et d’essayer de traiter ce type d’erreurs avec beaucoup de flexibilité pour permettre au programme de continuer à fonctionner. Généralement, la méthode dans laquelle l’erreur est détectée ne possède pas suffisamment d’informations dans son contexte pour traiter cette erreur. L’erreur vient en effet le plus souvent de mauvais paramètres qui ont été reçus par cette méthode. L’exception doit remonter le long du chemin d’appel des méthodes jusqu’à une méthode qui possède suffisamment d’informations pour traiter cette erreur. $ ' 7.2.1 Mise en œuvre Les méthodes peuvent : Lever une exception : En prévenant les autres méthodes par l’ajout d’une clause throws dans leur prototype En créant un objet du type exception : classe qui dérive de java.lang.Exception # 133 Et en utilisant le mot réservé « throw » pour provoquer la remontée du chemin d’appel Relayer des exceptions en ajoutant au prototype le mot clef « throws » et la liste des exceptions Traiter des exceptions par des blocs try, catch, et finally & % ' $ 7.2.2 Exemple de traitement 1 2 3 4 5 6 7 8 9 # 134 10 11 12 13 14 15 16 17 18 19 20 21 public class ArrayControled { s t a t i c f i n a l i n t max = 4 2 ; p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { int i , j = 0; i n t [ ] a r r a y O f I n t = new i n t [ max ] ; f o r ( i =0; i <a r r a y O f I n t . l e n g t h ; i ++){ arrayOfInt [ i ] = i ; } f o r ( i =0; i <a r g s . l e n g t h ; i ++){ try { j = Integer . parseInt ( args [ i ] ) ; System . o u t . p r i n t l n ( a r r a y O f I n t [ j ] ) ; } catch ( NumberFormatException n f e ){ System . o u t . p r i n t l n ( " P a r a m e t e r ␣ " + a r g s [ i ] + " ␣ s h o u l d ␣ be ␣ an ␣ i n t e g e r " ) ; } c a t c h ( A r r a y I n d e x O u t O f B o u n d s E x c e p t i o n oobe ) { System . o u t . p r i n t l n ( " P a r a m e t e r ␣ " + a r g s [ i ] + " ␣ s h o u l d ␣ be ␣>=0␣ and ␣<" + max ) ; } } } } & % Ce code initialise un tableau de 42 entiers dans la partie entre le lignes 6 et 8 avec leur indice. Puis, à partir des arguments du main, il essaye d’afficher le contenu de l’entrée correspondante du tableau. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 250 7 Exceptions en Java 7.3 Réalisation Dans ce code, la région gardée correspond aux lignes 10 à 13, c’est à dire le bloc d’instructions du try. Deux cas d’erreur sont traités : l’argument n’est pas un entier et la valeur de l’entier obtenu n’est pas entre 0 et 41. L’exécution de ce programme avec les arguments 2 43 zurg 22, donne le résultat suivant : 2 Parameter 43 should be >=0 and <42 Parameter zurg should be an integer 22 ' $ 7.3 Réalisation Classes dérivées de java.lang.Exception Lever une exception consiste à : Créer une instance d’une classe dérivée de java.lang.Exception # 135 Déclencher le déroulement arrière des appels de méthodes qui ont menés à la méthode courante Arrêter le déroulement arrière à la rencontre d’un bloc try catch pour ce type d’exception S’il n’y a aucun bloc try catch l’exception remonte jusqu’à la machine virtuelle Java qui interrompt l’exécution Lorsqu’un bloc try catch correspondant à l’exception est trouvé : I Les instructions suivantes du bloc try sont sautées I Les instructions du bloc catch qui correspond le mieux sont exécutées & % Les exceptions sont des classes dérivées de la classe java.lang.Exception. Lever une exception consiste à créer une instance d’une classe dérivée de java.lang.Exception, puis à déclencher le déroulement arrière des appels de méthodes qui ont menées à la création de l’exception. Ce déroulement arrière s’interrompt lorsqu’il rencontre un bloc try catch correspondant à ce type d’exception. Si aucun bloc try catch n’est trouvé, alors l’exception remonte jusqu’à la machine virtuelle Java qui interrompt l’exécution du programme. Lorsqu’un bloc try catch est trouvé, les instructions dans le bloc try qui suivent l’instruction qui a provoqué l’exception ne sont pas exécutées et le flux de contrôle passe à la première instruction de la partie catch dont la classe correspond le mieux à l’exception qui est reçue. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 251 Introduction au langage de programmation Java ' 7 Exceptions en Java $ 7.3.1 java.lang.Exception # 136 & % Les exceptions sont des classes. Il est possible d’en définir de nouvelles. Elles doivent dériver de la classe Exception ou d’une de ses classes dérivées. La classe Exception hérite, quant à elle, de la classe Throwable qui fournit l’ensemble des opérations. Les classes issues de Throwable se rangent en deux catégories : • hors contrôle : elles servent à gérer les erreurs internes à Java ou les fautes de programmation (division par zéro, dépassement des limites d’un tableau, etc.). Pour ces exceptions hors contrôle : – la directive throws ne doit pas être utilisée ; – les erreurs internes à Java sont gérées par la classe Error qui hérite de Throwable. Ces erreurs ne peuvent pas être déclenchées par le programmeur ; – les fautes de programmation sont gérées par la classe RuntimeException et toutes ses sous-classes (par exemple, ArithmeticException) ; • sous contrôle : il s’agit des autres exceptions que peuvent déclencher vos méthodes et que vous devez signaler à leurs utilisateurs par la directive throws. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 252 Introduction au langage de programmation Java ' 7 Exceptions en Java $ 7.4 Traitement des exceptions Pour les exceptions sous contrôle : Une méthode qui fait appel à une méthode qui peut lever une exception doit définir son comportement relativement à cette exception # 137 Traiter l’exception par un bloc try catch Relayer l’exception par le mot réservé throws Réorganisation du code de manière cohérente dans les blocs try. & % Une méthode qui fait appel à une méthode qui peut lever une exception doit définir son propre comportement relativement à cette exception. Pour cela elle peut soit prendre en charge le traitement de l’exception en entourant l’appel correspondant dans un bloc try catch, soit déclarer qu’elle est transparente à l’exception en utilisant le mot réservé throws pour ce type d’exception. L’introduction de bloc try catch s’accompagne de la réorganisation du code en intégrant les parties qui dépendent de la bonne exécution de la méthode risquant de lever l’exception, à l’intérieur du bloc. ' $ 7.5 Exemple de traitement d’exceptions 1 2 3 4 5 6 1 2 # 138 3 4 5 6 7 8 9 10 11 12 13 14 15 p u b l i c c l a s s NumException e x t e n d s E x c e p t i o n { p r i v a t e s t a t i c f i n a l l o n g s e r i a l V e r s i o n U I D = 1L ; p u b l i c NumException ( f i n a l d o u b l e v a l e u r , f i n a l S t r i n g s ) { super ( s + "␣ v a l e u r ␣ : ␣" + v a l e u r ) ; } } public c l a s s TestSimpleExcept { /∗ ∗ ∗ P o s i t i f t e s t e s i l a v a l e u r du p a r a m e t r e v a l e s t p o s i t i v e . ∗ @param v a l v a l e u r a t e s t e r ∗ @t hro ws NumException s i v a l e s t < 0 ∗/ p r i v a t e s t a t i c v o i d p o s i t i f ( f i n a l d o u b l e v a l ) t h r o w s NumException { i f ( v a l < 0 . 0 ) throw new NumException ( v a l , " V a l e u r ␣ p o s i t i v e ␣ a t t e n d u e . " ) ; return ; } /∗ ∗ ∗ t e s t P o s i t i f u t i l i s e p o s i t i f e t r e l a y e l ’ e x c e p t i o n NumException . ∗ @param v a l v a l e u r a t e s t e r . ∗ @t hro ws NumException l o r s q u e p o s i t i f emet NumException ∗/ & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 253 Introduction au langage de programmation Java ' p r i v a t e s t a t i c v o i d t e s t P o s i t i f ( d o u b l e v a l ) t h r o w s NumException { p o s i t i f ( val ); System . o u t . p r i n t l n ( " Pas ␣d ’ e x c e p t i o n ␣ l e ␣ c o d e ␣ c o n t i n u e ␣ en ␣ s e q u e n c e " ) ; return ; } /∗ ∗ ∗ T r a i t e m e n t d e s a r g u m e n t s de main p a r t e s t d e s ∗ valeurs entieres positives . ∗ @param a r g v a r g u m e n t s de l a l i g n e de commande . ∗/ p u b l i c s t a t i c v o i d main ( f i n a l S t r i n g [ ] a r g v ) { int i , j = 0; f o r ( i =0; i <a r g v . l e n g t h ; i ++) { try { j = I n t e g e r . p a r s e I n t ( argv [ i ] ) ; testPositif ( j ); } catch ( NumberFormatException n f e ){ System . o u t . p r i n t l n ( " P a r a m e t e r ␣ " + a r g v [ i ] + " ␣ s h o u l d ␣ be ␣ an ␣ i n t e g e r " ) ; } c a t c h ( NumException n ) { System . o u t . p r i n t l n ( " Catch ␣ d a n s ␣ l e ␣ main ␣ " + n ) ; } } } 16 17 18 19 20 21 22 23 24 25 26 # 139 27 28 29 30 31 32 33 34 35 36 37 38 39 7 Exceptions en Java $ } & % ' $ Trace d’exécution avec arguments 2, -3 et 3 : # 140 Pas d’exception le code continue en sequence Catch dans le main NumException: Valeur positive attendue. valeur : -3.0 Pas d’exception le code continue en sequence & % Dans cet exemple la classe NumException permet de caractériser des exceptions qui sont relatives à une valeur numérique reçue en paramètre. Cette exception est utilisée dans la méthode positif de la classe TestSimpleExcept pour interrompre le cours normal de l’exécution du programme lorsque cette méthode est appelée avec un argument inférieur à 0. La méthode positif est appelée à travers testPositif qui ne lève pas d’exception elle-même mais relaie l’exception, du fait qu’elle contient la clause throws. L’exécution de cette méthode est interrompue lorsqu’une exception est levée. La méthode main contrôle les appels à testPositif par un bloc try catch. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 254 Introduction au langage de programmation Java ' 7 Exceptions en Java $ Questions sur les exceptions À quoi servent : # 141 1. Le bloc try catch ? 2. Le mot réservé new après la directive throw ? Pourquoi créer une classe d’exception ? & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 255 8 Concepts objets avancés en Java ' 8.1 Copie simple/légère $ 8 Concepts objets avancés en Java # 142 8.1 Copie simple/légère . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 8.2 Retour sur hashCode() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 8.3 Retour sur les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 & % Cette partie est consacrée aux concepts objets avancés et à leur réalisation en Java. Parmi ces concepts, nous abordons les classes abstraites, et les interfaces. Cette partie revient sur des concepts déjà vus comme la copie profonde et les exceptions, pour évoquer leur utilisation dans des cas peu simples. ' $ 8.1 Copie simple/légère Les objets sont manipulés par des références ⇒ o2 = o1 : copie la référence o1 dans o2 # 143 o2 = o1.clone() : o2 référence un nouvel objet (copie de o1) & % La classe Object propose une copie légère par un clonage basé sur la copie champ par champ réalisée par affectation : elle n’appelle pas récursivement la méthode clone() (pour cette raison, la copie est appelée légère). Cette opération de clonage par défaut n’est possible que si la classe réalise (implements) l’interface java.lang.Cloneable. Si ce n’est pas le cas, l’exception CloneNotSupportedException est levée. Cette copie champ par champ est suffisante pour avoir deux objets indépendants lorsque les objets copiés ne contiennent pas de référence. Lorsque les objets contiennent des références, il faut définir la méthode clone() pour cette classe, mais aussi pour toutes les classes référencées par celle-ci, afin de réaliser une copie récursive dite « copie profonde ». Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 256 8 Concepts objets avancés en Java 8.1 Copie simple/légère La méthode clone est protected dans la classe Object afin de restreindre l’utilisation de cette méthode aux classes et à leurs classes filles. Si le clonage est garanti (par la redéfinition de la méthode clone), celle-ci doit devenir publique. ' $ 8.1.1 Copie pour studs # 144 & % Nous voulons réaliser une méthode clone qui fonctionne pour la paire Scrutin et Personne. La difficulté de ce clonage tient au fait que la relation est bidirectionnelle. Il faut donc être capable de dupliquer les deux objets et de ne pas avoir d’incohérence d’association entre ces objets. ' $ 8.1.2 Représentation graphique d’une copie légère dans studs # 145 & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 257 8 Concepts objets avancés en Java ' 8.1 Copie simple/légère $ 8.1.3 Exemple de copie légère 1 2 3 4 5 6 7 8 9 # 146 10 11 12 13 14 15 16 17 18 19 20 21 22 & % ' $ 1 2 3 4 5 6 7 8 9 10 11 # 147 package s t u d s c l o n e l i g h t ; import j a v a . u t i l . A r r a y L i s t ; import studs . B u l l e t i n ; p u b l i c c l a s s Personne implements C l o n e a b l e { p r i v a t e S t r i n g nom , prenom ; p r i v a t e i n t n b P a r t i c i p a t i o n s = 0 , nbOrg = 0 ; p r i v a t e A r r a y L i s t <S c r u t i n > s c r u t i n s ; p u b l i c P e r s o n n e ( S t r i n g nom , S t r i n g prenom ) { t h i s . nom = nom ; t h i s . prenom = prenom ; s c r u t i n s = new A r r a y L i s t <S c r u t i n > ( ) ; } p u b l i c S c r u t i n o r g a n i s e r S c r u t i n ( S t r i n g nom ) { s c r u t i n s . add ( new S c r u t i n ( nom , t h i s ) ) ; r e t u r n s c r u t i n s . g e t ( nbOrg ++); } @Override p u b l i c Personne c l o n e ( ) throws CloneNotSupportedException { return ( Personne ) super . clone ( ) ; } p u b l i c S t r i n g getNom ( ) { r e t u r n nom ; } p u b l i c S t r i n g getPrenom ( ) { r e t u r n prenom ; } p u b l i c A r r a y L i s t <S c r u t i n > g e t S c r u t i n s ( ) { r e t u r n s c r u t i n s ; } p u b l i c void v o t e r ( B u l l e t i n b ){ } public void c o n s u l t e r R e s u l t a t ( Scrutin s ) { } public void seRetirerDUnScrutin ( Scrutin s ) { } } 12 13 14 15 16 17 18 19 20 21 22 23 24 import j a v a . u t i l . A r r a y L i s t ; import s t u d s c l o n e l i g h t . S c r u t i n ; import s t u d s c l o n e l i g h t . Personne ; public class TestCloneLight { p u b l i c s t a t i c v o i d main ( f i n a l S t r i n g [ ] a r g s ) throws CloneNotSupportedException { P e r s o n n e p = new P e r s o n n e ( " Dupont " , " J u l i e n " ) ; p . o r g a n i s e r S c r u t i n ( " E l e c t i o n ␣ bde " ) ; P e r s o n n e p1 = p . c l o n e ( ) ; i f ( p1 == p ) { System . o u t . p r i n t l n ( " p␣==␣ p1 " ) ; } i f ( p . getNom ( ) == p1 . getNom ( ) ) { System . o u t . p r i n t l n ( " p␣ e t ␣ p1 ␣noms␣==" ) ; } i f ( p . getPrenom ( ) == p1 . getPrenom ( ) ) { System . o u t . p r i n t l n ( " p␣ e t ␣ p1 ␣ prenoms ␣==" ) ; } A r r a y L i s t <S c r u t i n > a1 , a2 ; a1 = p . g e t S c r u t i n s ( ) ; a2 = p1 . g e t S c r u t i n s ( ) ; i f ( a1 == a2 ) { System . o u t . p r i n t l n ( " p␣ e t ␣ p1 ␣ s c r u t i n s ␣==" ) ; } else { & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 258 8 Concepts objets avancés en Java ' for ( int 25 System . o u t . p r i n t l n ( " S c r u t i n ␣ de ␣ r a n g ␣ " + i +" ␣==" ) ; 27 } 28 } 29 } 30 } 31 32 i ++){ i f ( a1 . g e t ( i ) == a2 . g e t ( i ) ) { 26 # 148 i = 0 ; i < a1 . s i z e ( ) ; 8.1 Copie simple/légère $ } p et p1 noms == p et p1 prenoms == p et p1 scrutins == & % Dans cet exemple, la classe Personne implémente l’interface Clonable en réalisant le clonage par l’utilisation de la méthode clone héritée de la classe Object. L’objet obtenu est bien distinct de l’objet initial. Par contre, les objets référencés par les deux objets, à savoir le nom, le prénom et le tableau de Scrutin n’ont pas été dupliqués et donc ils sont partagés par les deux objets de type Personne. ' $ 8.1.4 Représentation graphique d’une copie plus profonde dans studs # 149 & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 259 8 Concepts objets avancés en Java ' 8.1 Copie simple/légère $ 8.1.5 Copie plus profonde dans studs 1 2 package s t u d s c l o n e d e e p ; import j a v a . u t i l . A r r a y L i s t ; 3 4 5 6 7 8 9 # 150 10 11 12 13 14 15 16 17 18 19 20 21 22 import studs . B u l l e t i n ; p u b l i c c l a s s Personne implements C l o n e a b l e { p r i v a t e S t r i n g nom , prenom ; p r i v a t e i n t n b P a r t i c i p a t i o n s = 0 , nbOrg = 0 ; p r i v a t e A r r a y L i s t <S c r u t i n > s c r u t i n s ; p u b l i c Personne ( f i n a l S t r i n g n , f i n a l S t r i n g p ) { t h i s . nom = n ; t h i s . prenom = p ; s c r u t i n s = new A r r a y L i s t <S c r u t i n > ( ) ; } p u b l i c S c r u t i n o r g a n i s e r S c r u t i n ( f i n a l S t r i n g nom ) { S c r u t i n s = new S c r u t i n ( nom , t h i s ) ; s c r u t i n s . add ( s ) ; nbOrg ++; return s ; } /∗ ∗ l e c l o n a g e e s t p r o f o n d , i l d u p l i q u e l e s o b j e t s r e f e r e n c e s ∗/ @SuppressWarnings ( " unchecked " ) @Override & % ' $ p u b l i c Personne c l o n e ( ) throws CloneNotSupportedException { P e r s o n n e c l o n e = new P e r s o n n e ( nom , prenom ) ; clone . nbParticipations = nbParticipations ; c l o n e . nbOrg = nbOrg ; c l o n e . s c r u t i n s = ( A r r a y L i s t <S c r u t i n >) s c r u t i n s . c l o n e ( ) ; return clone ; } p u b l i c S t r i n g getNom ( ) { r e t u r n nom ; } p u b l i c S t r i n g getPrenom ( ) { r e t u r n prenom ; } p u b l i c A r r a y L i s t <S c r u t i n > g e t S c r u t i n s ( ) { r e t u r n s c r u t i n s ; } p u b l i c void v o t e r ( f i n a l B u l l e t i n b ){ } public void c o n s u l t e r R e s u l t a t ( Scrutin s ) { } public void seRetirerDUnScrutin ( Scrutin s ) { } 23 24 25 26 27 28 29 30 31 32 33 # 151 34 35 36 1 } import j a v a . u t i l . A r r a y L i s t ; 2 3 4 5 6 7 8 9 import s t u d s c l o n e d e e p . S c r u t i n ; import s t u d s c l o n e d e e p . Personne ; p u b l i c c l a s s TestCloneDeep { p u b l i c s t a t i c v o i d main ( f i n a l S t r i n g [ ] a r g s ) throws CloneNotSupportedException { P e r s o n n e p = new P e r s o n n e ( " Dupont " , " J u l i e n " ) ; p . o r g a n i s e r S c r u t i n ( " E l e c t i o n ␣ bde " ) ; & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 260 8 Concepts objets avancés en Java ' 10 11 12 13 14 15 16 17 18 19 20 # 152 21 22 23 24 25 26 27 28 29 30 31 32 33 & P e r s o n n e p1 = p . c l o n e ( ) ; i f ( p1 == p ) { System . o u t . p r i n t l n ( " p␣==␣ p1 " ) ; } i f ( p . getNom ( ) == p1 . getNom ( ) ) { System . o u t . p r i n t l n ( " p␣ e t ␣ p1 ␣noms␣==" ) ; } i f ( p . getPrenom ( ) == p1 . getPrenom ( ) ) { System . o u t . p r i n t l n ( " p␣ e t ␣ p1 ␣ prenoms ␣==" ) ; } A r r a y L i s t <S c r u t i n > a1 , a2 ; a1 = p . g e t S c r u t i n s ( ) ; a2 = p1 . g e t S c r u t i n s ( ) ; i f ( a1 == a2 ) { System . o u t . p r i n t l n ( " p␣ e t ␣ p1 ␣ s c r u t i n s ␣==" ) ; } else { f o r ( i n t i = 0 ; i < a1 . s i z e ( ) ; i ++) { i f ( a1 . g e t ( i ) == a2 . g e t ( i ) ) { System . o u t . p r i n t l n ( " S c r u t i n s ␣ de ␣ r a n g ␣ " + i +" ␣==" ) ; } else { i f ( a1 . g e t ( i ) . g e t O r g a n i s a t e u r ( ) == a2 . g e t ( i ) . g e t O r g a n i s a t e u r ( ) ) { System . o u t . p r i n t l n ( " O r a g a n i s a t e u r ␣ d e s ␣ s c r u t i n s ␣ de ␣ r a n g " + i +"==" ) ; } } % ' $ } 34 # 153 } 35 } 36 37 8.1 Copie simple/légère $ } & % Scrutins de rang 0 == Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 261 8 Concepts objets avancés en Java ' 8.1 Copie simple/légère $ 8.1.6 Représentation graphique d’une copie profonde # 154 & % ' $ 8.1.7 Clone de Scrutin 1 2 3 4 5 6 7 8 9 # 155 10 11 12 13 14 15 16 17 18 19 20 21 22 package s t u d s c l o n e ; p u b l i c c l a s s S c r u t i n implements C l o n e a b l e { p r i v a t e Personne o r g a n i s a t e u r ; p r i v a t e S t r i n g nomScrutin ; p u b l i c S c r u t i n ( f i n a l S t r i n g nom , f i n a l P e r s o n n e o r g a n i s a t e u r ) { n o m S c r u t i n = nom ; this . organisateur = organisateur ; } /∗ ∗ l e c l o n a g e d u p l i q u e l e nom m a i s ne p e u t p a s m o d i f i e r l ’ o r g a n i s a t e u r . ∗ En e f f e t l e c l o n a g e de l ’ o r g a n i s a t i o n c l o n e l e s s c r u t i n s qu ’ i l a ∗ o r g a n i s à ľ e t n o u s e n t r e r i o n s d a n s une c a s c a d e d ’ a p p e l s i n f i n i e ∗ ∗/ @Override p u b l i c S c r u t i n c l o n e ( ) throws CloneNotSupportedException { r e t u r n new S c r u t i n ( new S t r i n g ( n o m S c r u t i n ) , o r g a n i s a t e u r ) ; } /∗ ∗ Methode p o u r m o d i f i e r l ’ o r g a n i s a t e u r en c a s de c l o n a g e . ∗/ void s e t O r g a n i s a t e u r ( f i n a l Personne norg ) { o r g a n i s a t e u r = norg ; } p u b l i c Personne g e t O r g a n i s a t e u r () { return organisateur ; & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 262 8 Concepts objets avancés en Java ' # 156 } 23 24 8.1 Copie simple/légère $ } & % Scrutin contient deux attributs, une chaîne de caractères qui est clonable, et une référence sur l’organisateur du Scrutin. La méthode clone est définie entre les lignes 11 et 13. Elle fait appel à la méthode clone de la classe Object qui duplique les attributs de l’objet dans le clone. Nous voulons aussi que le clone du Scrutin puisse être associé avec la Personne lorsque celui-ci aura été clonée. Pour cela, nous introduisons la méthode setOrganisateur(). ' $ 8.1.8 Clone en copie profonde de Personne 1 2 3 4 5 6 7 8 9 # 157 10 11 12 13 14 15 16 17 18 19 20 21 22 package s t u d s c l o n e ; import j a v a . u t i l . A r r a y L i s t ; import s t u d s a b s t r a c t . B u l l e t i n ; p u b l i c c l a s s Personne implements C l o n e a b l e { p r i v a t e S t r i n g nom , prenom ; p r i v a t e i n t n b P a r t i c i p a t i o n s = 0 , nbOrg = 0 ; p r i v a t e A r r a y L i s t <S c r u t i n > s c r u t i n s ; p u b l i c Personne ( f i n a l S t r i n g n , f i n a l S t r i n g p ) { t h i s . nom = n ; t h i s . prenom = p ; s c r u t i n s = new A r r a y L i s t <S c r u t i n > ( ) ; } p u b l i c S c r u t i n o r g a n i s e r S c r u t i n ( f i n a l S t r i n g nom ) { S c r u t i n s = new S c r u t i n ( nom , t h i s ) ; s c r u t i n s . add ( s ) ; nbOrg ++; return s ; } /∗ ∗ l e c l o n a g e e s t p r o f o n d , i l d u p l i q u e l e s o b j e t s r e f e r e n c e s . ∗ Ce n ’ e s t p a s n à ľ c e s s a i r e p o u r l e s o b j e t s du t y p e S t r i n g ∗ du f a i t qu ’ un S t r i n g e s t non m o d i f i a b l e . ∗/ & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 263 8 Concepts objets avancés en Java ' 23 @Override 24 p u b l i c Personne c l o n e ( ) throws CloneNotSupportedException { 25 P e r s o n n e c l = new P e r s o n n e ( nom , prenom ) ; 26 cl . nbParticipations = nbParticipations ; 27 c l . nbOrg = nbOrg ; 28 for ( Scrutin scr : scrutins ) { 29 Scrutin sclone = scr . clone ( ) ; 30 sclone . setOrganisateur ( cl ); c l . s c r u t i n s . add ( s c l o n e ) ; 31 # 158 8.1 Copie simple/légère $ } 32 return cl ; 33 34 } 35 p u b l i c S t r i n g getNom ( ) { r e t u r n nom ; } 36 p u b l i c S t r i n g getPrenom ( ) { r e t u r n prenom ; } 37 p u b l i c A r r a y L i s t <S c r u t i n > g e t S c r u t i n s ( ) { r e t u r n s c r u t i n s ; } 38 public void voter ( f i n a l 39 public void c o n s u l t e r R e s u l t a t ( Scrutin s ) { } public void seRetirerDUnScrutin ( Scrutin s ) { } 40 41 B u l l e t i n b ){ } } & % Pour ce qui est de la personne, nous voulons la cloner et elle contient une liste des scrutins qu’elle a organisés. Il faut donc que nous dupliquions cette liste, ce qui est possible puisqu’elle implémente l’interface Cloneable. Il faut, cependant que la duplication soit profonde c’est-à-dire que nous dupliquions les entrées de la liste. Cette duplication profonde, commence par cloner l’objet courant. Pour cela elle crée un objet copie par appel d’un constructeur à la ligne 23, auquel elle passe les paramètres nom et prenom. Elle modifie ensuite les attributs nbOrg et nbParticipations en y mettant les valeurs des attributs correspondant dans l’objet courant. Ensuite, à la ligne 25, la méthode parcourt les scrutins un à un. Pour chaque scrutin, un clone du scrutin est construit à la ligne 26. L’organisateur de ce scrutin cloné est associé avec la personne en cours de clonage par la méthode setOrganisateur. $ ' 8.1.9 Suite exemple de copie profonde 1 import j a v a . u t i l . A r r a y L i s t ; 2 3 4 5 6 7 8 9 # 159 10 11 12 13 14 15 16 17 18 19 20 21 22 import s t u d s c l o n e . ∗ ; publi c c l a s s TestClone { p u b l i c s t a t i c v o i d main ( f i n a l S t r i n g [ ] a r g s ) throws CloneNotSupportedException { P e r s o n n e p = new P e r s o n n e ( " Dupont " , " J u l i e n " ) ; p . o r g a n i s e r S c r u t i n ( " E l e c t i o n ␣ bde ␣ 2010 " ) ; P e r s o n n e p1 = p . c l o n e ( ) ; i f ( p1 == p ) { System . o u t . p r i n t l n ( " p␣==␣ p1 " ) ; } i f ( p . getNom ( ) == p1 . getNom ( ) ) { System . o u t . p r i n t l n ( " p␣ e t ␣ p1 ␣noms␣==" ) ; } i f ( p . getPrenom ( ) == p1 . getPrenom ( ) ) { System . o u t . p r i n t l n ( " p␣ e t ␣ p1 ␣ prenoms ␣==" ) ; } A r r a y L i s t <S c r u t i n > a1 , a2 ; a1 = p . g e t S c r u t i n s ( ) ; a2 = p1 . g e t S c r u t i n s ( ) ; i f ( a1 == a2 ) { & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 264 Introduction au langage de programmation Java ' System . o u t . p r i n t l n ( " p␣ e t ␣ p1 ␣ s c r u t i n s ␣==" ) ; 23 } else { 24 for ( int 25 i = 0 ; i < a1 . s i z e ( ) ; System . o u t . p r i n t l n ( " S c r u t i n s ␣ de ␣ r a n g ␣ " + i +" ␣==" ) ; 27 } else { 28 i f ( a1 . g e t ( i ) . g e t O r g a n i s a t e u r ( ) == a2 . g e t ( i ) . g e t O r g a n i s a t e u r ( ) ) { 29 System . o u t . p r i n t l n ( " O r a g a n i s a t e u r ␣ d e s ␣ s c r u t i n s ␣ de ␣ r a n g " + i +"==" ) ; 30 } 31 } 32 } 33 } 34 } 35 36 i ++) { i f ( a1 . g e t ( i ) == a2 . g e t ( i ) ) { 26 # 160 8 Concepts objets avancés en Java $ } Résultat de l’exécution : & % La trace d’exécution, montre maintenant que tout est cloné correctement. $ ' 8.2 Retour sur hashCode() Méthode facilitant l’utilisation de Hashtable Contrat de base : # 161 Doit retourner la même valeur lorsqu’elle est appelée plusieurs fois sur le même objet Doit retourner la même valeur pour deux objets equals Peut retourner la même valeur pour deux objets différents (limites du hachage) Algorithme de J. Bloch dans Effective Java & % Cette méthode est destinée à faciliter l’usage des tables hachage. Le contrat de base de cette méthode est le suivant : • si elle est invoquée deux fois sur le même objet, elle doit retourner la même valeur, cela bien sûr uniquement si aucun des attributs utilisés pour la méthode equals() n’a été changé entre les deux appels ; • elle doit retourner la même valeur pour deux objets égaux selon la méthode equals ; • il n’est pas obligatoire que deux objets différents selon la méthode equals retournent des valeurs de hashCode différentes ; Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 265 Introduction au langage de programmation Java 8 Concepts objets avancés en Java • nous utiliserons l’algorithme le plus populaire. Cet algorithme a été proposé par J. Bloch dans Effective Java (Addison-Wesley 2001). En voici la transcription : – partir d’une valeur prédéfinie (si possible un nombre premier), par exemple 17, stockée dans une variable de type int appelée result ; – pour chaque attribut significatif de la classe que nous appelons f (un attribut est significatif s’il est pris en compte par equals()) : ∗ calculer une valeur entière appelée c de hashCode() selon le type de f. ∗ combiner la valeur entière de result avec la valeur obtenue selon l’expression suivante : result = 31 * result + c . – retourner la valeur lorsque tous les attributs significatifs ont été traités. La génération automatique des méthodes equals et hashCode sera réalisée pendant les séances de travaux pratiques. ' $ 8.2.1 Exemple hashCode 1 2 3 4 5 6 7 8 9 # 162 10 11 12 13 14 15 16 17 18 19 20 21 package s t u d s e q u a l s ; p u b l i c c l a s s Personne { p r i v a t e S t r i n g nom , prenom ; p u b l i c P e r s o n n e ( f i n a l S t r i n g nom , f i n a l S t r i n g prenom ) { t h i s . nom = nom ; t h i s . prenom = prenom ; } @Override p u b l i c boolean e q u a l s ( Object obj ) { i f ( t h i s == o b j ) r e t u r n t r u e ; i f ( o b j == n u l l ) r e t u r n f a l s e ; i f ( ! ( obj i n s t a n c e o f Personne )) return f a l s e ; Personne other = ( Personne ) obj ; i f ( nom == n u l l ) { i f ( o t h e r . nom != n u l l ) r e t u r n f a l s e ; } e l s e i f ( ! nom . e q u a l s ( o t h e r . nom ) ) r e t u r n f a l s e ; i f ( prenom == n u l l ) { i f ( o t h e r . prenom != n u l l ) return false ; } e l s e i f ( ! prenom . e q u a l s ( o t h e r . prenom ) ) r e t u r n f a l s e ; return true ; } } & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 266 8 Concepts objets avancés en Java ' 8.3 Retour sur les exceptions $ 8.3 Retour sur les exceptions 1 p u b l i c c l a s s NumException e x t e n d s E x c e p t i o n { private static 3 p u b l i c NumException ( f i n a l d o u b l e v a l e u r , final } 5 6 } 1 p u b l i c c l a s s N u l l E x c e p t i o n e x t e n d s NumException { f i n a l l o n g s e r i a l V e r s i o n U I D = 1L ; 2 private static 3 public NullException () { s u p e r ( 0 , " V a l e u r ␣ n u l l e ␣ non ␣ a t t e n d u e " ) ; 4 } 5 6 String s ) { super ( s + "␣ v a l e u r ␣ : ␣" + v a l e u r ) ; 4 # 163 f i n a l l o n g s e r i a l V e r s i o n U I D = 1L ; 2 } & % Nous reprenons la classe NumException et nous définissons aussi une version dérivée de celle-ci appelée NullException. Cette exception est destinée à être levée lorsqu’un argument est null alors qu’il ne devrait pas l’être. $ ' 8.3.1 Test des exceptions 1 2 3 4 5 6 7 8 9 # 164 10 11 12 13 14 15 16 17 18 19 20 21 22 public class TestExceptInHerit { /∗ ∗ ∗ Methode v e r i f i a n t qu ’ une v a l e u r e s t p o s i t i v e . ∗ @param v a l v a l e u r a t e s t e r ∗ @return valeur d ’ entree ∗ @t hro ws NumException s i v a l e u r n e g a t i v e ∗ @t hro ws N u l l E x c e p t i o n s i v a l e u r e g a l e a z e r o . ∗/ p r i v a t e s t a t i c double p o s i t i f O u N u l l ( f i n a l double v a l ) t h r o w s NumException , N u l l E x c e p t i o n { i f ( val < 0.0) { throw new NumException ( v a l , " P o s i t i f O u N u l l ␣ v a l e u r ␣ p o s i t i v e ␣ a t t e n d u e . " ) ; } i f ( v a l == 0 . 0 ) { throw new N u l l E x c e p t i o n ( ) ; } return val ; } /∗ ∗ ∗ traitement p a r t i e l d ’ exception les exceptions ∗ N u l l E x c e p t i o n s o n t t r a i t e e s , l e s e x c e p t i o n s NumException ∗ sont t r a i t e e s p a r t i e l l e m e n t et r e l a y e e s . & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 267 8 Concepts objets avancés en Java ' ∗ @param v a l v a l e u r a t e s t e r ∗ @t hro ws NumException ∗/ p r i v a t e s t a t i c void t e s t P o s i t i f O u N u l l ( f i n a l double v a l ) t h r o w s NumException { d o u b l e d =0; System . o u t . p r i n t l n ( " Dans ␣ t e s t P o s i t i f O u N u l l ␣ v a l ␣=␣ "+v a l ) ; try { d = positifOuNull ( val ); System . o u t . p r i n t l n ( " Pas ␣d ’ e x c e p t i o n ␣ l e ␣ c o d e ␣ c o n t i n u e ␣ en ␣ s e q u e n c e " ) ; } c a t c h ( N u l l E x c e p t i o n m) { System . o u t . p r i n t l n ( " Catch ␣ N u l l E x c e p t i o n ␣ d a n s ␣ t e s t P o s i t i f O u N u l l ␣ " + m) ; throw m; } c a t c h ( NumException m) { System . o u t . p r i n t l n ( " Catch ␣ NumException ␣ d a n s ␣ t e s t P o s i t i f O u N u l l ␣ " + " t r a i t e m e n t ␣ p a r t i e l ␣ e t ␣ r e l a i s " + m) ; throw m; } finally { System . o u t . p r i n t l n ( " Dans ␣ l e ␣ f i n a l l y ␣ de ␣ t e s t P o s i t i f O u N u l l ␣ " + d ) ; } } p u b l i c s t a t i c v o i d main ( f i n a l S t r i n g [ ] a r g s ) { int j = 0; 23 24 25 26 27 28 29 30 31 32 33 # 165 34 35 36 37 38 39 40 41 42 43 44 45 46 & % ' $ f o r ( S t r i n g oneArg : a r g s ) { 47 try { 48 j = I n t e g e r . p a r s e I n t ( oneArg ) ; 49 testPositifOuNull ( j ); 50 } catch ( NumberFormatException n f e ){ 51 System . o u t . p r i n t l n ( " P a r a m e t e r ␣ " + oneArg 52 # 166 8.3 Retour sur les exceptions $ + " ␣ s h o u l d ␣ be ␣ an ␣ i n t e g e r " ) ; 53 } c a t c h ( NumException n ) { 54 System . o u t . p r i n t l n ( " Catch ␣ d a n s ␣ l e ␣ main ␣ " + n ) ; 55 } 56 } 57 } 58 59 } & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 268 8 Concepts objets avancés en Java ' 8.3 Retour sur les exceptions $ L’exécution de ce programme avec les arguments du main 2 0 -2 donne l’affichage suivant : # 167 Dans testPositifOuNull val = 2.0 Pas d’exception le code continue en sequence Dans le finally de testPositifOuNull 2.0 Dans testPositifOuNull val = 0.0 Catch NullException dans testPositifOuNull NullException: Valeur nulle non attendue valeur reçue : 0.0 Dans le finally de testPositifOuNull 0.0 Catch dans le main NullException: Valeur nulle non attendue valeur reçue : 0.0 Dans testPositifOuNull val = -2.0 Catch NumException dans testPositifOuNull traitement partiel et relaisNumException: PositifOuNull valeur positive attendue. valeur reçue : -2.0 Dans le finally de testPositifOuNull 0.0 Catch dans le main NumException: PositifOuNull valeur positive attendue. valeur reçue : -2.0 & % La méthode Positif lève deux exceptions suivant la valeur de l’argument qui lui est passé. Elle lève l’exception de type NumException lorsqu’elle reçoit un argument dont la valeur est inférieure à zéro. Elle lève l’exception de type NullException lorsqu’elle reçoit un argument égal à 0. Le méthode testPositif réalise un appel à la méthode Positif et réagit lorsque cette dernière lève une exception. Lorsque l’exception est de type NullException la méthode testPositif traite cette exception et se termine. Il est aussi possible de récupérer une exception, dans notre cas NumException, de réaliser un traitement puis de la retransmettre en utilisant l’instruction throw. Vous noterez que le bloc finally est exécuté dans tous les cas, c’est-à-dire, qu’il y ait exception ou pas, et que l’exception soit traitée ou pas. ' $ 8.3.2 RuntimeException # 168 & % Les exceptions qui sont dérivées de l’exception RunTimeException sont exemptes de la vérification à la compilation. Ceci permet au programmeur de ne pas encadrer les sections qui risquent de lever ces exceptions Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 269 8 Concepts objets avancés en Java 8.3 Retour sur les exceptions dans des try...catch. Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 270 Introduction au langage de programmation Java ' $ Bibliographie [Armstrong, 2006] Armstrong, D. J. (2006). The quarks of object-oriented development. Communication of the ACM, 49(2) :123–128. # 169 [Knuth, 1973] Knuth, D. E. (1973). The Art of Computer Programming, volume 3. : sorting and searching. Addison-Wesley Publishing Company, Inc. [Maurer and Lewis, 1975] Maurer, W. D. and Lewis, T. G. (1975). Hash table methods. ACM Computing Survey, 7(1) :5–19. & Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 % 271 Introduction au langage de programmation Java Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 272 Introduction au langage de programmation Java Télécom SudParis — Christian Bac, Denis Conan — Octobre 2015 — CSC 4002 273 Les tests en orienté objet J.-Paul Gibson Revision : 1527 CSC 4002 Octobre 2015 274 Les tests en orienté objet Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 275 Les tests en orienté objet Les tests en orienté objet J. Paul Gibson [email protected] http://www-public.telecom-sudparis.eu/~gibson/ Bureau A 207, Le département LOgiciels-Réseaux Thanks to: Christian Bac, Denis Conan & Jean-Luc Raffy 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.1 276 Les tests en orienté objet I.Rappels sur les tests Le cycle en V préparation Spécification Validation Codage et exécution préparation Conception préliminaire Tests d’intégration Codage et exécution préparation Conception détaillée Tests unitaires Codage et exécution Codage (système et tests) 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.2 277 Les tests en orienté objet Les tests en orienté objet I.Rappels sur les tests II. Comment utiliser les modèles OO en UML? III. Étude de cas – médiathèque A) Préparation Tests de validation Tests d’intégration Tests unitaires B) Codage et Exécution Tests unitaires avec Junit Tests d’intégration Tests de validation 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.3 278 Les tests en orienté objet I.Rappels sur les tests Testing Consistency (not uniquely OO) We need consistency between documentation/models: • • • • Natural Language Text (English/French) (UML) models (Java) Code Comments in (Java) Code Develop tests in parallel with code to avoid inconsistency NOTE: testing after all the code is developed is usually a bad idea, but it is better than no testing at all! 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.4 279 Les tests en orienté objet I.Rappels sur les tests Niveaux de test - pour chaque (sous)système • Tests de validation • Tests d’intégration • Tests unitaires Système P r é p a r a t i o n e x é c u t i o n Sous-système 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.5 280 Les tests en orienté objet UML – les diagrammes Spécification Diagramme des cas d’utilisation – Tests de validation Niveau Sous-Système (Analyse et conception) • test des associations, des agrégations (diagramme de classes) • test de séquences (diagramme de séquence et de communications) • test des exceptions contrȏlées – – Diagramme des classes (ébauche) – Diagrammes de séquence/communications Tests d’intégration Conception détaillée – Classes détaillées – Diagrammes de machine à états 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 Tests unitaires CSC4002-Tests.6 281 Les tests en orienté objet II. (OO) modeles en UML How to Use UML Tests should be derived from the requirements specification (in UML). The UML diagrams should help us because: • • 2014/2015 provided the UML is validated we have a good chance of testing the system against what is required the structure of the UML should correspond to the structure of the developed code, so we can re-use this design structure to structure our tests. Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.7 282 Les tests en orienté objet II. (OO) modeles en UML Validation Use Case Diagrams – for each use case examine possible scenarios, and choose a subset of alternative paths for testing. For example: Use case1 Use case2 Use case3 Use case4 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.8 283 Les tests en orienté objet Integration : composition tree II. (OO) modeles en UML The test sequence can be decided by looking at the tree-like structure of composition hierarchies. For example: Système Composition tree Big Bang Testing : all at once at the system interface Top-Down Testing : does not require all lower level components to be complete Bottom-Up Testing : does not require all higher level components to be complete 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.9 284 Les tests en orienté objet II. (OO) modeles en UML Les tests unitaires • • • Il faut tester les invariants de chaque classe Il faut tester la fonctionnalité de chaque méthode de chaque classe Des classes avec des contraintes séquencielles sur l’activation des méthodes et leurs clients peuvent avoir des erreurs de séquencement. => Le comportement requis doit être testé en utilisant un modèle de machine à états 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.10 285 Les tests en orienté objet III. Etude de cas Comment Tester la Médiathèque? A) Préparation 1. Tests de validation, e.g.: Emprunter 2. Tests d’intégration, e.g.: Emprunter 3. Tests unitaires, e.g.: Document Présentation Séquence 1st 3rd 5th B) Codage et Exécution 4. Tests unitaires avec JUnit 5. Tests d’intégration 6. Tests de validation 6th 4th 2nd 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.11 286 Les tests en orienté objet III. Etude de cas Comment Tester la Médiathèque? Préparation 1. 2. 3. Tests de validation, eg: Emprunter Tests d’intégration, eg: Emprunter Tests unitaire, eg: Document B) Codage et Exécution 4. Tests unitaire avec JUnit 5. Tests d’intégration 6. Tests de validation 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.12 287 Les tests en orienté objet III. Etude de cas – Préparation Tests de Validation Emprunter A validation test is a black box test - usually done by the client - that validates the (partial) behaviour of the whole system. The UML use case diagrams help us to identify good candidates for validation tests. We will test the emprunter functionality 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.13 288 Les tests en orienté objet III. Etude de cas – Préparation Tests de Validation Emprunter Données d’entrée client: peut être inscrit ou non; emprunts: déja effectués par le client • existe-t-il un emprunt en retard ? • le nombre de documents empruntés correspond-il au nombre maximum de ce client ? document: ● existe? • empruntable ou consultable? • déjà emprunté ou disponible? 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.14 289 Les tests en orienté objet III. Etude de cas – Préparation Tests de Validation Emprunter Données de sortie Emprunt accepté ou refusé. Remarque: la définition des jeux de tests de validation pour le cas d’utilisation emprunter document permet de soulever au moins les questions suivantes (à poser au client): • un abonné qui n’est pas à jour de sa cotisation peut-il tout de même emprunter un document? • doit-il être considéré comme un client au tarif normal tant qu’il n’a pas renouvelé son abonnement? • ou doit-il se réabonner avant de pouvoir emprunter un document? D’une manière générale, la préparation des jeux de tests de validation permet de lever les ambiguïtés et les vides de la spécification. NOTE : Plus les tests sont préparés tôt et moins les corrections coûtent chères 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.15 290 Les tests en orienté objet III. Etude de cas – Préparation Tests de Validation Emprunter Table de décisions 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.16 291 Les tests en orienté objet III. Etude de cas – Préparation Tests de Validation Emprunter To illustrate the testing process, we will treat the first 2 test cases Test 1 - Client n'est pas inscrit Test Code Steps: 1. 2. 3. 4. 2014/2015 Intialise dummy Mediatheque Check state of current Mediatheque (including statistics) Attempt to « emprunter » a document for a client who does not exist Check state of current Mediatheque (including statistics) Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.17 292 Les tests en orienté objet III. Etude de cas – Préparation Tests de Validation Emprunter Test 2 - Client possède un emprunt qui est en retard Test Code Steps: 1. 2. 3. 4. 5. 6. Intialise dummy Mediatheque Check state of current Mediatheque (including statistics) Authorise « emprunter » of a document for a client Advance the date so that the previous « emprunt » is now past its deadline Attempt to « emprunter » by the same client before they return the document that is past its deadline Check state of current Mediatheque (including statistics) 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.18 293 Les tests en orienté objet III. Etude de cas Comment Tester la Médiathèque ? A) Préparation 1)Tests de validation, e.g.: Emprunter 2)Tests d’intégration, e.g.: Emprunter 3)Tests unitaires, e.g.: Document B) Codage et Exécution 4)Tests unitaires avec JUnit 5)Tests d’intégration 6)Tests de validation 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.19 294 Les tests en orienté objet III. Etude de cas –Tests de Validation - Codage et Execution Validation Tests Even if our system is not yet completely developed, we can write the code for the validation tests. For this example, we will code the validation test as a JUnit test on the mediatheque class. NOTE: A validation of the overall system is often known as an acceptance test; and can be thought of as a system unit test. 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.20 295 Les tests en orienté objet III. Etude de cas –Tests de Validation - Codage et Execution Test 1 - Client n'est pas inscrit /** * Document TEST 1<br> * Client n'est pas inscrit */ @Test (expected= OperationImpossible.class) // we expect an exception public void clientPasInscrit( ) throws OperationImpossible, InvariantBroken{ m1.emprunter("nom", "prenom", "Test_code1"); } To see why we expect an exception we must look at the setup code 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.21 296 Les tests en orienté objet III. Etude de cas –Tests de Validation - Codage et Execution @Before public void setUp() throws Exception { // un test de validation est un test unitaire sur la classe Mediatheque m1 = new Mediatheque("mediatheque test"); Genre g = new Genre("Test_nom1"); Localisation l = new Localisation("Test_salle1","Test_rayon1"); Document d1 = new Video("Test_code1",l, "Test_titre1", "Test_auteur1", "Test_annee1" ,g, "Test_duree1", "Test_mentionLegale1"); Document d2 = new Video("Test_code2",l, "Test_titre2", "Test_auteur2", "Test_annee2" ,g, "Test_duree2", "Test_mentionLegale2"); m1.ajouterDocument(d1); m1.metEmpruntable("Test_code1"); m1.ajouterDocument(d2); m1.metEmpruntable("Test_code2"); CategorieClient cat = new CategorieClient("Test_Cat1", 10, 1.5, 2.5, 3.5, true); Client c1 = new Client("Test_Client_Nom1", "Test_Client_Prenom1", "Test_Client_Address1",cat); m1.inscrire(c1); Client c2 = new Client("Test_Client_Nom2", "Test_Client_Prenom2", "Test_Client_Address2",cat); } @After public void tearDown() throws Exception {m1 = null;} 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.22 297 Les tests en orienté objet III. Etude de cas –Tests de Validation - Codage et Execution Test 2 - Client n'est pas sans retard /** * Document TEST 2<br> * Client n'est pas sans retard */ @Test (expected= OperationImpossible.class) // we expect an exception public void clientAvecRetard( ) throws OperationImpossible, InvariantBroken{ m1.emprunter("nom1", "prenom1", "Test_code1"); Datutil.addAuJour(7); Datutil.addAuJour(7); m1.emprunter("nom1", "prenom1", "Test_code2"); } 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.23 298 Les tests en orienté objet III. Etude de cas Comment Tester la Médiathèque ? A) Préparation 1. 2. 3. Tests de validation, e.g.: Emprunter Tests d’intégration, eg: Emprunter Tests unitaires, e.g.: Document B) Codage et Exécution 4. Tests unitaires avec JUnit 5. Tests d’intégration 6. Tests de validation 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.24 299 Les tests en orienté objet III. Etude de cas – Préparation Tests d’intégration Emprunter The operation « emprunter » requires co-ordination between the • • • • client, mediatheque, document, and ficheEmprunt objects We wish to verify that the traces (of communication) between the objects involved in the collaboration, as specified in UML, are executed by the implementation (in Java), following the specified temporal ordering. These tests can be derived from the communications and/or sequence diagrams … 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.25 300 Les tests en orienté objet III. Etude de cas – Préparation Tests d’intégration Emprunter In the communications diagram, the temporal order is specified by the numbering 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.26 301 Les tests en orienté objet III. Etude de cas – Préparation Tests d’intégration The co-ordination between the Client and the Document: Emprunter 1 2 3 4 5 6 6.1 6.2 6.2.1 6.3 6.3.1 6.4 6.4.1 6.5 6.6 6.6.1 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 Integration Test 1 An « emprunt » is not authorised because the document is not « empruntable » Integration Test 2 An « emprunt » is not authorised because the document is « emprunté » Integration Test 3 Emprunt is authorised CSC4002-Tests.27 302 Les tests en orienté objet III. Etude de cas –Tests d’Integration - Codage et Execution Emprunter Integration Test1 - An « emprunt » is not authorised because the document is not empruntable • Construct a document,and make it not Empruntable • Construct a client • Construct a FicheEmprunt for the client and document • Check that: 1. the system handles the exceptional case in a meaningful way 2. the client and document states/statistics have not been changed 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.28 303 Les tests en orienté objet III. Etude de cas – Préparation Tests d’intégration Emprunter Integration Test 2 Design: An « emprunt » is not authorised because the document is « emprunté » • Construct a document, which is empruntable and emprunté • Construct a client • Construct a FicheEmprunt for the client and document • Check that: 1. the system handles the exceptional case in a meaningful way 2. the client and document states/statistics have not been changed 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.29 304 Les tests en orienté objet III. Etude de cas – Préparation Tests d’intégration Emprunter Integration Test 3: Emprunt is authorised • Construct a document, which is empruntable and not emprunté • Construct a client • Construct a FicheEmprunt for the client and document • • Check that the system handles the exceptional case in a meaningful way Check that: 1. the tarif and duree des emprunts are as required 2. the client and document states/statistics have been updated as required 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.30 305 Les tests en orienté objet III. Etude de cas Comment Tester la Médiathèque ? A) Préparation 1. 2. 3. Tests de validation, e.g.: Emprunter Tests d’intégration, e.g.: Emprunter Tests unitaires, e.g.: Document B) Codage et Exécution 2014/2015 4. Tests unitaires avec Junit 5. Tests d’intégration 6. Tests de validation Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.31 306 Les tests en orienté objet III. Etude de cas –Tests d’Integration - Codage et Execution Emprunter Integration Test1 Code: Verify correct co-ordination by FicheEmprunt • Construct a document, and make it Empruntable • Construct a client • • • Construct a FicheEmprunt for the client and document using a dummy mediatheque Check that the tarif and “duree des emprunts” values for the FicheEmprunt are as required Check that the client and document states have been updated correctly We should do the same for integration tests 2 and 3 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.32 307 Les tests en orienté objet III. Etude de cas –Tests d’Integration - Codage et Execution Emprunter Integration Tests: Typical/Example Development Status For example: Completed Partial Not yet implemented This requires further analysis 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.33 308 Les tests en orienté objet III. Etude de cas –Tests d’Integration - Codage et Execution Emprunter Integration Test 1 Analysis: it is too soon, in this example, to code the integration tests 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.34 309 Les tests en orienté objet III. Etude de cas Comment Tester la Médiathèque ? A) Préparation 1. 2. 3. Tests de validation, e.g.: Emprunter Tests d’intégration, e.g.: Emprunter Tests unitaires, e.g.: Document B) Codage et Exécution 4. Tests unitaires avec JUnit 5. Tests d’intégration 6. Tests de validation 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.35 310 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires The Document class We will use the following UML diagrams to « derive » our unit tests for the Document class: • • Class Diagrams State machine diagrams We may also need to use the original natural language text. We should not have to examine the Java code Document.java, but can just call the code using the Document.class file – this is blackbox testing. We may need access to the documentation for the code in order to understand code properties that are not specified in the UML models. NOTE: If documentation is poor then we will have to examine the code in order to be able to guarantee that our tests compile and execute correctly. 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.36 311 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires The Document class The high-level class diagram can be partitioned so that we abstract away from the classes that are not directly « connected » to the Document 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.37 312 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires The Document class We test only the public attributes and operations/methods – following the blackbox approach We should first examine the safety invariant … if it is not in the UML model then we need to add it. 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.38 313 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires The Document class The invariant property is defined on the attributes of the class in order to say when a Document instance/object is in a SAFE state, i.e. a state which is meaningful/allowable. Here, the invariant should « include »: Emprunté => (empruntable AND nbEmprunts >=0) We should link this (invariant) requirement to the original text, where possible: « La médiathèque contient un certain nombre de documents disponibles à la consultation ou à l’emprunt » 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 A formal interpretation that needs validation with the client CSC4002-Tests.39 314 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires The Document class BUT, these are not public So we have a test design choice – 1) extend the Document class by adding a public invariant method: • (a) creating a new subclass (and make attributes protected), or • (b) editing/updating the Document class OR 2) use public methods – directly in the testing code - that are equivalent to testing the invariant and are guaranteed not to change the state of the object (Document) being tested (e.g. estEmpruntable and estEmprunte.) 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.40 315 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires The Document class All design decisions involve compromise. QUESTION: Can you see the advantages/disadvantages of each option for specifying the invariant property? In this example, we choose to pursue option 1 (b) - Edit the Document class, because • • 2014/2015 It is good practice in OO development to have invariants specified for all classes, and It is the « simplest » coding option for « Java beginners » Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.41 316 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires Document Now, let’s consider the dynamic behaviour specified by the state machine. The first thing is that the initial state must be SAFE. Then we check that all subsequent states are SAFE. 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.42 317 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires Document Test1: check that the construction of a Document respects the invariant 1. 2. 3. Create a DocumentTest class with a single main method for testing a concrete instance of a Document subclass – • Video, or • Audio, or • Livre Create a test method that gets called in the main method. Ensure that the test can be checked – • output results to screen, or • print results to file, or • include test oracle code that knows what the results should be and asserts these when the test executes, automating the test process 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.43 318 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires Document Test 2: Check all reachable states to be SAFE, i.e. respect the invariant Code Design: Complete state coverage can be achieved by a single execution trace after creation – metEmpruntable() emprunter() NOTE: Testing all states respect the invariant does not check the correct temporal behaviour of the Document class …We will see this problem later with Test4 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.44 319 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires Document We need to write at least one test for each public operation/method of the Document class. For conciseness, we illustrate this by looking at the single Emprunter operation « emprunter : … Pour tous les documents, les statistiques sont mises à jour à savoir : le nombre d’emprunts de ce document, le nombre d’emprunts de ce type de document et le nombre d’emprunts total » Test3 - check statistics are updated correctly Code design steps: « emprunt » a document 5 times and, each time, check that the individual document « statistiques » are incremented. At the end of the loop, check that the total « statistiques » have increased by 5. 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.45 320 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires Document Test4: correct temporal sequencing 1. 2. Check that we can only « restituer » a document after it has been « emprunté » Check that we can only « mettre en consultation » if the document is « empruntable » Code Design: such sequences of events should produce exceptions 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.46 321 Les tests en orienté objet III. Etude de cas – Préparation Tests Unitaires Document Final Test After testing all other important temporal properties of the Document class, we should conclude the Document unit tests by testing how the constructor method(s) behaves when one tries to construct a Document using « invalid » component parameters. For example: • • Null Genre or Localisation or … UNSAFE Genre or Localisation or … Final Test Java (code) design steps: 1. 2. Attempt to construct a Document with a null Genre Check that the exception is generated and handled as required Note: some testers chose to do this test first 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.47 322 Les tests en orienté objet III. Etude de cas Comment Tester la Médiathèque ? A) Préparation 1. Tests de validation, e.g.: Emprunter 2. Tests d’intégration, e.g.: Emprunter 3. Tests unitaires, e.g.: Document B) Codage et Exécution 4. 5. 6. 2014/2015 Tests unitaires avec Junit Tests d’intégration Tests de validation Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.48 323 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Document Coding step - Write code for invariant in Document public boolean invariant (){ return !(emprunte && !empruntable) 2014/2015 && nbEmprunts >=0; Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.49 324 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Document Coding step : Update all Document operations/methods that may change state of a Document to check invariant and throw exception when it is broken. Mediatheque – metEmpruntable, metConsultable Audio – emprunter Livre – emprunter Video - emprunter For example, metEmpruntable: public void metEmpruntable() throws InvariantBroken{ empruntable = true; if (!invariant()) throw new InvariantBroken("Document -"+this); } 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.50 325 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Document Coding step - Update toString method to display if Document is SAFE or UNSAFE (depending on whether invariant is respected) public String toString() { String s = "\"" + code + "\" " + titre + " " + auteur + " " + annee + " " + genre + " " + localisation + " " + nbEmprunts; if (empruntable) { s += " (emp "; if (emprunte) s += "O"; else s += "N"; s += ")"; } if (invariant()) s += " SAFE "; else s +=" UNSAFE "; return s; } 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.51 326 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Using JUnit tool – assertions and failures (see http://junit.org/javadoc/4.10/) assertTrue(boolean) assertFalse(boolean) assertArrayEquals( _ , _ ) assertEquals( _ , _ ) assertNull(_) assertSame( _ , _ ) fail() fail(java.lang.String ) ... 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.52 327 Les tests en orienté objet III. Etude de cas –Tests Unitaires- Codage et Execution Avec JUnit Document package mediatheque.document; import import import import static org.junit.Assert.*; org.junit.After; org.junit.Before; org.junit.Test; import import import import mediatheque.Genre; mediatheque.Localisation; mediatheque.OperationImpossible; util.InvariantBroken; public class JUnit_Document { protected Localisation l; protected Genre g; protected Document d1; // setUP method // tearDown method // test methods Annotation @Before Annotation @After Annotation @Test } 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.53 328 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Call Sequences : Simplest Case The call sequence for a class with two test methods – test1 and test2 is: Call @Before setUp Call @Test method test1 Call @After tearDown Call @Before setUp Call @Test method test2 Call @After tearDown 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.54 329 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Call Sequences : More Complex Case When setting up and tearing down is “expensive” then we can use @BeforeClass and @AfterClass annotations/methods to ensure that these are executed only once for each class. For example, the call sequence for a class with two test methods – test1 and test2 is: Call @BeforeClass setUpClass Call @Test method test1 Call @Test method test2 Call @AfterClass tearDownClass (See the JUnit documentation for more details on call sequences when we mix simple and complex cases) Note: we use the simplest case in the following examples 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.55 330 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Document @Before public void setUp() throws Exception{ g = new Genre("Test_nom1"); l = new Localisation("Test_salle1","Test_rayon1"); d1 = new Video ("Test_code1", l, "Test_titre1", "Test-auteur1", "Test-annee1", g, "Test_duree1", "Test-mentionLegale1"); } @After public void tearDown() throws Exception { l=null; g=null; d1=null; } 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.56 331 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Document Test1: check the construction of a Document respects the invariant @Test public void constructorInvariant( ) throws OperationImpossible, InvariantBroken{ Assert.assertTrue(d1.invariant()); } Test2: Check all reachable states to be SAFE, i.e. respect the invariant @Test public void reachableStates () throws OperationImpossible, InvariantBroken { Assert.assertTrue(d1.invariant()); d1.metEmpruntable();assertTrue(d1.invariant()); d1.emprunter();assertTrue(d1.invariant()); } 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.57 332 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Document Test4.1 : Check that we can only « restituer » a document after it has been « emprunté » @Test(expected=OperationImpossible.class) public void restituerBeforeEmprunter () throws OperationImpossible, InvariantBroken { Assert.assertTrue(d1.invariant()); Assert.assertTrue(!d1.estEmprunte()); d1.restituer(); } 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.58 333 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Document Test4.1 : Check that we can only « restituer » a document after it has been « emprunté » JUnit shows us if an expected exception was not thrown 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.59 334 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Document Test4.1 : Check that we can only « restituer » a document after it has been « emprunté » Q: restituer in states consultable and empruntable? Q: How to Fix This OPTION 1: Update UML diagram with new transition(s) OPTION 2: Update Document code OPTION 3 … : Can You Think Of Any Other Options? 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.60 335 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Document Test4.1 : Check that we can only « restituer » a document after it has been « emprunté » restituer restituer OPTION 1: Update UML diagram with new transition(s) No longer require an exception to be thrown in consultable and empruntable states when restituer is called 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.61 336 Les tests en orienté objet III. Etude de cas –Tests Unitaires - Codage et Execution Avec JUnit Document Test4.1 : Check that we can only « restituer » a document after it has been « emprunté » OPTION 2: Update Document code public void restituer() throws InvariantBroken, OperationImpossible{ if (!emprunte) throw new OperationImpossible("Document -"+this); emprunte = false; System.out.println("Document: ranger \"" + titre + "\" en " + localisation); if (!invariant()) throw new InvariantBroken("Document -"+this); } 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.62 337 Les tests en orienté objet III. Etude de cas Le cycle en V (terminé) préparation Spécification Validation Codage et exécution préparation Conception préliminaire Tests d’intégration Codage et exécution préparation Conception détaillée Tests unitaires Codage et exécution Codage (système et tests) 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.63 338 Les tests en orienté objet SOME MORE ADVANCED ISSUES INHERITANCE Inheritance complicates the testing process: • Should we also have a test inheritance hierarchy? • How do we test the subclassing relationship? EXCEPTIONS Exceptions complicate the testing process: • Exception handling testing requires generating the exceptions and where/how this should be done is not always obvious GUIs are difficult to test as you often need to simulate user actions 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.64 339 Les tests en orienté objet To Come (In the TP) Unit Tests – Document Integration Tests – FicheEmprunt Complete the validation tests : use case emprunter document Unit tests on Document subclasses (using inheritance) QUESTIONS????? 2014/2015 Dr J Paul Gibson, TSP Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 CSC4002-Tests.65 340 Les tests en orienté objet Télécom SudParis — J.-Paul Gibson — Octobre 2015 — CSC 4002 341 Gestion de la persistance des objets Claire Lecocq Revision : 1527 CSC 4002 Octobre 2015 342 Gestion de la persistance des objets Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 343 Gestion de la persistance des objets Gestion de la persistance des objets CSC4002 Claire Lecocq Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 344 Gestion de la persistance des objets Plan du document 1. Motivations 1. Application exemple : la médiathèque 2. Problématique en image 2. Quel schéma de Base de Données Relationnelle ? 3. Gérer la persistance dans Java : JDBC 4. Conclusion 2 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 345 Gestion de la persistance des objets Application exemple : la médiathèque ■ Développement orienté objet : standard de fait ■ Où sont stockées les données ? ● Durée de vie ? ● Partage ? ● Volume de données ? ■ Une idée ? 3 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 346 Gestion de la persistance des objets Problématique en image Application UML Développement Objet Mapping chargement Stockage des données déchargement Modèle E/A Relationnel SGBD 4 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 347 Gestion de la persistance des objets Plan du document 1. Motivations 2. Quel schéma de Base de Données Relationnelle ? ● Processus de conception d’une BD (rappel) ● Existe t-il un modèle relationnel pour un diagramme de classes ? ● Diagramme de classes de la médiathèque ● Traduction du diagramme en dehors de l’arbre d’héritage ● Héritage − Revenons sur la sémantique de l’héritage1 − Traduction de l’héritage en modèle relationnel 3. Gérer la persistance dans Java : JDBC 4. Conclusion 1 5 la généralisation/spécialisation est appelée dans ce cours héritage Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 348 Gestion de la persistance des objets Processus de conception d’une BD (rappel) Besoin de la BD Prise en compte des particularités du SGBD Contrat Conception logique Schéma conceptuel (haut niveau) E/A UML Indépendant du SGBD Monde réel Recueil des besoins et analyse Transformation du modèle Relationnel Réseau Hiérarchique Conception physique Schéma physique (spécifique SGBD) 6 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Placement Disque Optimisation Spécifique à un SGBD Schéma conceptuel (spécifique SGBD) Janvier 2014 349 Gestion de la persistance des objets Existe t-il un modèle relationnel pour un diagramme de classes ? ■ Si ● ● Hypothèse 1 : existe correspondance E/A diagramme de classes Hypothèse 2 : existe traduction E/A relationnel − − Voir cours CSC4001 : Introduction aux BD relationnelles Diapositives 13 et 14 pour la médiathèque ■ Alors ● 7 Transformer un diagramme de classes UML (partie statique) en un schéma relationnel « équivalent » peut se ramener à la transformation d’un schéma E/A vers un schéma relationnel Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 350 Gestion de la persistance des objets Hypothèse 1 : Correspondance E/A diagramme de classes SI-BD Entité/Association Génie logiciel - langages Diagramme de classes Entité Classe Entité faible Composition Association sans attribut Association Association avec attribut(s) Classe d’association Pas de correspondance Héritage – Généralisation, spécialisation Clé Identité d’objet Attribut calculé 8 Attribut dérivé Opération Cardinalités Multiplicités Attribut d’une entité de paramètres Attributs de classe Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 351 Gestion de la persistance des objets Hypothèse 1 : Correspondance E/A diagramme de classes SI-BD Entité/Association Génie logiciel - langages Diagramme de classes Entité Classe Entité faible Composition Association sans attribut Association Association avec attribut(s) Classe d’association Pas de correspondance Héritage – Généralisation, spécialisation Clé Identité d’objet Attribut calculé Problème héritage Attribut dérivé Opération Cardinalités Multiplicités Attribut d’une entité de paramètres Attributs de classe 9 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 352 Gestion de la persistance des objets Diagramme de classes de la médiathèque 10 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 353 Gestion de la persistance des objets Traduction du diagramme en dehors de l’arbre d’héritage ■ Classe façade 11 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 354 Gestion de la persistance des objets Traduction du diagramme en dehors de l’arbre d’héritage ■ Classes persistantes 12 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 355 Gestion de la persistance des objets Règles de traduction ■ Classe entité ● Attribut d’instance attribut d’entité ● Adapter au mieux les correspondances de types ● Définir la clé de l’entité ■ Association, agrégation association ■ Composition entité faible ■ Multiplicités cardinalités 13 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 356 Gestion de la persistance des objets Traduction du diagramme en dehors de l’arbre d’héritage ■ Modèle entité/association Localisation salle : varchar(20) rayon : varchar(5) Genre nom : varchar(20) nbEmprunts : integer FicheEmprunt dateEmprunt : date dateLimite : date depasse : integer 1,1 correspondre 0,n Client nom : varchar(20) prenom : varchar(20) adresse : varchar(20) nbEmpruntsEffectues : integer nbEmpruntsDepasses : integer 1,1 nbEmpruntsEnCours : integer dateInscription : date codeReduction : integer dateRenouvellement : date 14 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Categorie nom : varchar(20) nbEmpruntsMax : integer tarifInscription : float coefDuree : float coefTarif : float codeReducUsed : integer 0,n appartenir Janvier 2014 357 Gestion de la persistance des objets Hypothèse 2 : Traduction du diagramme en dehors de l’arbre d’héritage ■ Modèle relationnel Localisation salle : varchar(20) rayon : varchar(5) Genre nom : varchar(20) nbEmprunts : integer FicheEmprunt dateEmprunt dateLimite depasse nom prenom Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours dateInscription codeReduction dateRenouvellement catclient 15 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Janvier 2014 358 Gestion de la persistance des objets Il reste la partie la plus intéressante : l’arbre d’héritage ! Localisation salle : varchar(20) rayon : varchar(5) Genre nom : varchar(20) nbEmprunts : integer FicheEmprunt dateEmprunt dateLimite depasse nom prenom Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours dateInscription codeReduction dateRenouvellement catclient 16 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Janvier 2014 359 Gestion de la persistance des objets Revenons sur la sémantique de l’héritage (1) ■ Spécialisation peut être : Personne nom prénom adresse ● Partielle* : une instance peut ne pas être spécialisée Personne Etudiant Salarie Partielle X ● Totale** : toute instance est spécialisée dans au moins une classe enfant Etudiant noEtud cycle Salarie salaire Totale Prive prime Public indice Salarie = Prive Public Dans les cours UML et Java, les termes utilisés sont classes concrètes* et classes abstraites* 17 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 360 Gestion de la persistance des objets Revenons sur la sémantique de l’héritage (2) ■ Spécialisation peut être : Personne nom prénom adresse ● Recouvrement : une instance peut être spécialisée dans plusieurs classes enfants* ● Partition : une instance est spécialisée dans au plus une classe enfant Etudiant Salarié Recouvrement Etudiant noEtud cycle Salarie salaire Partition Doctorant vacataire Prive prime Public indice Prive Public = •Dans les cours UML et Java, l’héritage multiple a été ignoré pour raison de simplicité et aussi parce que Java ne l’autorise pas (contrairement à C++) 18 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 361 Gestion de la persistance des objets Traduction de l’héritage en modèle relationnel ■ 3 correspondances possibles : 1. Correspondance directe 2. Correspondance ascendante 3. Correspondance par aplatissement 3.1. Pour partition 3.2. Pour recouvrement 19 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 362 Gestion de la persistance des objets Correspondance directe (n° 1) ■ Une classe une relation BD ■ Liaison entre les relations se fait via la clé ■ Correspondance de l’arbre de Document Document code titre auteur annee empruntable emprunte nbEmprunts Création d’une clé Relation clé Audio code classification Clé + clé étrangère 20 Video code dureeFilm mentionLegale Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Contrainte d’intégrité référentielle Livre code nbPages Janvier 2014 363 Gestion de la persistance des objets Correspondance directe (n° 1) - suite VueDocument code titre auteur annee empruntable emprunte nbEmprunts Typedoc Classification nombrePages Durrefilm Mentionlegale Audio code classification 21 create view vueDocument(code, titre, auteur, annee, empruntable, emprunte, salle,rayon,nomGenre,nbEmprunts, typedoc, classification, nombrePages, dureeFilm, mentionLegale) as select document.code, titre, auteur, annee, empruntable, emprunte, salle,rayon,nomGenre,nbEmprunts,'Audio', classification, null, null, null from audio, document where audio.code = document.code union select document.code, titre, auteur, annee, empruntable, emprunte, salle,rayon,nomGenre,nbEmprunts,'Video', null, null, dureeFilm, mentionLegale from video, document where video.code = document.code union select document.code, titre, auteur, annee, empruntable, emprunte, salle,rayon,nomGenre,nbEmprunts,'Livre', null, nombrePages, null, null from livre, document where livre.code = document.code ; Document code titre auteur annee empruntable emprunte nbEmprunts Video code dureeFilm mentionLegale Livre code nbPages Relation clé Contrainte d’intégrité référentielle Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Vue Construction de la vue par requête Janvier 2014 364 Gestion de la persistance des objets Correspondance directe pour la médiathèque VueDocument code titre … Audio code classification Video code dureeFilm mentionLegale Livre code nbPages Genre nom nbEmprunts 22 Document code titre auteur annee empruntable emprunte nbEmprunts nomGenre salle rayon Localisation salle rayon FicheEmprunt nom prenom code dateEmprunt dateLimite depasse Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours catclient dateInscription codeReduction dateRenouvellement Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Solution retenue pour le TP Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 365 Gestion de la persistance des objets Correspondance directe et typologie des arbres d’héritage Spécialisation 23 Spécialisation Totale Partielle Partition Recouvrement OK Vérification : 1 tuple de la « relation parent » est toujours référencé par 1 tuple de la « relation enfant » OK OK Vérification : nonduplication de clé entre « relations enfants » OK Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Remarques Reconstitution de l'objet par jointure Sémantique très proche du modèle objet Fonctionne pour tout arbre d’héritage Janvier 2014 366 Gestion de la persistance des objets Correspondance ascendante (n° 2) ■ Chaque classe spécialisée une relation BD ■ Classe parent une vue ■ Correspondance de l’arbre de Document Document code titre auteur annee empruntable emprunte nbEmprunts Audio code titre auteur annee empruntable emprunte nbEmprunts classification 24 Video code titre auteur annee empruntable emprunte nbEmprunts dureeFilm mentionLegale Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 CREATE VIEW Document AS SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts FROM Audio UNION SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts FROM Video UNION SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts FROM Livre Livre code titre auteur annee empruntable emprunte nbEmprunts nbPages Vue Construction de la vue par requête Janvier 2014 367 Gestion de la persistance des objets Correspondance ascendante pour la médiathèque ■ Une vue n’est pas une relation BD ! ● Pas de clé non référençable par une clé étrangère Document code 25 Audio code FicheEmpruntAudio code nom prenom Video code FicheEmpruntVideo code nom prenom Livre code FicheEmpruntLivre code nom prenom Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Client nom prenom FicheEmprunt Janvier 2014 368 Gestion de la persistance des objets Correspondance ascendante et typologie des arbres d’héritage Spécialisation Spécialisation Totale Partielle Partition Recouvrement OK KO OK KO Redondance de données Remarques Multiplie les relations Évite les jointures pour reconstruire les objets Spécialisation totale. Classe abstraite = vue (relation virtuelle) Difficile d’assurer l’unicité des identificateurs 26 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 369 Gestion de la persistance des objets Correspondance par aplatissement (n° 3.1) ■ Ensemble des classes de la hiérarchie une seule ■ ■ relation BD Éventuellement chaque classe « enfant » une vue Correspondance de l’arbre de Document Document code titre auteur annee empruntable emprunte nbEmprunts typeDocument classification dureeFilm mentionLegale nbPages Audio code … classification 27 Video code … dureeFilm mentionLegale Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 CREATE VIEW Audio AS SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts, classification FROM Document WHERE typeDocument=‘Audio’ Livre code … nbPages Janvier 2014 370 Gestion de la persistance des objets Correspondance par aplatissement 3.1 pour la médiathèque Genre nom nbEmprunts Localisation salle rayon Document code titre auteur annee empruntable emprunte nbEmprunts nomGenre salle rayon typeDocument classification dureeFilm mentionLegale nbPages Client nom prenom adresse nbEmpruntsEffectues nbEmpruntsDepasses nbEmpruntsEnCours typeClient dateInscription dateRenouvellement codeReduction FicheEmprunt nom prenom code dateEmprunt dateLimite depasse dateCotisation Categorie nom nbEmpruntsMax tarifInscription coefDuree coefTarif codeReducUsed Solution retenue pour le TP 28 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 371 Gestion de la persistance des objets Correspondance par aplatissement 3.1 et typologie des arbres d’héritage Spécialisation Spécialisation Totale Partielle Partition Recouvrement OK OK Si attribut donnant le nom de la classe autorisé à null OK KO Remarques Évite les jointures pour reconstruire les objets Du vide dans la relation (valeurs nulles) Spécialisation totale : classes abstraites relations (concrètes), classes concrètes vues (virtuelles) Souvent la solution la plus simple à mettre en place; la plus choisie 29 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 372 Gestion de la persistance des objets Correspondance par aplatissement 3.2 pour la médiathèque ■ Variante de la correspondance 3.1 avec utilisation ■ d’un attribut booléen supplémentaire par classe enfant Si un document pouvait être à la fois un Audio et une Vidéo Document code titre auteur annee empruntable emprunte nbEmprunts AudioB VideoB LivreB Classification dureeFilm mentionLegale nbPages 30 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 CREATE VIEW Audio AS SELECT code, titre, auteur, annee, empruntable, emprunte, nbEmprunts, classification FROM Document WHERE AudioB = 1 Janvier 2014 373 Gestion de la persistance des objets Correspondance par aplatissement 3.2 et typologie des arbres d’héritage Spécialisation 31 Spécialisation Remarques Totale Partielle Partition Recouvrement OK OK Si tous les attributs booléens correspondant aux classes enfants sont autorisés à FAUX/NULL Non pertinent 3.1 OK Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 idem 3.1 Janvier 2014 374 Gestion de la persistance des objets QCM – Vrai ou faux ■ Y a t-il toujours un modèle relationnel ■ ■ ■ 32 « correspondant » à un diagramme de classes ? Le nombre de relations dans le modèle relationnel est-il égal au nombre de classes dans le diagramme de classes ? Une classe abstraite est-elle toujours traduite par une vue ? S’il existe plusieurs modèles relationnels « correspondant » à un diagramme de classes, je choisis au hasard : il n’y a pas de critère de choix ? Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 375 Gestion de la persistance des objets Plan du document 1. Motivations 2. Quel schéma de Base de Données Relationnelle ? 3. Gérer la persistance dans Java : JDBC 1. Qu’est ce que JDBC ? 2. Que faire pour pouvoir utiliser JDBC ? 3. Principaux objets mis en œuvre 1. Tuyaux de communication : Connection et Statement 2. Exécution d’une requête : ResultSet 3. Correspondance de type 1. 2. Exemple sur les chaînes de caractères Correspondance de type SQL/Java 4. Étapes d’interaction avec le SGBD 5. Politique de gestion de la persistance 4. Conclusion 33 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 376 Gestion de la persistance des objets Qu’est ce que JDBC ? ■ ■ ■ ■ Java DataBase Connectivity API Java pour accéder à des SGBDR via SQL Indépendance / SGBD cible (via des pilotes) Fourni par le paquetage java.sql ● Interfaces ● Implémentées dans les pilotes (en anglais, driver) Application java Pilote − Dépendants des SGBDs cibles − « Tout » SGBD a un pilote JDBC Protocole du SGBD SGBD 34 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 377 Gestion de la persistance des objets Que faire pour pouvoir utiliser JDBC ? ■ Avoir un pilote ■ Le référencer dans le CLASSPATH ■ Dans chaque classe qui utilise des ordres JDBC ● Importer le paquetage java.sql import java.sql.*; ● Charger en mémoire la classe du (des) pilote(s) avant d’utiliser JDBC : Class.forName("oracle.jdbc.OracleDriver"); Class.forName("com.mysql.jdbc.Driver" ); Class.forName("org.postgresql.Driver" ); 35 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 378 Gestion de la persistance des objets Tuyaux de communication : Classe Connection et Statement Media : Mediatheque Nom : string …. Connection : @Connection Constructeur() rechercheBD() miseAJourBD() Destructeur() 36 Pilote PostgreSQL Application java Statement statement1 « SELECT * FROM Document » Statement statement2 SGBD PostgresSQL Statement statement3 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 379 Gestion de la persistance des objets Exécution d’une requête : Classe ResultSet Application java Nom : string …. lesLocalisations: collection de @Localisation 37 Pilote MySQL media : Mediatheque Statement stmt1 ResultSet rset = stmt1.executeQuery ("select * from localisation"); Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 SGBD PostgresSQL Localisation Janvier 2014 380 Gestion de la persistance des objets Correspondance de types : Exemple sur les chaînes de caractères Application java Statement stmt1 rset contient "select * from localisation"; while (rset.next()) { … String salle = rset.getString("salle"); … } String salle 38 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 SGBD PostgresSQL Localisation salle : varchar(20) Janvier 2014 381 Gestion de la persistance des objets Correspondance de type SQL/Java (1) Type SQL numeric integer float char, varchar date 39 Méthode recommandée Java.Math.BigDecimal getBigDecimal() int getInt() double getDouble() String getString() java.sql.Date getDate() java.util.Date Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 382 Gestion de la persistance des objets Correspondance de type SQL/Java (2) ■ Pas de booléen en bases de données ! ■ Document : ■ empruntable et emprunte : boolean dans le ■ diagramme de classe empruntable et emprunte : integer dans la base de données ResultSet rset = stmt.executeQuery("select * from document"); while (rset.next()) { … boolean empruntable = rset.getInt("empruntable") > 0; boolean emprunte = rset.getInt("emprunte") > 0; … } 40 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 383 Gestion de la persistance des objets Étapes d’interaction avec le SGBD 1. Ouvrir une connexion ● Instance de Connection 2. Créer des « fils » pour supporter l’envoi d’instructions SQL au sein de la connexion ● Requête non paramétrée dans une instance de Statement ● Requête paramétrée dans une instance de PreparedStatement INSERT INTO localisation (salle, rayon) values (?, ?) 3. Demander l’exécution de ces instructions par le SGBD : ● Requête d’interrogation (SELECT) : méthode executeQuery() sur le *Statement ● Requête de mise à jour (INSERT, UPDATE, DELETE) : méthode executeUpdate() sur le *Statement 4. Fermer la connexion : méthode close() sur la connexion 41 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 384 Gestion de la persistance des objets 1. Établir une connexion String driver = "org.postgresql.Driver"; String urlBd = "jdbc:postgresql://mysql-inf/TPCONCEPTION"; try { Class.forName(driver).newInstance(); }catch(Exception cnfe) { throw new OperationImpossible("Echec acces Pilote BD- " + driver + " " + cnfe); } Statement stmt = null; try { laConnexion = DriverManager.getConnection(urlBd,compte,passe); } catch(SQLException qe) { throw new OperationImpossible("Echec connexion BD- " + qe + " " + urlBD); } Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 2012 385 Gestion de la persistance des objets 2 et 3. Exécuter une requête de mise à jour (1) private void insererBD(Document doc) throws OperationImpossible { try { PreparedStatement stmt; if (doc instanceof Audio ){ Audio au = (Audio) doc; stmt = laConnexion.prepareStatement("INSERT INTO document (code, titre, auteur, annee, empruntable, emprunte, salle, rayon, nomgenre, nbemprunts, typedoc, classification) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'Audio', ?)"); stmt.setString(11, au.getClassification()); } else { // Video puis Livre } 43 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 386 Gestion de la persistance des objets 2 et 3. Exécuter une requête de mise à jour (2) stmt.setString(1, doc.getCode()); stmt.setString(2, doc.getTitre()); stmt.setString(3, doc.getAuteur()); stmt.setString(4, doc.getAnnee()); stmt.setInt(5,doc.estEmpruntable()?1:0); stmt.setInt(6, doc.estEmprunte()?1:0); stmt.setString(7, doc.getLocalisation().getSalle()); stmt.setString(8, doc.getLocalisation().getRayon()); stmt.setString(9, doc.getGenre().getNom()); stmt.setInt(10, doc.getNbEmprunts()) } catch (SQLException e) { throw new OperationImpossible("Echec insertion " + e); } } 44 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 BD- Janvier 2014 387 Gestion de la persistance des objets QCM - Vrai/faux ■ Puis-je me passer de « driver » pour interagir avec le ■ ■ ■ ■ ■ 45 SGBD ? Dois-je créer une connexion (objet Connection) à chaque fois que je dois interagir avec le SGBD et la refermer après chaque interaction ? Faut –il, en fonction du type de requête SQL à exécuter, choisir judicieusement la méthode execute* à utiliser Un ResultSet peut-il contenir de nombreux « tuples » ? Les types Java et les types de bases de données correspondent-ils parfaitement ? La méthode prepareStatement est-elle utilisée pour les requêtes paramétrées ? Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 388 Gestion de la persistance des objets Politique de gestion de la persistance ■ Comment intégrer le code JDBC qui assure le chargement et le déchargement des objets Java depuis la BD ? ● En structurant au mieux le code (limiter le nombre d’opérations à modifier) ● Quel(s) objet(s) charger et quand ? ● Quel(s) objet(s) décharger et quand ? 46 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 389 Gestion de la persistance des objets Chargement / déchargement (1) ■ Chargement ● Constructeur d’objet intégrant tous les attributs ● Statique : constructeur de « collections » − Similaire au TP médiathèque sérialisée − Volume de données contrôlé ● Dynamique : constructeur d’objet (nécessité d’une clé pour sélectionner l’objet) − Charger les objets connexes ■ Déchargement ● Statique : à la fin du programme (attention aux pertes d’information) ● Dynamique : dans les opérations de mise à jour 47 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 390 Gestion de la persistance des objets Chargement / déchargement (2) ■ Statique ● Adapté aux petits volumes de données ● Faible taux de mises à jour ● Simple à mettre en œuvre ■ Dynamique ● ● ● ● 48 Adapté aux volumes de données importants Fort taux de mises à jour Meilleure résistance aux fautes Plus compliqué à programmer Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 391 Gestion de la persistance des objets Plan du document 1. Motivations 2. 3. 4. 49 1. Application exemple : la médiathèque 2. Problématique en image Quel schéma de Base de Données Relationnelle ? Gérer la persistance dans Java : JDBC Conclusion Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 392 Gestion de la persistance des objets Conclusion ■ Pour un diagramme de classes ● Plusieurs modèles relationnels pour la persistance ● Savoir choisir ■ Schéma relationnel ● Relation + attributs avec des domaines + clé + contraintes d’intégrité ■ JDBC : une solution technique ● « bas » niveau ■ Canevas logiciels industriels ● Hibernate, TopLink ● Proposition de modèles de persistance ● Méthodes « haut » niveau pour interagir avec le SGBD 50 Institut Mines-Télécom Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 Janvier 2014 393 Gestion de la persistance des objets Télécom SudParis — Claire Lecocq — Octobre 2015 — CSC 4002 394 TP13-14 : TP de synthèse Tableaux de service des navigants Air France Enseignants CSC4002 Revision : 1567 CSC 4002 Octobre 2015 395 TP13-14 : TP de synthèse 1 Tableaux de service des navigants Air France Questions de cours En partant de la classe CNAMERecord dont le code source est donné ci-après, répondez aux questions suivantes. Les questions 1 à 6 doivent être répondues au plus en trois lignes. 1 2 3 4 // C o p y r i g h t ( c ) 1999 Brian W e l l i n g t o n ( b w e l l i n g @ x b i l l . o r g ) package o r g . x b i l l . DNS ; import j a v a . i o . ∗ ; import o r g . x b i l l . DNS . u t i l s . ∗ ; 5 6 public c l a s s CNAMERecord extends NS_CNAME_PTRRecord { 7 8 9 10 private CNAMERecord(Name name , i n t d c l a s s , i n t super ( name , Type .CNAME, d c l a s s , t t l ) ; } ttl ) { 11 12 13 14 15 16 17 18 /∗∗ ∗ C r e a t e s a new CNAMERecord w i t h t h e g i v e n d a t a ∗ @param t a r g e t The name t o which t h e CNAME a l i a s p o i n t s ∗/ public CNAMERecord(Name name , i n t d c l a s s , i n t t t l , Name t a r g e t ) { super ( name , Type .CNAME, d c l a s s , t t l , t a r g e t ) ; } 19 20 21 22 23 protected Record rrFromWire (Name name , i n t type , i n t d c l a s s , i n t t t l , i n t l e n g t h , DataByteInputStream i n ) throws I O E x c e p t i o n { return rrFromWire (new CNAMERecord( name , d c l a s s , t t l ) , i n ) ; } 24 25 26 27 28 protected Record r d a t a F r o m S t r i n g (Name name , i n t d c l a s s , i n t t t l , T o k e n i z e r s t , Name o r i g i n ) throws I O E x c e p t i o n { return r d a t a F r o m S t r i n g (new CNAMERecord( name , d c l a s s , t t l ) , s t , o r i g i n ) ; } 29 30 } Question 1 (1pt) : Quel doit être le nom du fichier source qui contient cette classe ? Question 2 (1pt) : Sachant que la variable d’environnement CLASSPATH contient la chaîne de caractères suivante : « /usr/local/java:. » dans quel(s) répertoire(s) peut se trouver ce fichier ? Question 3 (1pt) : À quelle classe fait référence le mot réservé super de la ligne 9 ou 17 ? Question 4 (1pt) : Combien doit-on passer de paramètres pour créer un objet de la classe CNAMERecord lorsque l’on est hors de la classe ? Question 5 (1pt) : Quelles classes peuvent utiliser la méthode rrFromWire ? Question 6 (1pt) : On désire ajouter une méthode public String toString() à la classe CNAMERecord. Cette méthode doit décrire l’objet par une chaîne de caractères, et en particulier le nom de sa classe. Écrire le corps de la méthode toString(). 2 Rappel du sujet du BE Nous avons réalisé l’analyse d’un cas d’étude lors du bureau d’étude de synthèse dont nous rappelons ci-après le sujet ainsi que la correction que nous en avons faite. L’équipage d’un avion est toujours constitué d’un pilote, d’un copilote et de plusieurs personnels naviguants et commerciaux (PNC). Chacune de ces personnes est identifiée par son nom et sa fonction. L’équipage d’un avion est reconstitué pour chacun de ses vols. Chaque membre d’équipage doit être opérationnel sur deux catégories d’avions (par exemple, le PNC Richard est opérationnel sur Airbus A320 et Boeing 747). Chaque catégorie d’avions requiert un nombre de PNC dans son équipage oscillant entre un minimum et un maximum (par exemple, les PNC des Airbus A320 doivent être entre six et huit, et ceux d’un B747 entre 12 et 16)1 . Voici ci-dessous un extrait du tableau de service de quelques employés de la compagnie AIR FRANCE. 1. Pour simplifier, le tableau ci-dessous n’en représente que quelques-uns. TELECOM SudParis — Enseignants CSC4002 — Octobre 2015 — CSC 4002 396 TP13-14 : TP de synthèse Avion 13562 13562 13562 13562 13562 32156 32156 32156 32156 32156 Vol AF347 AF347 AF347 AF347 AF347 AF545 AF545 AF545 AF545 AF545 Tableaux de service des navigants Air France Dest Londres Londres Londres Londres Londres New-York New-York New-York New-York New-York Date 11/10/06 11/10/06 11/10/06 11/10/06 11/10/06 12/10/06 12/10/06 12/10/06 12/10/06 12/10/06 Catégorie A320 A320 A320 A320 A320 B747 B747 B747 B747 B747 Site Orly Orly Orly Orly Orly Roissy Roissy Roissy Roissy Roissy Nom Corinne Amy Maureen Richard Ben Nicolas Jean-Marc Ségolène François Fabien Fonction Pilote Copilote PNC PNC PNC Pilote Copilote PNC PNC PNC L’objectif du système à modéliser est de constituer le tableau de service. Les membres de l’équipage peuvent visualiser les vols sur lesquels ils sont affectés. L’administrateur du système peut créer et supprimer des entités dans le système. Le manager peut ajouter et supprimer des personnes dans un équipage pour un vol donné (un vol est désigné par un numéro de vol et une date). Les données du vol sont archivées après le vol pour une année2 . 3 Résultat de l’analyse UML 3.1 Liste des classes Les classes et — attributs — obtenus après analyse du texte sont les suivants : • Équipage — auMin, auMax — la classe équipage regroupe l’ensemble des membres d’équipage (pilote, copilote et PNC) qui participent à un vol (à une date donnée) ; • Avion — — un avion appartient à une catégorie donnée, il participe à plusieurs vols ; • Pilote — — un membre d’équipage qui a pour métier pilote ; • Copilote — — un membre d’équipage qui a pour métier copilote ; • PNC — — un membre d’équipage qui a pour métier PNC ; • MembreÉquipage — nom, prénom — • CatégorieAvion — nom, nbPNCmin, nbPNCmax — un membre d’équipage ne peut voler que sur deux catégories d’avion. Plusieurs avions peuvent appartenir à la même catégorie, d’où la nécessité de créer une classe CatégorieAvion ; • Vol — numéro, site, destination, date — un vol est une classe d’association entre un avion et un ensemble de membres d’équipage. Un vol se déroule à une date donnée. Nous décidons aussi d’appeler le système global TableauNavigants. 3.2 Cas d’utilisation La figure suivante présente les acteurs et les cas d’utilisation du système. 2. En raison du temps limité, nous ignorons la tenue à jour de la localisation des équipages et le décompte de leurs temps de vol et de repos. TELECOM SudParis — Enseignants CSC4002 — Octobre 2015 — CSC 4002 397 TP13-14 : TP de synthèse 3.3 Tableaux de service des navigants Air France Diagramme de classes La figure suivante présente le diagramme de classes proposé. 3.4 Diagramme de machine à états La figure suivante présente le diagramme de machine à états de la classe « Vol ». TELECOM SudParis — Enseignants CSC4002 — Octobre 2015 — CSC 4002 398 TP13-14 : TP de synthèse 3.5 Tableaux de service des navigants Air France Diagramme de communications ou de séquence La figure suivante présente le diagramme de communications associé au cas d’utilisation « affecter un PNC à un vol ». TELECOM SudParis — Enseignants CSC4002 — Octobre 2015 — CSC 4002 399 TP13-14 : TP de synthèse 4 Tableaux de service des navigants Air France Questions de l’étude de cas Question 1 Donnez en Java tous les attributs de la classe Vol. Proposez un constructeur. Question 2 Donnez en Java tous les attributs de la classe MembreÉquipage. Vous devez réaliser l’association avec la classe CatégorieAvion avec une collection. Proposez un constructeur et une méthode equals. Question 3 Proposez un constructeur pour la classe Pilote Question 4 En considérant que la classe TableauNavigants utilise un vecteur appelé personnel pour stocker la collection des membres d’équipage. Réalisez le corps de la méthode de prototype suivant : MembreÉquipage chercherMembre(MembreÉquipage membre). Pour cette méthode, nous supposons qu’il est possible que des objets de type MembreÉquipage existent sans être référencés dans la collection personnel de la classe TableauNavigants, et cela, même si le diagramme de classes l’interdit par la présence de la composition entre la classe TableauNavigants et la classe MembreÉquipage. C’est de la programmation défensive : même si la composition est mal programmée (des objets MembreÉquipage existent en dehors de la collection personnel), les objets trouvés sont effectivement dans la collection. Par conséquent, l’objectif de la méthode chercherMembre est de tester si un objet égal à celui fourni en argument de la méthode est membre de la collection et, si c’est le cas, de donner l’objet qui est dans la collection. Sinon, elle retourne null. Question 5 Écrivez le corps de la méthode affecterPNCVol appelée dans le diagramme de communications correspondant au cas d’utilisation affecterPNCVol. La méthode affecterPNCVol de la classe TableauNavigants lève une exception appelée TableauNavigantsException pour décrire les cas d’erreur. Elle fait aussi appel à des méthodes de la classe Equipage qui lèvent des exceptions de type EquipageException. La méthode affecterPNCVol relaiera ces exceptions. En outre, la valeur booléenne retournée permet de savoir si l’équipage est au complet suite à l’ajout du membre. Le prototype de la méthode affecterPNCVol est le suivant : public boolean affecterPNCVol(Vol v, PNC pnc) throws TableauNavigantsException, EquipageException Question 6 Nous désirons intégrer un invariant à la classe MembreÉquipage. Nous avons choisi l’invariant suivant : le nombre de qualifications de la personne est entre 0 et 2. Écrivez l’invariant. Dans cette question, nous supposons que la collection utilisée dans la classe MembreÉquipage ne contient pas deux éléments égaux. Question 7 Nous ajoutons maintenant des tests d’invariant sur les méthodes de la classe MembreÉquipage qui modifient le nombre de qualifications. Ces méthodes lèveront donc l’exception InvariantBroken. Voici les nouveaux prototypes des méthodes à votre disposition : • MembreÉquipage(String nom, String prenom) throws InvariantBroken • public boolean addQualification(CatégorieAvion type) throws InvariantBroken, EquipageException • public boolean delQualification(CatégorieAvion type, boolean fromType) throws EquipageException, InvariantBroken Proposez un ensemble de tests unitaires pour vérifier que cet invariant n’est pas violé, puis implantez-les en utilisant le canevas logiciel JUnit. Voici les quatre tests : • la construction d’un objet correct (c.-à-d., l’invariant est vérifié) ; • l’ajout d’une qualification sans dépasser le maximum est permis ; • l’ajout d’une qualification déjà présente est interdit ; • l’ajout d’une qualification au delà du maximum n’est pas permis. TELECOM SudParis — Enseignants CSC4002 — Octobre 2015 — CSC 4002 400 TP13-14 : TP de synthèse Tableaux de service des navigants Air France TELECOM SudParis — Enseignants CSC4002 — Octobre 2015 — CSC 4002 401 Glossaire global Christian Bac et Denis Conan Revision : 1567 CSC 4002 Octobre 2015 Les définitions de ce glossaire sont en grande partie extraites de la source suivante : http://www.iai.uni-bonn.de/III/lehre/vorlesungen/SWT/SS96/Material/UML1.0/glossary.html. Il ne nous a pas semblé nécessaire de les traduire en français. acteur/actor [class] A predefined stereotype of type denoting an entity outside the system that interacts with use cases. 40, Cf. stéréotype/stereotype action A computational or algorithmic procedure. 48, 111, 114 agrégation/aggregation A special form of association that specifies a whole-part relationship between the aggregate (whole) and a component part. association class. 69 analyse/analysis The part of the software development process whose primary purpose is to formulate a model of the problem domain. Analysis focuses what to do, design focuses on how to do it. 33 artefact A piece of information that is used or produced by a software development process. An artefact can be a model, a description or software. 151 association A relationship that describes a set of links. 60 association binaire/binary association An association between two classes. 61 association n-aire/n-ary association An association among three or more classes. Each instance of the association is an n-tuple of values from the respective classes. 61 attribut/attribute A named property of a type. 56 cardinalité/cardinality The number of elements in a set. 61 cas d’utilisation/use case [class] A class that defines a set of use case instances. 39 classe/class A description of a set of objects that share the same attributes, operations, methods, relationships, and semantics. A class is an implementation of type. attribute. 56 classe abstraite/abstract class A class that cannot be directly instantiated. 79 classe concrète/concrete class A class that can be directly instantiated. 79 classe d’association/association class A modeling element that has both association and class properties. An association class can be seen as an association that also has class properties, or as a class that also has association properties. 77 composant/component An executable software module with identity and a well-defined interface. 143 composition A form of aggregation with strong ownership and coincident lifetime as part of the whole. Parts with non-fixed multiplicity may be created after the composite itself, but once created they live and die with it (i.e., they share lifetimes). Such parts can also be explicitly removed before the death of the composite. abstract class. 78 conception/design The part of the software development process whose primary purpose is to decide how the system will be implemented. During design strategic and tactical decisions are made to meet the required functional and quality requirements of a system. 34 dépendance/dependency A relationship between two modeling elements, in which a change to one modeling element (the independent element) will affect the other modeling element (the dependent element). 147, 152 diagramme/diagram A graphical presentation of a collection of model elements, most often rendered as a connected graph of arcs (relationships) and vertices (other model elements). 27 élément de modèle/model element An element that is an abstraction drawn from the system being modeled. 22 403 élément dérivé/derived element A model element that can be computed from another element, but that is shown for clarity or that is included for design purposes even though it adds no semantic information. 59 encapsulation A means to bind together code and the data it uses. 23, 65 espace de nommage/namespace A part of the model in which the names may be defined and used. Within a namespace, each name has a unique meaning. 146 état/state A condition or situation during the life of an object during which it satisfies some condition, performs some activity, or waits for some event. 110 état composite/composite state A state that consists of substates. 116 événement/event A significant occurrence. An event has a location in time and space and may have parameters. In the context of state diagrams, an event is an occurrence that can trigger a state transition. 110 exigence/requirement A desired feature, property, or behavior of a system. 30 généralisation spécialisation/generalisation A taxonomic relationship between a more general element and a more specific element. The more specific element is fully consistent with the more general element and contains additional information. An instance of the more specific element may be used where the more general element is allowed. 41, 63 généralisation spécialisation multiple/multiple inheritance A semantic variation of generalization in which a type may have more than one supertype. 63 héritage/inheritance The mechanism by which more specific elements incorporate structure and behavior of more general elements related by behavior. 63 interaction A behavioral specification that comprises a set of message exchanges among a set of objects within a particular context to accomplish a specific purpose. An interaction may be illustrated by one or more scenarios. 90, 99 interface The use of a type to describe the externally visible behavior of a class, object, or other entity. In the case of a class or object, the interface includes the signatures of the operations. 81 ligne de vie/object lifeline A line in a sequence diagram that represents the existence of an object over a period of time. 91 machine à états/state machine A behavior that specifies the sequences of states that an object or an interaction goes through during its life in response to events, together with its responses and actions. 109 message A communication between objects that conveys information with the expectation that activity will ensue. The receipt of a message is normally considered an event. 91 message asynchrone/asynchronous message A message where the sending object does not pause to wait for results. state machine. 93 message synchrone/synchronous message A message where the sending object pauses to wait for results. 93 méta-modèle/metamodel A model that defines the language for expressing a model. 403 méthode/method The implementation of an operation. The algorithm or procedure that effects the results of an operation. 403 modèle/model A semantically closed abstraction of a system. 22 404 multiplicité/multiplicity A specification of the range of allowable cardinalities that a set may assume. Multiplicity specifications may be given for roles within associations, parts within composites, repetitions, and other purposes. Essentially a multiplicity is a (possibly infinite) subset of the non-negative integers. 61 navigabilité/navigability The ability for objects of a class at one end of an association to retrieve objects from the other end. 76 objet/object An entity with a well-defined boundary and identity that encapsulates state and behavior. State is represented by attributes and relationships, behavior is represented by operations and methods. An object is an instance of a class. 23, 57, 73 opération/operation A service that can be requested from an object to effect behavior. An operation has a signature, which may restrict the actual parameters that are possible. 56, Cf. méthode/method paquetage/package A general purpose mechanism for organizing elements into groups. Packages may be nested within other packages. A system may be thought of as a single high-level package, with everything else in the system contained in it. 146 processus de développement/development process A set of partially ordered steps performed for a given purpose during software development, such as constructing models or implementing models. 29 processus de modélisation/modelling time Refers to something that occurs during a modeling phase of the software development process. It includes analysis time and design time. Usage note: When discussing object systems it is often important to distinguish between modeling-time and run-time concerns. 22 rôle/role The named specific behavior of an entity participating in a particular context. A role may be static (e.g., an association role) or dynamic (e.g., a collaboration role). 61 stéréotype/stereotype A new type of modeling element that extends the semantics of the metamodel. Stereotypes must be based on certain existing types or classes in the metamodel. Stereotypes may extend the semantics, but not the structure of pre-existing types and classes. Certain stereotypes are predefined in the UML, others may be user defined. 403, Cf. méta-modèle/metamodel système/system A collection of connected units that are organized to accomplish a specific purpose. A system can be described by one or more models, possibly from different viewpoints. 39 transition A relationship between two states indicating that an object in the first state will perform certain specified actions and enter the second state when a specified event occurs and specified conditions are satisfied. On such a change of state the transition is said to fire. 110 visibilité/visibility An enumeration whose value (public, protected, private, or implementation) denotes how the model element to which it refers may be seen outside its enclosing name space. 127 vue/view A projection of a model, which is seen from a given perspective or vantage point and omits entities that are not relevant to this perspective. object. 28 405 Index global Christian Bac et Denis Conan Revision : 1567 CSC 4002 Octobre 2015 406 attribut, 56, 195 de classe, 58 dérivé, 59 d’instance, 58 base, 208 classe dérivée, 208 enfant, voir généralisation spécialisation instanciation, 57 nom, 56 opération, 56 de classe, 58 d’instance, 58 parente, voir généralisation spécialisation classe abstraite, 79, 214 classe d’association, 77 classe instance, 196 classe méthode, 195 classe métier, 34, 71 classe paramétrée, 236 classe publique, 195 classes générique, 82 paramétrée, 82 CLASSPATH, 224 clone(), 228, 256, 257, 264 collection, 237 Hashtable, voir java.util.Hashtable List, voir java.util.List Map, voir java.util.Map table de hachage, 237 Vector, voir java.util.Vector communications, voir diagrammes, communications comportement, voir modèle, aspects dynamiques composant, voir diagrammes, composants, 143 composite, 144 connecteur d’assemblage, 144 de délégation, 144 dépendance, 143 interface fournie, 143 B requise, 143 bytcode, 180 port, 144 primitif, 144 C relation de dépendance, 143 cas d’utilisation, voir diagrammes, cas d’utilisation, composition, 78 90 concepteur, 55 relations, 42 conception, 20–154 extend, 42 classes, voir diagrammes, classes héritage, 42 communications, voir diagrammes, communicainclude, 42 tions scénario, 47 composants, voir diagrammes, composants classe, 56, 58 déploiement, voir diagrammes, déploiement abstraite, 79 des classes, voir conception des classes association, voir association, 203–205 A abstract, 215, 218 abstract, voir classe abstraite acteur, 39, 40 généralisation, 41 action, 114 activité, 114 do, 114 entrée, 114 entry, 114 exit, 114 sortie, 114 activité, voir diagrammes, activité agrégration forte, voir composition allocation mémoire, 199 analyse, 36–116 activité, voir diagrammes, activité cas d’utilisation, voir diagrammes, cas d’utilisation classes, voir diagrammes, classes communications, voir diagrammes, communications machine à états, voir diagrammes, machine à états objets, voir diagrammes, objets séquence, voir diagrammes, séquence analyste, 55 architecte, 55 architecture matérielle, 150 association, 60 multiplicités, 61 nom, 60 qualifiée, 132 rôle, 61 sens de lecture, 60 association qualifiée, 132 attribut, voir classe, 195 attribut de classe, 201–203 attribut dérivé, 131 auto référence, 198, 199 407 machine à états, voir diagrammes, machine à états objets, voir diagrammes, objets paquetages, voir diagrammes, paquetages séquence, voir diagrammes, séquence conception des classes, 118–136 encapsulation, 127, 129 accessibilité des attributs, 127 accessibilité des opérations, 127 visibilité, voir visibilité opérations, 134 attribut dérivé, 131 contrainte sur attribut, 134 message, 134 super, 136 traduction de la classe façade du système, 126 traduction des associations, 122–137 agrégation, 124 association binaire, 123 association n-aire, 123 association unidirectionnelle, 123 classes d’association, 137 compositions, 125 multiplicités, 123 référence, 123 constructeur, 196–198 conversion type, 189 copie profonde, 256, 257, 264 D déploiement, voir diagrammes, déploiement diagrammes activité, 46 action, 48 appel d’activité, 50 arête, 48 attente, 50 choix, 48 décision, 48 démarrage, 50 fork, 49 fusion, 48 garde, 48 information transmise, 50 join, 49 nœud initial, 48 nœud terminal, 48 cas d’utilisation, 38–45 acteur, voir acteur cas d’utilisation, voir cas d’utilisation exemple, 44 lien acteur — cas d’utilisation, 39 lien de communication, 42 méthodologie, 45 scénario, 39 système, 39, 42 classes, 54–71, 75–82 408 agrégation, 69 association, voir association association qualifiée, 132 classe, voir classe classe abstraite, 79 classe d’association, 77 composition, 78 exemple, 70, 83 généralisation spécialisation, voir généralisation spécialisation, voir généralisation spécialisation héritage, voir héritage interface, 80 méthodologie, 71 navigabilité, 76 communications, 88, 98–106 collection, 104 exemple, 100–104 lien d’interaction, 100 message, 100, voir message participant, 100 structure spatiale, 99 composants, 142–144 composant, voir composant déploiement, 149–152 architecture matérielle, 150 artefact, 151 component, 151 dépendance entre artefacts, 152 deploy, 151 device, 150 execution environment, 151 instance de nœud, 152 liaison de communication, 150 manifest, 151 nœud, 150 machine à états, 88, 108–116 action, 114, voir action état, 109, voir état exemple, 112, 113 méthodologie, 115 transition, 110, voir transition objets, 73 paquetages, 145–147 paquetage, voir paquetage séquence, 88–106 événement, voir message fragment, 95 gfragment, voir fragment de séquence ligne de temps, 91 message, 91, voir message participant, 91 downcast, 210 E encapsulation, voir conception des classes equals(), 228–230 Error, 252 état, 110 composite, 116 région, 116 sous-état, 116 evenement, voir événement événement, 110 final, 110 intial, 110 type, 110 étude de cas, 31 Studs, 31 cas d’utilisation, 44 conception des classes, 122, 129 contraintes, 32 diagramme d’activité, 48, 49 diagramme de classes, 70, 83 diagramme de communications, 100–103 diagramme de déploiement, 151, 152 diagramme de machine à états, 113 diagramme de séquence, 92, 95, 96 diagramme d’objets, 73 expression des besoins, 31 règles de gestion, 32 événement, voir message exception, 181, 267 principe, 249 relais, 267 traitement, 267 Exception, 252 extends, 207 F final, 207 finalize, 199 for for-each, 241 fragment de séquence condition d’entrée, 95 contour, 95 loop, 96 opt, 95 ref, 95 type, 95 G garbage collector, 199 généralisation, 206 généralisation spécialisation, 62, voir héritage, 64, 65 classe enfant, 62 classe parente, 62 méthode polymorphisme, 67 redéfinition d’opération, 66 H hashCode(), 228, 265, 266 Hashtable, voir collection hasNext(), 243 héritage, 62, voir généralisation spécialisation, 64, 65, 206 héritage simple, 207 I instance, voir objet, 196 instance method, 195 instanceof, 207 référence, 197 instanciation, voir classe instruction, 185 instruction de contrôle, 185 interface, 80, 218, 219 J JAVA API, 182 classe, 179, 194 historique, 178 JDK, 183 objet, 194 java.io, 232 java.io.Serializable, 235 java.lang, 227, 232 java.lang.Boolean, 232 java.lang.Byte, 232 java.lang.Character, 232 java.lang.Cloneable, 235 java.lang.Collection, 114 java.lang.Double, 232 java.lang.Exception, 251 java.lang.Float, 232 java.lang.Integer, 232, 233 java.lang.Iterable, 238 java.lang.Long, 232 java.lang.Number, 232 java.lang.Object, 207, 227, 228 java.lang.PI, 232 java.lang.Short, 232 java.lang.String, 227, 233, 234 java.lang.Void, 232 java.Math, 232 java.Math.sqrt(), 232 java.net, 232 java.util, 227, 232, 235 java.util.Collection, 237 java.util.Hashtable, 237, 245, 246 java.util.Integer, 227 java.util.Iterator, 237, 243 java.util.List, 237, 239 java.util.Map, 237, 244 java.util.Vector, 237, 240 L liaison dynamique, 67, 210 lien 409 acteur — cas d’utilisation, 39 de communication, 42 d’interaction, 100 List, voir collection M machine à états, voir diagrammes, machine à états machine virtuelle, 180 Map, voir collection message, 91, 100–105 asynchrone, 93 conditionné, 101 creation, 94 create, 94 new, 94 emboîté, 102 en séquence, 101 itération de, 103 retour d’appel, 93 suppression, 94 destroy, 94 synchrone, 93 syntaxe, 93 arguments, 93 attribut, 93 nom, 93 type retour, 93 méthode, voir opération, 195 méthode de classe, 201–203 méthode polymorphique, 67 liaison dynamique, 67 type effectif, 67 type formel, 67 method overloading surcharge, 195 modèle, 22 4+1 vues de Kruchten, 28 analyse, 37 aspects dynamiques, 85, 88 statiques, 53 boîte noire, 23 orienté objet, 23 modélisation, 22, 29 cycle en V, 29 phases, 29 analyse, 33, voir analyse, voir analyse conception, 34, voir conception expression des besoins, 30–32 multiplicités, voir association N navigabilité, 76 new, 197, 198 next(), 243 O objet, 73 410 objet destruction, 199 référence, 197 objets, voir diagrammes, objets operateur, 185 opération, voir classe abstraite, 79 orientation objet, voir modele, orienté objet P package, 223 paquetage, voir diagrammes, paquetages, 146, 223 dépendance, 147 espace de nommage, 146 imbrication, 147 passage argument, 192 polymorphisme, 210 R ramasse miettes, 181, 199 référence, 122, 123, 179 remove(), 243 RuntimeException, 252, 269 S scénario, 47, 90 séquence, voir diagrammes, séquence aspect temporel, 90 spécialisation, 206 static, 202, 203 super constucteur, 208 super(), 208 surcharge de méthode, 195 syntaxe de base, 185 système, voir diagrammes, cas d’utilisation limite, 42 système informatique, 28 T tableau, 179, 190, 191 accès, 191 création, 191 référence, 191 taille, 191 table de hachage, voir collection this, 198, 199 this(), 198, 199 throw, 250 Throwable, 252 throws, 250, 253 toString, 209, 213 toString() , 228 toString exemple, 202 transition, 110 déclenchée, 111 franchie, 111 implicite, 112, 114 réflexive, 114 syntaxe, 111 action, 111 condition, 111 événement, 111 transtypage, 189, 210 try catch, 250, 251, 253 seemethode polymorphisme, 67 seemethode polymorphisme, 67 type primitif, 179, 180, 188 boolean, 188 char, 188 double, 188 float, 188 int, 188 long, 188 short, 188 private, 225, 226 protected, 225, 226 public, 225, 226 vue, 22 cas d’utilisation, 22, 37 développement, 22, 141 logique, 22, 53 aspect dynamique, 85 aspect statique, 53 physique, 22 processus, 22, 37 U UML, 20–154 diagrammes activité, 26, voir diagrammes, activité cas d’utilisation, 26, voir diagrammes, cas d’utilisation classes, 26, voir diagrammes, classes communication, voir diagrammes, communications communications, 26 composants, 26, voir diagrammes, composants composites, 26 interaction, 26 machine à états, 26, voir diagrammes, machine à états objets, 26, voir diagrammes, objets paquetages, 26, voir diagrammes, paquetages séquence, 26, voir diagrammes, séquence temps, 26 vue globale d’interactions, 26 général, 24–26 langage, 25 unicode, 180 unité de compilation, 222 upcast, 210 V Vector, voir collection visibilité, 128 notation UML −, 129 #, 129 +, 129 private, 128 protected, 128 public, 128 visibilité, voir accessibilité visibilité, 225, 226 package, 225, 226 411 412 $ ' Fin #2 Nous espérons que ce cours a contribué à vous rendre autonome dans la lecture et l’écriture de modèles UML et de programmes JAVA. Bon voyage (;-)). & % Nous espérons que vous continuerez de naviguer avec plaisir dans ce cours en ligne lorsque vous en aurez besoin. 413 $ ' Licence Ce document est une documentation libre, placée sous la Licence de Documentation Libre GNU (GNU Free Documentation License). #3 Copyright (c) 2000-2014 C. Bac, D. Conan, C. Taconet, C. Lecocq, J.-P. Gibson Permission est accordée de copier, distribuer et/ou modifier ce document selon les termes de la Licence de Documentation Libre GNU (GNU Free Documentation License), version 1.2 ou toute version ultérieure publiée par la Free Software Foundation; avec les Sections Invariables qui sont ‘Licence’ ; avec les Textes de Première de Couverture qui sont ‘CSC4002: Introduction à la conception objet illustrée avec UML et JAVA’ et avec les Textes de Quatrième de Couverture qui sont ‘Fin’. Une copie de la présente Licence peut être trouvée à l’adresse suivante : http://www.gnu.org/copyleft/fdl.html. Remarque : La licence comporte notamment les sections suivantes : 2. COPIES VERBATIM, 3. COPIES EN QUANTITÉ, 4. MODIFICATIONS, 5. MÉLANGE DE DOCUMENTS, 6. RECUEILS DE DOCUMENTS, 7. AGRÉGATION AVEC DES TRAVAUX INDÉPENDANTS et 8. TRADUCTION. & % Ce document est préparé avec des logiciels libres : • LATEX : les textes sources sont écrits en LATEX (http://www.latex-project.org/, le site du Groupe francophone des Utilisateurs de TEX/LATEX est http://www.gutenberg.eu.org). Une nouvelle classe et une nouvelle feuille de style basées sur la classe seminar ont été tout spécialement dévéloppées: newslide (projet picoforge newslide, http://picoforge.int-evry.fr/projects/slideint) et slideint (projet picoforge slideint, http://picoforge.int-evry.fr/projects/slideint); • emacs: tous les textes sont édités avec l’éditeur GNU emacs (http://www.gnu.org/software/emacs); • dvips: les versions PostScript (PostScript est une marque déposée de la société Adobe Systems Incorporated) des transparents et des polycopiés à destination des élèves ou des enseignants sont obtenues à partir des fichiers DVI (« DeVice Independent ») générés à partir de LaTeX par l’utilitaire dvips (http://www.ctan.org/tex-archive/dviware/dvips); • ps2pdf et dvipdfm: les versions PDF (PDF est une marque déposée de la société Adobe Systems Incorporated) sont obtenues à partir des fichiers Postscript par l’utilitaire ps2pdf (ps2pdf étant un shell-script lançant Ghostscript, voyez le site de GNU Ghostscript http://www.gnu.org/software/ghostscript/) ou à partir des fichiers DVI par l’utilitaire dvipfm; • makeindex: les index et glossaire sont générés à l’aide de l’utilitaire Unix makeindex (http://www.ctan.org/tex-archive/indexing/makeindex); • TeX4ht: les pages HTML sont générées à partir de LaTeX par TeX4ht (http://www.cis.ohio-state.edu/~gurari/TeX4ht/mn.html); • Xfig: les figures sont dessinées dans l’utilitaire X11 de Fig xfig (http://www.xfig.org); • fig2dev: les figures sont exportées dans les formats EPS (« Encapsulated PostScript ») et PNG (« Portable Network Graphics ») grâce à l’utilitaire fig2dev (http://www.xfig.org/userman/installation.html); • convert: certaines figures sont converties d’un format vers un autre par l’utilitaire convert (http://www.imagemagick.org/www/utilities.html) de ImageMagick Studio; • HTML TIDY: les sources HTML générés par TeX4ht sont « beautifiés » à l’aide de HTML TIDY (http://tidy.sourceforge.net) ; vous pouvez donc les lire dans le source; Nous espérons que vous regardez cette page avec un navigateur libre: Mozilla ou Firefox par exemple. Comme l’indique le choix de la licence GNU/FDL, tous les éléments permettant d’obtenir ces supports sont libres. 414