Analyse Orientée Objet Damien Porquet [email protected] Plan Partie 1 : AOO 1 - Présentation 2 - Programmation fonctionnelle 3 - Programmation modulaire 4 - Les concepts de l'approche objet Module Génie Logiciel : Cours d'Analyse Orientée Objet. 2 Plan Partie 2 : UML 1 - Présentation d'UML 2 - Les diagrammes de cas d'utilisation 3 - Les diagrammes de classes et d'objets 4 - Les diagrammes d'interaction 5 - Les diagrammes de comportement 6 - Les diagrammes physiques 7 - Mise en oeuvre d'UML Module Génie Logiciel : Cours d'Analyse Orientée Objet. 3 Partie I : AOO I.1. Présentation de l'approche objet L'approche objet Historique Programmation : années 40 Fin 70 : crise du GL et apparition des méthodes de développement OO (interfaces utilisateur) Début de la POO : 1980 (version industrielle de SmallTalk) Exemple de langages OO : Turbo Pascal, C++, D, C#, Java, ADA, Python, PHP, Objective Caml, Eiffel,... Module Génie Logiciel : Cours d'Analyse Orientée Objet. 6 L'approche objet Qu'est-ce que c'est ? Un ensemble de concepts stables, éprouvés et normalisés Une solution destinée à faciliter l'évolution d'applications complexes Un ensemble d'outils et de langages performants pour le développement Les nouveaux langages sont toujours objet Module Génie Logiciel : Cours d'Analyse Orientée Objet. 7 L'approche objet A quoi est due son apparition ? Évolution des exigences : inadaptation de l'informatique « traditionnelle » données à traiter plus complexes ➔ problèmes plus complexes ➔ industrialisation de la production du logiciel ➔ Évolutions techniques : matériel & logiciel Module Génie Logiciel : Cours d'Analyse Orientée Objet. 8 I.2. Programmation fonctionnelle Programmation fonctionnelle Définition C'est l'approche traditionnelle de la programmation : la modélisation du logiciel est réalisée à partir des fonctions que doit implémenter (réaliser) le système. ➔ cf. : module de langage C Module Génie Logiciel : Cours d'Analyse Orientée Objet. 10 Programmation fonctionnelle La découpe fonctionnelle d'un problème informatique est une approche intuitive. Exemple : un logiciel de gestion d'une bibliothèque main maintenir_fonds_doc lister_docs(critères) modifier_docs(ref) mettre_à_jour(ref) ajouter(ref) data gérer_prêts nouveau_prêt(ref) retour_doc(ref) lettre_de_rappel supprimer(ref) Module Génie Logiciel : Cours d'Analyse Orientée Objet. 11 Programmation fonctionnelle Maintenance complexe en cas d'évolution En cas d'évolution majeure du logiciel (passage de la gestion d'une bibliothèque à celle d'une médiathèque, par exemple), de gros problèmes se posent. Même si la structure générale du logiciel reste valide, la multiplication des points de maintenance, engendrée par le chaînage des fonctions, rend l'adaptation très laborieuse. Le logiciel doit être retouché dans sa globalité. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 12 Programmation fonctionnelle Évolution bibliothèque → médiathèque main affichage selon le type maintenir_fonds_doc lister_docs(critères) data modifier_docs(ref) mettre_à_jour(ref) ajouter(ref) nouvelles données à gérer gérer_prêts nouveau_prêt(ref) supprimer(ref) Module Génie Logiciel : Cours d'Analyse Orientée Objet. retour_doc(ref) délai selon le type lettre_de_rappel dans quasiment toutes les fcts, il faut gérer les nouveaux types 13 Programmation fonctionnelle Évolution bibliothèque → médiathèque L'évolution nécessite (entre autres) : de faire évoluer les structures de données qui sont manipulées par les fonctions d'adapter les traitements qui ne manipulaient à l'origine qu'un seul type de document (des livres) Il faudra donc modifier toutes les portions de code qui utilisent la base documentaire pour gérer les données et les actions propres aux différents types de documents. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 14 Programmation fonctionnelle Exemple : les lettres de rappel Si on désire que le délai avant rappel varie selon le type de document emprunté, il faudra modifier la fonction qui réalise l'édition des lettres de rappel. struct Document { char nom[50]; doc_t type; bool est_emprunte; char emprunteur[50]; date_t date_emprunt; } Docs[MAX_DOCS]; void lettres_de_rappel( ... ) { ... for(i=0; i<nb_docs; i++) { if( Docs[i].est_emprunte ) { switch( Docs[i].type ) { case LIVRE: delai = 20; break; case K7VIDEO: delai = 7; break; case CDROM: delai = 5; break; ... } Module Génie Logiciel : Cours d'Analyse Orientée Objet. 15 Programmation fonctionnelle En fait, c'est la quasi-totalité de l'application qui devra être adaptée pour gérer les nouvelles données et réaliser les traitements correspondants. Et cela, à chaque fois qu'on décidera de gérer un nouveau type de document. Première amélioration possible : rassembler les valeurs qui caractérisent un type, dans le type. struct Document { char nom[50]; doc_t type; bool est_emprunte; char emprunteur[50]; date_t date_emprunt; int delai_emprunt; } Docs[MAX_DOCS]; void lettres_de_rappel( ... ) { ... for(i=0; i<nb_docs; i++) { if( Docs[i].est_emprunte ) { if( date() >= ( Docs[i].date_emprunt + Docs[i].delai_emprunt ) ) imprimer_rappel( Docs[i] ); ... } Module Génie Logiciel : Cours d'Analyse Orientée Objet. 16 Programmation fonctionnelle Deuxième amélioration possible : rassembler les traitements associés à un type, auprès du type. Avantage : cela permet de retrouver immédiatement où faire la modification et ne la faire qu'à cet endroit précis. Par exemple, dans notre exemple, dans un fichier spécialement dédié au type Document et ses fonctions dédiées. struct Document { ... } Docs[MAX_DOCS]; ... int calculer_delai_rappel( doc_t type ) { switch( type ) { case LIVRE: return 20; case K7VIDEO: return 7; case CDROM: return 5; /* nouveaux type ajoutés ici */ } } ... Module Génie Logiciel : Cours d'Analyse Orientée Objet. 17 Programmation fonctionnelle Écrit en ces termes, le logiciel est plus facile à maintenir et bien plus lisible. Les modifications apportées au logiciel de gestion de médiathèque nous ont amené à transformer ce qui était à l'origine une structure de données, manipulée par des fonctions, en une entité autonome, qui regroupe un ensemble de propriétés cohérentes et leur traitements associés. Une telle entité s'appelle un objet et constitue le concept fondateur de l'approche du même nom. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 18 Programmation fonctionnelle Récapitulatif Approche fonctionnelle : La modélisation est réalisée à partir de fonctions que doit réaliser le système. Approche orientée objet : On identifie les objets manipulés par le système, avec leurs états et leurs comportements. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 19 I.3. L'objet et le génie logiciel Objet et génie logiciel Qualités d'un logiciel Facteurs externes : du point de vue de l'utilisateur ex: rapidité d'exécution, facilité de mise en oeuvre, ... Facteurs internes : du point de vue du programmeur ex : réutilisation, lisibilité du code source, ... Module Génie Logiciel : Cours d'Analyse Orientée Objet. 21 Objet et génie logiciel Facteurs internes de qualité Exactitude Robustesse Extensibilité Réutilisation Compatibilité Portabilité Mise en oeuvre Apprentissage ... Module Génie Logiciel : Cours d'Analyse Orientée Objet. Modularité 22 Objet et génie logiciel Modularité Doit satisfaire les principes de : Décomposition Réutilisabilité Indépendance Compréhensibilité Module Génie Logiciel : Cours d'Analyse Orientée Objet. Caractérisent un objet 23 Objet et génie logiciel Cycle de développement d'un logiciel Analyse Conception Implémentation Tests n fois Grâce à la programmation orientée objet, on ajoute des propriétés aux classes déjà introduites, ou on ajoute de nouvelles classes, sans avoir à modifier l'existant. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 24 I.4. Les concepts de l'approche objet Concepts de l'approche objet La programmation orientée objet repose sur trois concepts de base : 1 2 3 La classe L'objet L'héritage Module Génie Logiciel : Cours d'Analyse Orientée Objet. 26 Concepts de l'approche objet Objets et classes Le terme orienté objet signifie l'organisation du logiciel en un ensemble d'objets incorporant à la fois les structures de données et le comportement. La programmation conventionnelle n'établit qu'une faible connexion entre structure de données et comportement. C'est la classe qui sert à regrouper sous un même terme générique les objets partageant la même structure de données et le même comportement. Un objet est une instance de classe. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 27 Concepts de l'approche objet Objets et classes Objets : Alice, Pierre, Paul; université d’Orléans, université Paris 7, université Lyon 1. Classe : regroupement d ’objets de même type, dans notre cas : Personne Université L’objet est une instance de sa classe. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 28 Concepts de l'approche objet Attributs Objet Classe Pierre : Personne Personne 25 ans Age : int Pierre Durand Nom : string 40 rue ZOLA Adresse :string Module Génie Logiciel : Cours d'Analyse Orientée Objet. 29 Concepts de l'approche objet Méthodes Personne Age : int Nom, Adresse : string renvoie Nom SePrésenter() Vieillir() ChangerNom(…) Module Génie Logiciel : Cours d'Analyse Orientée Objet. Age = Age+1 30 Concepts de l'approche objet Classes La classe est séparée en deux parties : 1. La spécification de la classe qui décrit le domaine de définition et les propriétés des instances de classes 2. La réalisation de la classe qui décrit comment la spécification est réalisée Module Génie Logiciel : Cours d'Analyse Orientée Objet. 31 Concepts de l'approche objet Que sont les objets ? Les objets du monde réel nous entourent ; ils naissent, vivent et meurent. En orienté objet, ils sont alloués, changent d'état et se comportent en conséquence, et sont désalloués. Ce sont des instances des classes. Les objets informatiques définissent une représentation simplifiée des entités du monde réel. Ils peuvent représenter des entités concrètes ou des entités abstraites (concepts). Module Génie Logiciel : Cours d'Analyse Orientée Objet. 32 Concepts de l'approche objet Les objets sont des abstractions Une abstraction est un résumé, un condensé qui met en avant les caractéristiques essentielles et qui dissimulent les détails. Les caractéristiques essentielles d'un objet sont celles qui sont précisées lors de la spécification de la classe dont il est une instance. Les détails, qui sont les détails d'implémentation, sont précisés au moment de la définition des opérations de la classe. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 33 Concepts de l'approche objet Des caractéristiques aux attributs et méthodes 1/2 Approche fonctionnelle Créer une structure qui représente un nombre complexe Créer une fonction qui retourne un complexe à partir de sa partie imaginaire et de sa partie réelle passées en arguments Créer une fonction qui additionne deux nombres complexes ... Module Génie Logiciel : Cours d'Analyse Orientée Objet. 34 Concepts de l'approche objet Des caractéristiques aux attributs et méthodes 2/2 Approche objet Créer une classe CComplexe qui contient : Ses attributs : partie réelle et imaginaire Ses méthodes : création à partir de sa partie réelle et de sa partie imaginaire s'additionner à un autre nombre complexe ... Module Génie Logiciel : Cours d'Analyse Orientée Objet. 35 Concepts de l'approche objet Caractéristiques fondamentales des objets L'identité L'état Le comportement Module Génie Logiciel : Cours d'Analyse Orientée Objet. 36 Concepts de l'approche objet L'identité Chaque objet a sa propre identité ; deux objets sont distincts même si toutes les valeurs de leurs attributs sont identiques. Cela se comprend aisément puisque la place mémoire occupée par chaque objet est distrincte. Pour reconnaître un objet et lever toute ambiguïté, on utilise, en général, un identifiant particulier : n° de SS, plaque d'immatriculation, clé dans une base de données, ... Module Génie Logiciel : Cours d'Analyse Orientée Objet. 37 Concepts de l'approche objet L'état et le comportement Les attributs d'un objet peuvent contenir différentes valeurs. Ce sont les différents états que peut prendre l'objet. Le comportement regroupe toutes les compétences d'un objet, sous la forme d'opérations. C'est l'ensemble des actions et des réactions de l'objet. Avion Atterrir L'état et le comportement sont liés : le comportement dépend de l'état l'état est modifié par le comportement en vol Décoller Avion Tour de contrôle Module Génie Logiciel : Cours d'Analyse Orientée Objet. au sol 38 Concepts de l'approche objet Communication entre objets Une application, en orienté objet, est une société d'objets collaborants. Comment, dans ces conditions, sont réalisées les fonctions de l'application ? Ce sont les objets, qui travaillent en synergie, pour parvenir à les réaliser. Donc, l'achèvement d'une tâche par une application repose sur la communication entre les objets qui la composent. L'unité de communication entre les objets est le message. Plus spécialisé et plus coopératif que l'objet, l'agent (implémentation partielle des agents possible en Java). L'agent est plus adapté que l'objet pour représenter des êtres intelligents. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 39 Concepts de l'approche objet Communication entre objets Message B Message A Objet 1 Objet 2 Message C Message E Objet 4 Objet 3 Message D Module Génie Logiciel : Cours d'Analyse Orientée Objet. 40 Concepts de l'approche objet Les messages Il existe cinq catégories principales de messages : 1 les constructeurs qui créent des objets 2 les destructeurs qui détruisent des objets (pas en Java) 3 les sélecteurs qui renvoient tout ou partie de l'état d'un objet 4 les modificateurs qui changent tout ou partie de l'état d'un objet 5 les itérateurs qui visitent l'état d'un objet ou le contenu d'une structure de données qui contient plusieurs objets Module Génie Logiciel : Cours d'Analyse Orientée Objet. 41 Concepts de l'approche objet La programmation Orientée Objet On dit d'un langage de programmation qu'il est un langage orienté objet quand il supporte les mécanismes : d'héritage de polymorphisme d'encapsulation Ex: Smalltalk, Eiffel, C++, D, Java, Delphi... Module Génie Logiciel : Cours d'Analyse Orientée Objet. 42 Concepts de l'approche objet L'héritage Les hiérarchies de classes (classification) permettent de gérer la complexité en ordonnant les objets au sein d’arborescence de classes d’abstraction croissante. Les classes descendantes héritent des propriétés des classes ancêtres (exemple : vertébrés, mammifères, hominidés, hommes). Généraliser Spécialiser Une classe descendante (une sous-classe) peut être également vue comme un sous-type du type défini par la classe ancêtre (la sur-classe) Ex. : ensembles et sous-ensembles mathématiques. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 43 Concepts de l'approche objet Exemple d'héritage Véhicule Véhicule aérien Véhicule roulant Voiture Camion Avion Bateau Hélicoptère Goélette Module Génie Logiciel : Cours d'Analyse Orientée Objet. A voile Catamaran 44 Concepts de l'approche objet Héritage et redéfinition Une sous-classe peut spécialiser les fonctionnalités de sa superclasse en définissant de nouveaux attributs et/ou de nouvelles méthodes dont elle hérite de deux manières : en remplaçant complètement la méthode héritée par une nouvelle implémentation en spécialisant la méthode héritée en proposant une nouvelle implémentation qui réutilise celle héritée Exemple : calculer la surface d’un polygone, d’un quadrilatère, d’un triangle, d’un carré, d’un rectangle, d’un triangle isocèle, d’un triangle rectangle, ... Module Génie Logiciel : Cours d'Analyse Orientée Objet. 45 Concepts de l'approche objet Redéfinition : réutilisation Etudiant Nom Prenom Age Affiche() EtudiantSportif SportPratiqué Affiche() Module Génie Logiciel : Cours d'Analyse Orientée Objet. 46 Concepts de l'approche objet Polygone Redéfinition : substitution Surface() Quadrilatere Triangle Surface() Surface() Rectangle Carre TriangleRectgle Surface() Surface() Surface() Module Génie Logiciel : Cours d'Analyse Orientée Objet. TriangleIsocele Surface() 47 Concepts de l'approche objet Polymorphisme Le polymorphisme signifie qu'une même opération peut se traduire différemment selon l'objet sur laquelle elle s'applique : C'est la capacité d’un objet à prendre plusieurs formes. On parle également de liaison dynamique. Le polymorphisme associé à la liaison dynamique offre une plus grande simplicité du code (plus besoin de distinguer les cas en fonction des classes) et une plus grande facilité d’évolution du code (les programmes sont plus facilement extensibles comme on peut redéfinir une opération appartenant à une classe dont on hérite, appartenant à une surclasse). Module Génie Logiciel : Cours d'Analyse Orientée Objet. 48 Concepts de l'approche objet Polymorphisme Polygone Surface() Quadrilatere Triangle Surface() Surface() Rectangle Carre TriangleRectgle Surface() Surface() Surface() Module Génie Logiciel : Cours d'Analyse Orientée Objet. TriangleIsocele Surface() 49 Concepts de l'approche objet Polymorphisme Pour exploiter pleinement le polymorphisme, il est courant de définir des classes dont le seul rôle est de spécifier une interface (un ensemble de méthodes) commune pour toutes les classes qui en seront dérivées. Dans de telles classes, les méthodes qui servent à définir cette interface commune sont le plus souvent muettes (elles ne contiennent pas de code effectif). Module Génie Logiciel : Cours d'Analyse Orientée Objet. 50 Concepts de l'approche objet Polymorphisme : classe abstraite ObjetGeom Surface() Polygone Surface() Module Génie Logiciel : Cours d'Analyse Orientée Objet. 51 Concepts de l'approche objet L'encapsulation 1/2 Il existe trois niveaux de visibilité : privé protégé public Cela permet de limiter les effets de bord. Module Génie Logiciel : Cours d'Analyse Orientée Objet. 52 Concepts de l'approche objet Encapsulation 2/2 Regroupement des attributs et des méthodes Modularité : 1 protège les données d ’une utilisation erronée 2 cache les détails des méthodes Evolutivité, fiabilité Module Génie Logiciel : Cours d'Analyse Orientée Objet. Personne Age : int Nom, Adresse : string SePrésenter() Vieillir() ChangerNom(…) 53 Concepts de l'approche objet Quelques autres spécificités de la POO La surcharge (prototype de fonctions : plusieurs méthodes portant le même nom à l’intérieur d’une classe) Les pré-conditions, les post-conditions, les invariants La généricité (« template » en C++) Le traitement des situations exceptionnelles (« throw », « try » et « catch » : lever et attraper une exception) Module Génie Logiciel : Cours d'Analyse Orientée Objet. 54