Concepts et méthodologie Objet illustrés par Java et C++ Référence OO-100 Guide étudiant Sun Microsystems France S.A. Service Formation 143 bis, avenue de Verdun 92442 ISSY LES MOULINEAUX Cedex Tel 41 33 17 17 Fax 41 33 17 20 Révision D, Fevrier 1999 Document non révisable 1997 Sun Microsystems, Inc.—Printed in the United States of America. 2550 Garcia Avenue, Mountain View, California 94043-1100 U.S.A. Tous droits réservés. Ce produit ou document est protégé par un copyright et distribué avec des licences qui en restreignent l'utilisation, la copie, la distribution, et la décompilation. Aucune partie de ce produit ou de sa documentation associée ne peut être reproduite sous aucune forme, par quelque moyen que ce soit, sans l'autorisation préalable et écrite de Sun et de ses bailleurs de licence, s'il y en a. Des parties de ce produit pourront être dérivées du système UNIX® licencié par Novell, Inc. et du système Berkeley 4.3 BSD licencié par l'Université de Californie. UNIX est une marque enregistrée aux Etats-Unis et dans d'autres pays et licenciée exclusivement par X/Open Company Ltd. Le logiciel détenu par des tiers, et qui comprend la technologie relative aux polices de caractères, est protégé par un copyright et licencié par des fournisseurs de Sun. Sun, Sun Microsystems, le logo Sun, [ATTRIBUTION OF ALL OTHER SUN TRADEMARKS MENTIONED SIGNIFICANTLY THROUGHOUT PRODUCT OR DOCUMENTATION. DO NOT LEAVE THIS TEXT IN YOUR DOCUMENT !] sont des marques déposées ou enregistrées de Sun Microsystems, Inc. aux Etats-Unis et dans d'autres pays. Toutes les marques SPARC, utilisées sous licence, sont des marques déposées ou enregistrées de SPARC International, Inc. aux Etats-Unis et dans d'autres pays. Les produits portant les marques SPARC sont basés sur une architecture développée par Sun Microsystems, Inc. [THIRD PARTY TRADEMARKS THAT REQUIRE ATTRIBUTION APPEAR IN `TMARK.' IF YOU BELIEVE A THIRD PARTY MARK NOT APPEARING IN `TMARK' SHOULD BE ATTRIBUTED, CONSULT YOUR EDITOR OR THE SUN TRADEMARK GROUP FOR GUIDANCE.] Les interfaces d'utilisation graphique OPEN LOOK® et SunTM ont été développées par Sun Microsystems, Inc. pour ses utilisateurs et licenciés. Sun reconnaît les efforts de pionniers de Xerox pour la recherche et le développement du concept des interfaces d'utilisation visuelle ou graphique pour l'industrie de l'informatique. Sun détient une licence non exclusive de Xerox sur l'interface d'utilisation graphique Xerox, cette licence couvrant aussi les licenciés de Sun qui mettent en place l'interface d'utilisation graphique OPEN LOOK et qui en outre se conforment aux licences écrites de Sun. Le système X Window est un produit de X Consortium, Inc. CETTE PUBLICATION EST FOURNIE "EN L'ETAT" SANS GARANTIE D'AUCUNE SORTE, NI EXPRESSE NI IMPLICITE, Y COMPRIS, ET SANS QUE CETTE LISTE NE SOIT LIMITATIVE, DES GARANTIES CONCERNANT LA VALEUR MARCHANDE, L'APTITUDE DES PRODUITS A RÉPONDRE A UNE UTILISATION PARTICULIERE, OU LE FAIT QU'ILS NE SOIENT PAS CONTREFAISANTS DE PRODUITS DE TIERS. Table des matières Vision objet pour le développement..................................................... 1-1 Technologies objet............................................................................ 1-2 Présentation du concept objet ........................................................ 1-4 Identité et classification................................................................... 1-6 Abstraction et Encapsulation ......................................................... 1-8 Passage de messages...................................................................... 1-12 Association et Agrégation............................................................. 1-14 Héritage et polymorphisme.......................................................... 1-20 Méthodes objet .......................................................................................... 2-1 Analyse et conception orientées objet ........................................... 2-2 Caractéristiques des méthodologies.............................................. 2-4 Méthodes orientées traitements..................................................... 2-6 Méthodes orientées Données ....................................................... 2-14 Méthodes orientées Données : Merise ........................................ 2-16 Principales méthodologies objet .................................................. 2-30 Présentation d’OMT ...................................................................... 2-38 OMT : Modélisation Statique ....................................................... 2-40 OMT : Modélisation Dynamique................................................. 2-48 OMT : Modélisation Fonctionnelle.............................................. 2-56 Différentes étapes en analyse objet.............................................. 2-58 Approche objet et méthodes orientées Traitements.................. 2-60 Approche objet et méthodes orientées Données ....................... 2-62 Développement orienté objet ................................................................. 3-1 Passage de l’analyse à la conception ............................................. 3-2 Types abstraits et identité d’objet .................................................. 3-8 Polymorphisme : staticité, dynamicité, virtualité ..................... 3-10 Classes et métaclasses.................................................................... 3-14 Gestion de la mémoire................................................................... 3-16 Langages orientés objet ................................................................. 3-18 Catalogue des langages purs........................................................ 3-20 Catalogue des langages hybrides ................................................ 3-22 Internet et Java................................................................................ 3-26 iii Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Java : une plate-forme applicative universelle........................... Principes de fonctionnement........................................................ Classe ............................................................................................... Constructeur et destructeur.......................................................... Allocation ........................................................................................ Envoi de message........................................................................... Agrégation ...................................................................................... Héritage ........................................................................................... Polymorphisme .............................................................................. Atelier de Génie Logiciel............................................................... Outils d’Upper CASE orientés objet............................................ Outils du Lower CASE orientés objet ......................................... Présentation de Visual WorkShop C++ ...................................... Présentation d’un AGL ................................................................. Exercices .......................................................................................... 3-30 3-32 3-34 3-38 3-42 3-44 3-46 3-48 3-50 3-56 3-58 3-60 3-62 3-64 3-66 Objets en application ............................................................................... 4-1 Standards de l’objet ......................................................................... 4-2 CORBA .............................................................................................. 4-4 ORB .................................................................................................... 4-6 Services CORBA et facilités communes...................................... 4-10 Orbix d’IONA................................................................................. 4-16 Solutions d’objets distribués avec Java ....................................... 4-18 Architecture de composants objets.............................................. 4-22 Relationnel et objet......................................................................... 4-24 Principes des SGBDO .................................................................... 4-30 Approche langage ou objet persistant ........................................ 4-32 Approche Base de données objet intégrée.................................. 4-34 Modèle objet de l’ODMG.............................................................. 4-36 Langage d’interrogation OQL...................................................... 4-38 Marché des SGBDO ....................................................................... 4-40 Corrections de l’étude de cas .................................................................A-1 Index ............................................................................................................... 1 iv Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Vision objet pour le développement 1 Objectifs ■ Présenter le concept objet ■ Identité ■ Classification ■ Encapsulation ■ Passage de messages ■ Association et agrégation ■ Héritage ■ Polymorphisme ■ Abstraction Exercice ■ Exercice simple de modélisation objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-1 1 Technologies objet GUI (Graphic User Interface) Programmation par objet Outils objet Méthodes objet Bases de données objet Systèmes d’exploitation objet 1-2 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Technologies objet Initialement cantonnés aux environnements de développement et aux langages de programmation, l’objet s’est étendu depuis les années 1990, aux méthodologies de conception et aux bases de données. Mais déjà les systèmes d’exploitation et les architectures distribuées sont de nouveaux champs d’investigation de l’objet. Ce cours ne consacre pas beaucoup de place à cette dernière émergence et s’attache d’avantage à dresser un panorama de l’objet dans le domaine de la conception : a. Méthodes, b. Outils de conception/spécification et AGL, c. Langages de programmation, d. Bases de données. On s’attachera dans la limite du possible à fournir des catalogues des différents produits disponibles sur le marché dans ces divers domaines ainsi qu’une comparaison avec ceux qui se rattachent d’avantage à des méthodes/outils traditionnels. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-3 1 Présentation du concept objet Une personne se présenter Prénom Nom Age lire courir 1-4 Modularisation Communication par messages Encapsulation Héritage Classification Polymorphisme Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Présentation du concept objet Ce dessin représente une personne. Une personne peut se présenter en énonçant son prénom, son nom, son âge, etc. Elle peut lire, courir, etc. Nous pouvons retrouver ici les concepts fondamentaux des objets : 1. Modularisation C’est le développement logiciel en petits modules, appelés objets. Les objets regroupent des structures de données et les opérations autorisées sur ces données. 2. Identité et classification On regroupe les objets ayant le même comportement pour les les traiter comme faisant partie de la même classe. 3. Encapsulation C’est la distinction claire entre les interfaces de l’objet, qui décrivent ce que l’objet réalise, et son implémentation définissant comment il le fait et ce qu’il a à faire. 4. Communication par messages Un objet demande à un autre objet un service, indépendamment de "comment" et "où" l’objet distant est implémenté. 5. Héritage On veut pouvoir réutiliser des classes existantes en définissant de nouvelles classes qui héritent des caractéristiques de la première. 6. Polymorphisme Il est possible à divers objets de classes héritées de répondre au même message. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-5 1 Identité et classification objets (Personne) (Personne) (Personne) Lazare Garcin 30 Classe Personne Prénom Nom Données Age courir lire se présenter 1-6 Services Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Identité et classification Identité L’identité signifie que les données sont regroupées en entités discrètes et identifiables appelées objets. Il est possible d’avoir deux objets ayant les mêmes données. Nous pouvons les différencier en utilisant une adresse, un index ou en donnant une valeur unique à une donnée. Par exemple, des jumeaux sont quand même deux personnes différentes. Classification Les objets ayant la même structure de données et les mêmes services sont groupés dans une Classe. Une Classe est une abstraction des informations nécessaires pour une application particulière. Une Classe est la description d’un nombre indéfini d’objets. Nous pouvons donc dire qu’un objet est une instance de sa Classe. Un objet connaît son genre car il contient une référence implicite à sa propre Classe. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-7 1 Abstraction et Encapsulation Abstraction Classe = Type abstrait de données Personne Prénom Nom Age courir lire se présenter 1-8 Données Services Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Abstraction et Encapsulation L’Abstraction et l’Encapsulation ne sont pas des concepts uniquement liés à l’orienté objet mais ils y sont très bien intégrés en particulier grâce à l’Héritage et au Polymorphisme. Abstraction L’Abstraction est une vue générique d’une entité permettant de ne pas être limité par des contraintes d’ordre technique ou matériel. Une classe peut être appelée un type abstrait de données (A.D.T. / Abstract Data Type). La puissance de l’abstraction est renforcée par les effets multiplicateurs apportés par l’héritage et le polymorphisme de l’objet. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-9 1 Abstraction et Encapsulation Encapsulation Personne Prénom Nom Age Adresse courir se présenter lire voir ■ ■ 1-10 Données privées Données publiques Services privés Services publics Interface publique d’un objet : ■ Accès libre au monde extérieur ■ A pour vocation de contenir l’interface de l’objet (services) ■ Des données peuvent aussi être publiques Interface privée d’un objet : ■ Accès interdit au monde extérieur ■ Contient les données vitales de l’objet ■ Contient les services de gestion des données privées ■ Contient les services d’action sur l’environnement liés à l’état de l’objet Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Abstraction et Encapsulation Encapsulation L’objet est indépendant parce qu’il peut gérer lui même ses données internes. Ceci implique que l’objet soit seul à pouvoir accéder à ces données vitales. Nous pouvons donc distinguer deux types de propriétés (données et services) : ■ les propriétés publiques, d’interface ou en libre accès, ■ les propriétés privées, d’accès exclusivement réservé à l’usage de l‘objet. Les propriétés publiques Les services et données publics sont destinés à réaliser l’interface avec l’environnement. C’est par ces services que l’environnement peut véhiculer ses messages à destination de l’objet. Dans notre exemple, nous pouvons dire que les services lire et voir sont publics car ils peuvent être mis en oeuvre par des messages venant directement de l’extérieur. Les propriétés privées Ce sont les parties de l’objet auxquelles l’environnement n’a aucun droit d’accès direct. Dans notre exemple, nous pouvons définir se présenter comme un service privé. Il est possible d’imaginer que le service se présenter ne sera mis en oeuvre que si l’objet a été mis dans l’état pas connaître par le service public voir. De même, un service de gestion de la donnée privée Age pourrait être créé, pour la remettre à jour chaque année. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-11 1 Passage de messages ■ Les objets inter-agissent par échange de messages ■ Prise en charge par les méthodes de l’interface publique Lire !! implémentation Interface publique ■ 1-12 Message : ■ Objet destinataire ■ Méthode à activer sur cet objet ■ Paramètres Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Passage de messages Les objets communiquent entre eux en s’envoyant des messages. Un objet envoie un message à un autre objet lequel peut répondre, changer d’état ou réagir d’une toute autre façon. Les objets peuvent seulement interagir à travers leurs interfaces publiques. On peut citer, comme exemple de passage de messages, un appel téléphonique entre deux personnes, un signal électrique entre le démarreur et le moteur d’une machine etc. Les messages sont pris en charge par les méthodes de l’interface publique de l’objet destinataire. Prenons l’exemple d’une expression arithmétique : num1 + num2. L’objet num1 reçoit le message "+ num2". Le + permet à l’objet num1 d’identifier la méthode (que l’objet devra appliquer à lui-même) alors que num2 est le paramètre de cette méthode. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-13 1 Association et Agrégation Deux types de relations Collaboration objets stylo, encre, main et papier La main associé l’encre du stylo à l’objet papier Le stylo est composé d’une plume, d’un réservoir etc Exemples d’associations “uses” “Utilise” Une relation est souvent décrite comme un contrat Un objet contracte un service auprès d’un autre. La personne utilise l’ordinateur... La personne ne contient pas l’ordinateur pas plus que l’ordinateur ne contient la personne... 1-14 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Association et Agrégation Les objets interagissent à travers des associations ou des agrégations. Une agrégation est une relation de contenant lorsqu’un objet contient un autre objet ; très souvent, l’objet contenu est un composant de l’objet plus général. Une association correspond à la décision de deux objets indépendants de collaborer pour réaliser un but commun. Après l’atteinte du but, ils peuvent continuer à exister indépendamment l’un de l’autre. Association Des objets sont associés lorsque l’un d’entre eux utilise les services et les opérations d’un autre. Le taille-crayon offre un service aux objets crayons. Le crayon utilise le taille-crayon pour réaliser un but précis : avoir une mine pointue. Une relation d’agrégation serait dans ce cas inapplicable : un taillecrayon ne peut pas être un composant du crayon ou vice-versa. Les associations doivent être effectuées à la main. Les objets sont créés simplement avec un potentiel d’association avec les autres. En revanche, pour l’agrégation, la gestion est automatique. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-15 1 Association et Agrégation Exemples d’agrégations Un crayon est composé d’un objet mine et d’un objet corps en bois. Sans mine, un crayon ne serait pas un crayon. Un nombre flottant 3.1459 Mantisse Exposant Nom Un employé Age Adresse Prénom Association ou agrégation ? "possède" ou "utilise" Dans cette relation, est-ce que le réveil est associé aux aiguilles ou possède les aiguilles ? 1-16 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Association et Agrégation Agrégation L’agrégation intervient lorsqu’un objet est contenu à l’intérieur d’un autre. Dans beaucoup de cas, il n’est fondamental pour l’objet d’exister indépendamment d’un autre. Dans ce cas, l’agrégation est la relation la plus adaptée. Cela a peu de sens pour un crayon d’exister sans mine. Mais un crayon sans mine est-il réellement un crayon ? L’agrégation permet d’augmenter le niveau d’abstraction dans le système du fait que les objets (comme la mantisse et l’exposant d’un nombre flottant) sont cachés derrière l’interface publique de la classe contenant (le nombre flottant). Agrégation ou Association? Il n’est pas toujours facile de faire un choix entre agrégation et association. Utilisation de l’agrégation Si on modélise le réveil en utilisant l’agrégation alors il contient toujours les aiguilles et ne peut exister sans ce composant fondamental. Utilisation de l’association Si on modélise le réveil à travers les associations, quels seront les objets en relation ? L’objet boîtier et l’objet aiguilles correspondent à deux objets qui interagissent pour constituer l’objet réveil. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-17 1 Association et Agrégation Résumé ■ ■ 1-18 Association ■ Implémentation de la relation utilise ■ Création des objets obligatoires ■ Flexible ■ Utilisation fréquente avec des objets composés d’éléments interchangeables ou pré-existants Agrégation ■ Implémentation de la relation possède ■ Les composants sont créés automatiquement ■ Augmentation du niveau d’abstraction dans la phase de conception ■ Non flexible Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Notes Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-19 1 Héritage et polymorphisme ■ Exemple de la personne Personne Nom: string Prénom: string Age: integer courir lire se présenter {abstrait} Anglais Allemand se présenter se présenter ■ Autres exemples Superclasse Classes dérivées ... Basket ball Balle Football Méthode taper Tennis Méthode taper 1-20 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Héritage et polymorphisme Héritage L’héritage est le partage des données et des services entre des classes ayant une relation hiérarchique. Une Classe peut avoir une définition large et être ensuite affinée par des classes dérivées. Chacune de ces sous-classes hérite de toutes les propriétés (données et services) de la classe lui étant hiérarchiquement supérieure sans avoir à les répéter et ajoute ses propres propriétés. Nous pouvons par exemple affiner la Classe Personne suivant la nationalité ou la langue maternelle tout en gardant les propriétés de base telles que Prénom, Nom et Age. Cette possibilité de factoriser dans une classe, que l’on peut appeler superclasse, des propriétés communes à d’autres classes est un des avantages principaux de l’orienté objet car il permet de réduire la répétition et permet la réutilisation. Polymorphisme Le polymorphisme veut dire que le même service, aussi appelé opération ou méthode, peut avoir un comportement différent suivant la Classe dans laquelle il est utilisé. Par exemple, la Classe Personne possède un service se présenter ; chaque personne peut se présenter mais la façon de le faire variera suivant la langue utilisée. De même, la classe Balle a une méthode taper qui peut différer en fonction du type de balle considéré : balle de Basket Ball, de Football ou de Tennis. Le polymorphisme permet de créer de nouvelles classes utilisant le même service sans avoir à modifier le code existant. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-21 1 Héritage et polymorphisme Cas de l’héritage multiple ■ Exemple d’héritage multiple Commercial Manager Manager commercial ■ Problème d’ambiguité Personne Nom commercial Manager Nom Nom Manager commercial Nom Nom Quel est mon nom ? 1-22 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Héritage et polymorphisme Cas de l’héritage multiple L’héritage multiple est une technique qui consiste à dériver de nouvelles classes à partir de plusieurs classes de base. Cela est très utile lorsqu’on modélise des objets qui nécessitent la combinaison de deux ou plusieurs autres types. Dans l’exemple ci-joint, une nouvelle classe Manager commercial dérive de plus d’une classe de base : de ce fait, il contient les attributs et méthodes de ses deux classes de base ainsi que tout membre additionnels nécessaires. Mais l’héritage multiple introduit un problème lorsque les classes de base dérivent d’une même classe commune. Dans l’exemple ci-joint, l’attribut Nom de la classe Personne apparaît deux fois dans la classe Manager commercial. On peut donc parler d’ambiguïté. La solution à cette ambiguïté est résolue différemment selon les langages orientés objet. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-23 1 Nouvelle terminologie 1-24 ■ Objet ■ Classe ■ Abstraction ■ Encapsulation ■ Attributs, états, données ■ Comportement, méthodes, opérations ■ Membres privés ■ Membres publiques, interface ■ Modélisation de l’objet ■ Association et Agrégation ■ Héritage ■ Polymorphisme Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 11 1 Exercice 1. Faire la liste des objets présents dans la salle de cours. On précisera en particulier : ■ les états et les opérations, ■ Quels sont les membres publics et privés. 2. Procéder à la classification des objets en favorisant le polymorphisme. 3. Identifier les relations de type agrégation et association. 4. Créer des hiérarchies dans vos classes et : ■ introduire, si possible, l’héritage multiple, ■ identifier dans ce cas les ambiguïtés possibles. Vision objet pour le développement Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 1-25 1 Notes 1-26 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Méthodes objet 2 Objectifs ■ ■ ■ ■ Faire un rappel sur les méthodes orientées Traitements : ■ Les différentes méthodes ■ Les décompositions fonctionnelles successives ■ La représentation dynamique Faire un rappel sur les méthodes orientées Données : ■ Les principales méthodes ■ Les trois axes de modélisation ■ Le concept Merise Présenter : ■ Les principales méthodologies objet ■ Les trois axes de modélisation objet ■ La technique de modélisation objet Comparer ces méthodes à la modélisation objet Evaluation ■ Proposition d’étude de cas Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-1 2 Analyse et conception orientées objet Rappels Modèle de développement Analyse Conception Codage Test Maintenance Analyse Conception Codage “Object-oriented design defines a notation and process for constructing complex software systems, and offers a rich set of logical and physical models with which we may reason about different aspects of the system...” Grady Booch “Object-oriented modelling and design is a new way of thinking about problems using models organized around real-world concepts.” James Rumbaugh Apport de l’objet 2-2 ■ Même sémantique en Analyse et conception et en codage ■ Modularité et réutilisabilité favorisent tests et maintenance Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Analyse et conception orientées objet Méthodes de développement classiques Un des principaux problèmes en développement classique (5 phases : analyse, conception, codage, test, maintenance) est que chaque étape utilise des notations et descriptions spécifiques. Ces différences radicales font que les modifications sont souvent difficiles du fait des changements de sémantique d’une phase à l’autre. Les méthodes objet sans changer la succession des phases de développement vont permettre, comme nous allons le voir, de réduire le temps de développement et de faciliter les résolutions de problèmes tardifs. Analyse orientée objet ■ Trouver les objets potentiels et les caractériser. ■ Construire un modèle abstrait en conservant une stricte correspondance entre ce modèle et les objets réels. Conception orientée objet ■ Rechercher la structure du système (conception système) puis du logiciel (conception logicielle). Programmation, test et maintenance ■ Implémenter avec un langage supportant objets, classes et messages à la place des traditionnelles fonctions. ■ Réutiliser massivement le code existant. ■ Tester les modules (objets). ■ Maintenir des librairies d’objets modulaires plus facilement compréhensibles par des personnes tierces. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-3 2 Caractéristiques des méthodologies Trois axes de modélisation Fonctionnelle (Flux/Processus) Dynamique (Scénario, Etat/Transition) Statique (objets) 2-4 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Caractéristiques des méthodologies Trois axes de modélisation Modèle Statique Le modèle statique, aussi appelé modèle objet, décrit la structure des objets dans le système tel que leurs identités, leurs données, leurs services et les relations entre les objets. C’est une représentation conceptuelle et graphique des données et des services essentiels pour une application, sous la forme de diagrammes de classes d’objets. On parle de modèle Entité-association évolué. Modèle Dynamique Le modèle dynamique décrit les parties du système où le temps et le séquencement des opérations sont d’importance. Il est représenté graphiquement avec des diagrammes à états. Chaque diagramme représente les états et les événements possibles pour une classe dans le système. Il existe une référence entre le modèle dynamique et les autres modèles. Les actions dans les diagrammes à états correspondent aux fonctions du modèle fonctionnel et les événements dans le scénario deviennent des services dans les classes du modèle statique. Modèle Fonctionnel Le modèle fonctionnel décrit ce que fait le système sans se soucier des contraintes temporelles ou événementielles. Il est représenté graphiquement par des diagrammes de flux de données où l’on décrit les fonctions et leurs entrées/sorties sans décrire leurs mécanismes. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-5 2 Méthodes orientées traitements Les méthodes de décompositions fonctionnelles SA/SD : Structured Analysis/Structured Design SA-RT : Structured Analysis-Real Time SADT : Structured Analysis Design Technique Les axes de Modélisation Fonctionnelle (Flux/Processus) Dynamique (Etat/Transition, Scénario) 2-6 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées traitements Rappels Historiquement, les méthodes commencent dans les années 1960 avec des approches simples comme les réseaux de Pétri, les méthodes orientées traitements, puis les méthodes orientées Données (EntitéRelation ou Entité-Association). Les méthodes de décompositions fonctionnelles sont certainement les plus utilisées à l’heure actuelle en informatique technique et scientifique. Elles reposent principalement sur les diagrammes de flux de données. Il n’y a pas de standard mais il existe une littérature abondante associée à des auteurs tels que Yourdon, DeMarco, Mellor. Elles travaillent particulièrement l’axe fonctionnel et l’axe dynamique. Alors que la méthode SA/SD se concentre sur l’axe fonctionnel, la méthode SA-RT ajoute réellement l’axe dynamique. SADT réalise la fusion des deux premières méthodes. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-7 2 Méthodes orientées traitements Décompositions fonctionnelles successives Fonctionnelle (Flux/Processus) Dynamique (Scénario,Etat/Transition) Décomposition de l’activité Technico-commerciale tion ven nter Ingénieur Commercial d’i de Système an em D n i Ou form ivi e de Gérer l’activité Technico-Commerciale Su n atio es ns po Ré D at e nt em clie d an D ou no Formation 2-8 Client Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées traitements Décompositions fonctionnelles successives Dans un premier temps, on définit le domaine d’étude en recherchant les acteurs externes du système générant les entrées et recevant les sorties. Une décomposition du système sera exécutée en utilisant des diagrammes de flux successifs jusqu’à l’obtention de la forme la plus simple que l’on pourra coder facilement. Tout au long de cette décomposition, nous retrouverons les entrées et les sorties définies au départ. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-9 2 Méthodes orientées traitements Décompositions fonctionnelles successives Première décomposition Système Demande d’intervention Prendre rendez-vous Oui ou non Seconde décompositon Système Processus "Prendre rendez-vous" Agenda Demande Vérifier d’intervention Da te OK Mettre à jour 2-10 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Oui ou Non 22 2 Méthodes orientées traitements Décompositions fonctionnelles successives Dans notre exemple, nous pouvons réaliser une première décomposition en représentant une fonction Prendre rendez-vous ayant une demande d’intervention en entrée et la réponse Oui ou Non en sortie. Il est encore possible de décomposer cette fonction pour définir son fonctionnement. Nous pouvons décomposer la fonction Prendre rendez-vous en sous-fonctions. La sous-fonction Vérifier compare la date de demande d’intervention avec un système de stockage de données appelé Agenda. La flèche en pointillé représente un flux de contrôle qui sera une valeur booléenne déclenchant, si elle est vérifiée, la fonction Mettre à jour. Cette fonction pourra avoir un accès en lecture/écriture sur le système de stockage de données et générer la sortie Oui ou Non. Il est possible dans cette étape de développer ces fonctions simples en les codant à l’aide d’un langage informatique ou de pseudo-code. Certaines méthodes d’analyse structurée proposent une représentation des systèmes de stockage de données sous la forme d’EntitésAssociations. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-11 2 Méthodes orientées traitements Méthodes orientées Traitements : modélisation dynamique Fonctionnelle (Flux/Processus) Dynamique (Scénario, Etat/Transition) Diagramme d’états Agenda fermé Date Agenda ouvert 2-12 Lecture base Mise à jour agenda si date Ok Envoyer message Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées traitements Méthodes orientées Traitements : modélisation dynamique On peut faciliter la phase de codage en effectuant une représentation dynamique du processus sous la forme d’un diagramme d’états. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-13 2 Méthodes orientées Données Principales méthodes Les méthodes Entités-Associations Chen Bachman SSADM Merise Les trois axes de Modélisation en orienté Données Fonctionnel (Flux/Processus) Dynamique (Opérations) Statique (Donnée) 2-14 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées Données Principales méthodes Merise est une méthode surtout utilisée en informatique de gestion. Elle est bien implantée en France, son pays d’origine. SSADM peut être considérée comme sa soeur anglo-saxonne. Trois axes de modélisation Modèle Statique Le modèle statique, aussi appelé modèle de données, décrit la structure des données dans le système et leurs associations. C’est une représentation conceptuelle et graphique des données et de leurs liens dans une application sous la forme de diagrammes d’Entités. Modèle Dynamique Le modèle dynamique décrit les parties du système où le temps et les événements sont à prendre en compte. Il est représenté graphiquement sous la forme de modèles organisationnels. Chaque diagramme représente le séquencement des opérations entre les fonctions. Modèle Fonctionnel Le modèle fonctionnel décrit ce que fait le système sans se soucier des contraintes temporelles. Il est représenté graphiquement par des diagrammes de traitement où l’on décrit les fonctions, leurs entrées/sorties et leurs opérations sans aborder leurs mécanismes. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-15 2 Méthodes orientées Données : Merise Le concept Merise Niveaux Données Traitements Modèle Conceptuel de Données (MCD) Modèle Conceptuel de Traitement s (MCT) A B Conceptuel Entité 1 Association Données 1,n 1,1 Entité 2 Données Evènements Synchronisation ET Opérations Résultat C Modèle Logique de Données (MLD) Logique et organisationnel Commercial Assistante Vue réseau Entité 1 Entité 2 Modèle Physique de Données (MPD) Physique et Opérationnel Modèle Organisationnel de Traitements (MOT) Modèle Opérationnel de Traitements (MOpT) Schéma de Base de Donnée Programmes DDL 2-16 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées Données : Merise La démarche utilisée dans Merise amène à représenter divers aspects du système étudié à des points variables entre le plus concret et le plus abstrait. On parle de modélisation à divers niveaux d’abstraction. Il s’agit de hiérarchiser les préoccupations de conception à un niveau gestion, organisation et technique. Les préoccupations de gestion seront étudiées au niveau conceptuel, les problèmes d’organisation au niveau organisationnel et logique, et les préoccupations techniques au niveau physique. Niveau conceptuel Pour modéliser un système, il convient de l’analyser, dans un premier temps, de façon globale. Il faut se concentrer sur l’activité du système. Les fonctions sont décrites à ce niveau sans tenir compte de la manière dont elles seront réalisées. On représente le "quoi" du système en suivant les règles de gestion. Niveau organisationnel A ce niveau, on définit l’organisation à mettre en place pour atteindre les objectifs du niveau conceptuel. Cela peut être représenté par les questions "qui", "où" et "quand". Ce niveau est encore indépendant des choix techniques. Niveau technique Les moyens techniques, matériel et logiciel, nécessaires à la réalisation du projet sont proposés à ce niveau. En pratique, beaucoup de concepteurs ne travaille que dans les données pas dans les traitements. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-17 2 Méthodes orientées Données : Merise Fonctionnelle (Flux/Processus) Dynamique Statique (Données) Modèle Conceptuel de Données Département Salarié No salarié Nom salarié Prénom salarié Adresse salarié 2-18 No dép. 0,n Travaille - Titre - Grade - Date d’entrée 1,n Nb d’empl. dép. Libellé dép. Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées Données : Merise Modèle Conceptuel de Données Le Modèle Conceptuel de Données (MCD) représente un ensemble d’Entités associées par des liens et des cardinalités. Une Entité est représentée par un rectangle. Le nom de l’Entité est dans la partie haute, suivi par son identifiant souligné d’un trait puis du nom des données. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-19 2 Méthodes orientées Données : Merise Modèle Logique de Données Salarié No salarié Nom salarié Prénom salarié Adresse salarié Salarié 2-20 0,n Travaille - Titre - Grade - Date d’entrée Travaille Département 1,n No dép. Nb d’empl. dép. Libellé dép. Département Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées Données : Merise Modèle Logique de Données Le modèle conceptuel permet de traduire le langage naturel et aide à la communication mais il est encore éloigné de la rigueur nécessaire au passage à l’informatique. Le Modèle Logique de Données (MLD) est une représentation du MCD intégrant les choix d’organisation des données (hiérarchique, réseau ou relationnel). Le MLD permet de préfigurer ce que seront les temps d’accès nécessaires et les volumes occupés par la base de données. Le passage du Modèle Conceptuel de Données au Modèle Logique de Données se fait en appliquant des règles d’algorithme très simples basées sur le type de relation et les cardinalités. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-21 2 Méthodes orientées Données : Merise Modèle Physique de Données CREATE TABLE I.T.C. (No_de_salarié ID not null, Nom char(30) not null, Prénom Adresse Grade char(30) , char(120) not null, char(10) , PRIMARY KEY (No_de_salarié)); 2-22 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées Données : Merise Modèle Physique de Données Le Modèle Physique de Données (MPD) correspond à la création de la table suivant les règles d’organisation interne de la base de données avec laquelle on travaille. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-23 2 Méthodes orientées Données : Merise Fonctionnelle (Flux/Processus) Dynamique Statique (Données) Modèle Conceptuel des Traitements Agenda Demande d’intervention ET Mettre à jour agenda OK No de l’affaire Agenda à jour Pas OK Date refusée Créer dossier Dossier 2-24 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées Données : Merise Modèle Conceptuel de Traitements Le Modèle Conceptuel de Traitements (MCT) représente les événements, leurs synchronisations, les opérations et les résultats. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-25 2 Méthodes orientées Données : Merise Modèle Organisationnel des Traitements Temps I.T.C. Agenda I.C. Demande d’intervention pf1 Mise à jour agenda Agenda à jour Date refusée No de l’affaire pf3 Création du dossier Modification de la pf2 demande d’intervention Dossier créé Nouvelle demande d’intervention 2-26 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées Données : Merise Modèle Organisationnel de Traitements Le Modèle Organisationnel de Traitements (MOT) est la description dynamique du système d’information. L’opération est remplacée par la procédure fonctionnelle qui représente l’ensemble des traitements et leurs séquencements. Ce modèle décrit également les postes de travail ce qui permet de définir le flux de informations à l’intérieur de l’entreprise. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-27 2 Méthodes orientées Données : Merise Modèle Opérationnel de Traitements Niveaux Données Traitements MCD C MCT Temps I.T.C. Agenda L et O I.C. Demande d’intervention Mise à jour agenda MLD Agenda à jour Date refusée No de l’affaire Création du dossier Modification de la Dossier créé CREATE TABLE I.T.C. P et O (No_de_salarié ID not null, Nom char(30) not null, Prénom char(30) , Adresse char(120) not null, Grade char(10) MOpT , PRIMARY KEY (No_de_salarié)); 2-28 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Méthodes orientées Données : Merise Modèle Opérationnel de Traitements Le Modèle Opérationnel de Traitements (MOpT) est le développement de l’application dans un langage informatique. Il doit prendre en compte la définition des tables et la représentation dynamique du système. La méthode reste vague sur cette phase et la dichotomie entre les données et les traitements dans les méthodes orientées Données n’en favorise pas le développement. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-29 2 Principales méthodologies objet Historique des méthodes 1986 BOOCH, GOOD 1987 HOOD 1988 Shlaer/Mellor 1989 Coad/Yourdon Objectory, OMT, CRC 1990 1991 SYNTHESIS, MOOD, BOOCH SOMA, OOM, OSA, OSDL 1992 1993 OOJSD, ORCA, FUSION, SYNTROPY, BOOCH ORCA, OBA Principales méthodes 2-30 ■ OOA/OOD (Object Oriented Design) - Coad Yourdon ■ BOOCH - Booch ■ HOOD (Hierarchical Object Oriented Design) ■ OOA/D (Object Oriented Analysis) - Shlaer et Mellor ■ OMT (Object Modeling Technique) - Rumbaugh ■ Objectory - Jacobson Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Principales méthodologies objet C’est dans les années 1980 que Booch introduit une nouvelle approche. Coad-Yourdon, Rumbaugh avec OMT (Object Modeling Technique) ainsi que de nombreuses méthodes européennes apparurent, alors. OOA/OOD (Coad-Yourdon) Méthode très généraliste, plus adaptée à l’analyse qu’à la conception. BOOCH (Grady Booch) La partie conception est plus développée que la partie analyse. Une très bonne recherche au niveau de l’héritage et des classes. HOOD (Hierarchical Object Oriented Design) Méthode plus temps réel avec une lacune au niveau de l’héritage et l’absence de méthode réelle pour l’analyse. Elle a été normalisée par un groupe d’utilisateurs. OOA/D (Shlaer et Mellor) Méthode séparant l’analyse en trois phases, comme la méthode OMT mais elle s’apparente plus à une extension d’une méthode Entité Relation. OMT (Object Modeling Technique de Rumbaugh) Méthode d’analyse et de conception basée sur les trois axes : une modélisation statique des objets, une modélisation dynamique des états et des évènements, et une modélisation fonctionnelle. C’est une méthodologie très complète et bien diffusée. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-31 2 Principales méthodologies objet Principales méthodes ■ UML (Unified Modeling Language - Rumbaugh, Booch et Jacobson) ■ FUSION - Coleman ■ ROOM - Real time Object Oriented Modeling ■ CLASSE-RELATION - Desfray ■ Merise objet Méthodes en cours de stabilisation : beaucoup d’évolutions sont encore en cours. 2-32 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Principales méthodologies objet Principales méthodes UML (Unified Modeling Language) Langage support de modélisation objet : les concepts sont issus des travaux communs de Booch, Rumbaugh et Jacobson. Le langage a la vocation d’être utilisé (formalisme) dans le cadre d’autres méthodologies. FUSION Née dans les laboratoires d’HP, cette méthode permet de couvrir les phases d’analyse, de conception et d’implémentation. FUSION guide l’utilisateur tout au long du processus de développement. ROOM Cette méthode est préconisée pour les applications Temps Réel, privilégiant les aspects structures et dynamiques. Trois graphes d’héritage complémentaires sont proposés : un pour la structure, un pour le comportement et un dernier pour les données. Cette approche est très proche de LDS 92, langage de conception utilisé dans les TELECOMS. CLASSE-RELATION Méthode d’origine française utilisée par l’outil Objecteering de Softeam, elle propose trois types de modèles : le modèle objet (notion de schéma), le modèle opératoire (service offert par les classes) et le modèle dynamique. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-33 2 Principales méthodologies objet Quelques notations FUSION Employé S&M Employé Classe OMT Employé Salaire : réel *Matricule Salaire Attributs Salaire Augmenter(N) Opérations Donner Prime (Montant) Héritage Agrégation Association 2-34 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Principales méthodologies objet Quelques notations Les notations des différentes méthodes sont proches, mais certains différences existent comme : ■ En Fusion, les opérations apparaissent dans un autre schéma que le modèle objet : ce sont les graphes d’interaction. ■ En Fusion, la représentation de l’agrégation utilise des blocs imbriqués. ■ Certains symboles de BOOCH sont utilisés en OMT avec une signification différente. Dans la suite du chapitre, nous utiliserons le formalisme d’OMT. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-35 2 Principales méthodologies objet Positionnement des méthodologies orientées objet BOOCH HOOD Axes Statique oui Dynamique oui oui Fonctionnelle OOA/ OOD OMT oui oui oui oui oui oui oui FUSION ROOM Classe Relation Axes Statique oui Dynamique oui Fonctionnelle oui 2-36 OOAD /S &M oui oui oui oui oui Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Principales méthodologies objet Positionnement des méthodologies orientées objet En application du modèle objet, certaines méthodes se voient complétées pour se spécialiser dans tel ou tel domaine. Les cases blanches du tableau ne veulent pas forcement dire qu’un axe n’est pas pris en compte dans telle méthode mais plutôt que cet axe ne ressort pas comme un point fort de la méthode. OMT semble être la méthodologie objet la plus diffusée et la plus utilisée, en particulier en France. Ceci est certainement dû en partie à la globalité de la méthode et à l’existence de plusieurs outils du Génie Logiciel la supportant. Alors qu’OMT est plutôt orientée analyse, Booch offre des éléments intéressants en phase de conception. UML intègre ces deux points forts pour donner toute la puissance d’une méthode objet. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-37 2 Présentation d’OMT La méthode OMT Statique Analyse Fonctionnelle Dynamique Scenario Flux d’événement Etat/transition Statique Conception Réalisation Contexte Flux de données Fonctionnelle Dynamique Classe Données Services 2-38 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Présentation d’OMT La technique de modélisation objet OMT (Object Modeling Technique) intervient sur les trois axes dynamique, statique et fonctionnel mais également sur trois niveaux analyse, conception et au niveau de la classe informatique que l’on peut aussi appeler le niveau physique. La méthode OMT consiste en un affinage successif par niveau en ajoutant des considérations systèmes, techniques et physiques liées à l’environnement et aux langages informatiques utilisés pour la mise en oeuvre de l’application ; le résultat final consiste en des classes définies avec leurs données typées et le développement des services associés. Pour modéliser les classes et les objets, OMT utilise un symbolisme qui lui est propre. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-39 2 OMT : Modélisation Statique classe objets (Personne) Marie Durant 31 Personne Prénom Nom (Personne) Jean Martin 28 Age courir lire se présenter (Personne) Lazare Garcin 30 Société Nom Adresse 2-40 Données Travaille pour Salaire Titre Services . Personne Prénom Nom Age courir lire se présenter Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 OMT : Modélisation Statique objets Nous pouvons définir un objet comme étant une abstraction d’une chose existante, fournissant une base pratique pour le développement d’une application informatique. Il n’existe pas une seule façon de représenter un problème en objets puisque la décomposition dépend de notre jugement et de la nature du monde que l’on cherche à décrire. Chaque objet possède une identité propre lui permettant de le distinguer des autres. Cela veut dire que les objets peuvent être différenciés uniquement parce qu’ils existent. Un objet dépend d’une classe et nous pouvons dire qu’un objet est une instance de classe. Le but de la modélisation objet est la description des objets. Un objet en OMT est représenté par un rectangle aux coins arrondis. Le nom de la classe est écrit entre parenthèses et en caractère gras en haut du rectangle. Classes Une classe est la description d’un groupe d’objets qui ont la même structure de donnée, des services communs, des liens communs avec d’autres objets et une sémantique commune. La classe permet un niveau d’abstraction supérieur qui donne sa puissance et sa capacité de généralisation à la modélisation. La classe en OMT est représentée par un rectangle divisé horizontalement en trois parties : le nom de la classe est écrit en gras dans la partie haute du rectangle, les noms des données sont écrits dans la partie centrale et les services dans la troisième. Diagramme de classes Pour représenter le cas général dans la modélisation d’un système, les classes sont reliées entre elles par des liens et associations sous la forme d’un diagramme de classes. Il existe différents types de liens pour représenter les différents concepts. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-41 2 OMT : Modélisation Statique conduit Personne role 1 Voiture Association simple binaire role 2 Développement Langage Association ternaire Programmeur Les cardinalités Personne Personne . Personne Personne Personne 2-42 1+ 1-5,8 Voiture Exactement une (une) Voiture Zéro ou plus (plusieurs) Voiture Zéro ou un (optionel) Voiture Un ou plus Voiture Spécifié numériquement Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 OMT : Modélisation Statique Associations en OMT En OMT, une association est représentée par une ligne entre classes et un lien par une ligne entre objets. Le nom de l’association est écrit en italique mais il peut ne pas être précisé dans le cas d’une association unique ayant une signification évidente entre deux classes. Il est préférable, dans la mesure du possible, de disposer les classes de la gauche vers la droite pour faciliter la lecture. Types d’associations Les associations peuvent être binaires, ternaires ou d’ordre supérieur. Dans la majorité des cas, nous avons des associations binaires ou qualifiées ; les associations d’ordre supérieur sont à éviter à cause de leur complexité. Cardinalité La cardinalité permet de spécifier le nombre possible d’instanciations d’une classe pour l’objet qui lui est associée. Dans un diagramme de classes, la cardinalité est indiquée par l’ajout de symboles spécifiques à la fin des lignes représentant les associations. Une ligne simple signifie une association une à une, une boule noire signifie plusieurs (zéro ou plus), une boule blanche traduit l’optionnel (zéro ou une). Il est également possible d’indiquer le nombre exact ou de donner une fourchette de valeurs. Il n’est pas nécessaire de ce soucier outre mesure de la cardinalité au début de la modélisation, le plus important étant, dans un premier temps, la définition des objets, des classes et des associations. Il faudra par la suite s’y intéresser car : ■ une sous-estimation peut réduire la flexibilité de votre application, ■ une sur-estimation peut alourdir l’application en forçant des recherches supplémentaires. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-43 2 OMT : Modélisation Statique Personne employé employeur Société Association lien donnée Travail Titre Salaire Paragraphe Phrase Agrégation Personne Nom Prénom Age se présenter {abstrait} Anglais Allemand se présenter 2-44 Héritage ... se présenter Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 OMT : Modélisation Statique Association lien donnée Un lien relie deux ou plusieurs objets. Une association décrit un groupe de liens qui ont une structure et une sémantique commune. Un lien données (link attribute) est une propriété des liens dans une association. Une association avec des cardinalités plusieurs à plusieurs (points noirs des deux cotés) entraîne le plus souvent des liens données. Il est parfois utile de modéliser une association sous la forme d’une classe où chaque lien sera une instance de cette classe. Pour des associations avec des cardinalités une à une ou une à plusieurs, il est possible d’inclure les données du lien donnée dans la classe opposant la cardinalité 1. Il n’est pas conseillé d’inclure les données des liens données dans les classes au niveau de la modélisation car ceci réduit la souplesse du modèle qui sera à refaire si l’on décide de modifier les cardinalités. Dans notre exemple, la relation entre la classe Personne et la classe Société est Travail et ce lien peut contenir le Titre et le Salaire. Agrégation Nous pouvons définir la relation d’agrégation comme étant le rattachement d’une classe composant à une classe composite. L’agrégation se dessine comme une association avec un petit losange à la fin de la relation du côté de la classe groupe. Dans notre exemple, nous présentons un paragraphe qui est composé de phrases. Héritage L’héritage est une abstraction qui permet le partage de propriétés communes entre classes tout en préservant leurs différences. C’est un des concepts fondamentaux de l’orienté objet. L’héritage permet l’organisation des classes en structure hiérarchique et facilite la réutilisation de code dans les phases de développement. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-45 2 OMT : Modélisation Statique Conseils pratiques 2-46 ■ Consulter les experts du domaine à modéliser ■ Comprendre le problème avant de se jeter dans la construction des classes et des relations ■ Garder le modèle aussi simple que possible ■ Porter une grande attention dans le choix des noms ■ Décomposer en associations binaires autant que possible ■ Ne pas trop se soucier des cardinalités au début de la modélisation ■ Essayer d’éviter trop de niveaux d’héritage ■ Faire attention aux associations de cardinalité 1 à 1 pouvant causer des problèmes au niveau d’une base de données ■ Avoir recours aux cycles auteur-lecteur tout au long du processus de modélisation ■ Documenter son modèle : dictionnaire de données. Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Notes Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-47 2 OMT : Modélisation Dynamique Exemple d’une voiture automatique Personne conduit Démarreur Voiture Transmission Frein Accélérateur Diagramme de classes ■ 2-48 Scénario ■ Le conducteur tourne la clé de contact ■ Le démarreur vérifie si la transmission est à N ■ La transmission renvoie OK ■ La voiture démarre ■ Le conducteur met le levier de vitesse sur D ■ Le conducteur appuie sur l’accélérateur ■ L’accélérateur indique à la transmission qu’il accélère ■ Le conducteur appuie sur le frein ■ Le frein indique à la transmission qu’il freine Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 OMT : Modélisation Dynamique Evènement Un modèle objet décrit les objets, leurs données et leurs liens possibles dans un système. La valeur des données et des liens d’un objet à un moment donné est appelée son état. Les objets s’appellent les uns les autres et modifient leurs états respectifs. Un message d’un objet à un autre s’appelle un événement. Scénario Un événement est quelque chose qui arrive à un certain moment. C’est une façon de transmettre de l’information d’un objet à un autre. Une suite d’événements qui se produisent pendant une exécution réelle ou imaginaire d’un système peut être contenue dans un scénario. Exemple ■ Etude du fonctionnement de la transmission d’une voiture automatique. ■ Il y a trois vitesses, ■ La voiture automatique ne peut démarrer que si le levier de vitesse est au point mort (sur la position N), ■ Au freinage, la boite repasse en première. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-49 2 OMT : Modélisation Dynamique Personne ■ Objectif : décrire les diagrammes états/transitions les plus importants ■ Moyen : utiliser les différents diagrammes de modélisation OMT de type traces d’événements et flux d’événements ■ Diagramme de traces d’événements Démarreur Transmission Accélérateur Frein Tourne la clé de contact Vérifie si N OK Démarré Passe sur D Appuie sur l’accélérateur Vitesse moteur Marche avant Appuie sur le frein Stop 2-50 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 OMT : Modélisation Dynamique Objectifs et moyens de la modélisation dynamique Le but de la modélisation dynamique est de décrire aussi fidèlement que possible les différents états des objets du modèle ainsi que les événements entraînant les transitions d’états. OMT propose différents outils de construction permettant de mettre en évidence les états et événements impliqués dans la dynamique du système. Diagramme de traces d’événements L’étape suivant l’écriture du scénario est l’identification des objets émetteurs et récepteurs de chaque événement. La séquence des événements échangés entre les objets identifiés peut être représentée sous la forme d’un diagramme appelé diagramme de traces d’événements (event trace diagram). En examinant une colonne particulière dans le diagramme de traces, nous pouvons voir les événements qui affectent un objet en particulier ; ce seront uniquement ces événements qui apparaîtront dans le diagramme d’état de cet objet. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-51 2 OMT : Modélisation Dynamique ■ Diagramme de flux d’événements Démarreur OK Pas OK Contact Coupe contact Démarre Ne démarre pas Frein Appuie frein Freine Passe sur D Passe sur N Personne Vérifie que N Transmission Passe sur P Passe sur R Appuie accélérateur Accélère Accélérateur 2-52 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 OMT : Modélisation Dynamique Diagramme de flux d’événements Nous aurons un diagramme de trace d’événements pour chaque scénario. Pour récapituler tous les événements entre toutes les classes, sans tenir compte de leurs ordres d’arrivée, nous pouvons construire un diagramme de flux d’événements (event flow diagram). Un diagramme de flux d’événement peut être assimilé à une version dynamique d’un diagramme d’objets. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-53 2 OMT : Modélisation Dynamique ■ Diagramme d’états/transitions Transmission levier sur R Neutre levier sur D levier sur N Marche arrière levier sur N Marche avant [Tour moteur>x] Stop Première Seconde [Tour moteur<x] 2-54 [Tour moteur>y] Troisième [Tour moteur<Y] Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 OMT : Modélisation Dynamique Diagramme d’états/transitions Un état est une abstraction de la valeur des données et des liens d’un objet. Un jeu de valeurs (suivant certaines règles) qui influent sur le comportement de l’objet donnera un état. Par exemple, on saura si l’objet transmission est dans l’état Neutre en vérifiant si certaines de ses données ont telles ou telles valeurs. Le diagramme d’états décrit les événements et les états. A la réception d’un événement, un objet qui est dans un état particulier passe dans un autre état. On appelle ce passage une transition. Les événements deviennent des services dans le modèle objet et les actions correspondent à des fonctions dans le modèle fonctionnel. Notre exemple représente le diagramme d’états de la transmission. La transmission peut être au point mort (Neutre), en marche arrière ou en marche avant. En marche avant, la transmission peut être en première, seconde ou troisième. Ces trois états sont des sous-états de l’état marche avant. Les transitions du super-état (marche avant dans notre cas) sont héritées par chacun des trois sous-états. L’événement stop qui pointe sur le super-état marche avant allant vers l’état première, indique que dans le cas d’un événement arrêt, survenant n’importe quand en marche avant, on se retrouve dans l’état première. Les informations entre crochets signifient que ce sont des conditions ; quand la condition est atteinte, il y a changement d’état. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-55 2 OMT : Modélisation Fonctionnelle ■ Diagramme de flux de données vitesse moteur choix R choix N Personne choix D marche avant Accélérateur Gérer transmission stop marche arrière point mort 2-56 Frein Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 OMT : Modélisation Fonctionnelle Diagramme de flux de données Le modèle fonctionnel spécifie le résultat d’une opération sans prendre en compte comment ou quand cette opération a été traitée. Le modèle fonctionnel est représenté graphiquement sous la forme de multiples diagrammes de flux de données (DFD : Data Flow Diagram). Un DFD fait apparaître : ■ ■ les valeurs des entrées d’une opération venant : ■ d’objets externes, ■ d’autres opérations, ■ de systèmes de gestion de données. et les valeurs de sorties. Le modèle fonctionnel montre ce qui doit être fait par le système. Les processus définis sont les services des objets. Le modèle objet nous présente les objets avec leurs données et les services (ou opérations) que l’objet peut effectuer. Le modèle fonctionnel met en évidence les fonctions ou processus qui sont mis en oeuvre en tant que services pour certains objets alors que le modèle dynamique nous informe de l’ordre dans lequel les services sont exécutés. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-57 2 Différentes étapes en analyse objet Différentes étapes d’analyse 1. Modélisation Statique Les classes, les objets, les attributs, les associations 2. Modélisation Dynamique Scénario, diagrammes de traces événements et d’états 3. Modélisation Fonctionnelle Diagramme de flux de données 4. Affinage des modèles Ajout des services, jeux de scénarios, suppression d’attributs et d’associations inutiles Tous ces modèles sont optionnels et seront plus ou moins détaillés selon le problème à modéliser. Processus ■ 2-58 Enrichir le modèle statique (objet) à l’aide des informations fournies par les modèles dynamique et fonctionnel Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Différentes étapes en analyse objet Le but de l’analyse est la reformulation et la compréhension du problème et de son domaine d’application pour permettre une conception juste et rapide. Il existe trois axes de modélisation et différentes étapes dans chacun de ces axes. Il est possible de suivre ces axes et ces étapes dans un certain ordre : 1. 2. 3. 4. Modélisation Statique (si nécessaire) ■ reformuler le problème, ■ identifier les classes d’objets et leurs attributs, ■ identifier les associations entre les objets. Modélisation Dynamique (si nécessaire) ■ préparer un scénario, ■ représenter un diagramme de traces d’événements, ■ construire un diagramme d’états. Modélisation Fonctionnelle (si nécessaire) ■ identifier les entrées/sorties, ■ construire un diagramme de flux de données. Affinage des modèles (si nécessaire) ■ ajouter les services déduits des modèles fonctionnel et dynamique au modèle objet, ■ vérifier la consistance des classes, des associations et des services, ■ créer et jouer des scénarios sur les trois modèles pour les tester. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-59 2 Approche objet et méthodes orientées Traitements Planification Analyse des besoins Analyse Conception Codage Conception système pour certaines méthodes Traitement Intégration et tests Validation du système Maintenance Planification Analyse des besoins Analyse Conception OBJET Codage Intégration et tests Validation du système Maintenance 2-60 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Approche objet et méthodes orientées Traitements Points communs avec les méthodologies Structurées Les méthodologies d’Analyse/Conception structurées sont basées sur la notion de flux de données. Elles commencent avec une représentation unique du système à construire puis divisent les fonctions complexes jusqu’à l’obtention de petits processus faciles à coder. Les méthodologies objet utilisent également les modèles dynamiques et fonctionnels. La différence majeure réside dans le fait que les méthodologies structurées mettent l’accent sur le modèle fonctionnel alors que les méthodologies objet accordent plus d’importance au modèle de Classes d’objets. Approche ascendante modulaire en orienté objet L’approche descendante par décomposition fonctionnelle limite la réalisation dans la mesure où un module n’apparaît que s’il est initialement prévu dans la fonction plus générale. L’approche objet grâce à l’héritage est intrinsèquement ascendante dans la mesure où on part des principaux objets et c’est seulement après que l’on construit les objets plus complexes (librairies d’objets etc...) Approche d’analyse proche du codage Les méthodes orientées objet réduisent par ailleurs la distance qui peut exister entre le monde réel et le modèle du système (codage et représentation interne). En effet, les langages de programmation et les bases de données orientées objet implémentent directement le modèle issu de l’analyse. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-61 2 Approche objet et méthodes orientées Données Planification Analyse des besoins Analyse Conception Codage MERISE Intégration et tests Validation du système Maintenance Planification Analyse des besoins Analyse Conception Codage OBJET Intégration et tests Validation du système Maintenance 2-62 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Approche objet et méthodes orientées Données Symbolisme emprunté aux méthodes Entités Associations Les méthodologies objet sont des formes avancées des méthodologies Entité-Associations. Elles utilisent un symbolisme similaire en y ajoutant les concepts orientés objet tels que l’héritage, le polymorphisme ou l’abstraction. La modélisation objet englobant les données et les services est également plus facile à comprendre et à lire. Dichotomie entre données et traitements L’approche Entité-Association réalise une nette dichotomie entre données et traitements : entre les modèles de données et de traitement il n’y pas beaucoup de points communs. Ceci complique considérablement le cycle de développement particulièrement dans les phases d’intégration et de validation. Par exemple, en Merise, on s’exprime en terme d’attribut, d’entité, d’association pour les données alors que l’on parle d´événements ou de synchronisation pour les traitements. L’approche objet donne lui un cadre homogène pour l’analyse simultanée des données et de leurs comportements. Points forts de l’analyse objet Dans un cycle de développement, l’approche objet présente les avantages suivants : 1. réduire la distance entre le modèle conceptuel issue de l’analyse et les besoins des utilisateurs, 2. permettre facilement les méthodes de type RAD (Bottom-Up), 3. regrouper l’analyse des données et des traitements en renforçant les liens entre les aspects statique et dynamique, 4. simplifier les transformations entre l’analyse et l’implémentation, ce qui a l’avantage de réduire les distorsions finales entre les besoins et le système d’information. Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-63 2 Notes 2-64 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 22 2 Exercices Etude de cas d’une station service Enoncé Un système automatisé a pour mission de contrôler la fourniture de carburant par les différentes pompes de la station, de gérer les paiements et de surveiller le niveau des réservoirs. Pour qu'un client puisse utiliser une pompe en self-service, le gérant doit avoir mis la pompe en service. Quand une pompe est mise en service, l'affichage est remis à 0, le moteur de la pompe démarre, l'embrayage étant désactivé. Lorsque la gâchette du pistolet est enclenchée, l'embrayage de la pompe est activé afin de délivrer le carburant ; dès qu'elle est relâchée, l'embrayage est libéré, interrompant la fourniture. Quand le pistolet est replacé sur la pompe, la fourniture est terminée; la pompe est alors désactivée ; de nouvelles pressions sur la gâchette sont inopérantes. Après un certain temps, le moteur de la pompe est arrêté, à moins qu'un nouveau client arrive. Pour pouvoir être à nouveau utilisée, une pompe doit être autorisée par le gérant. Cette autorisation peut intervenir quand le client précédent a payé sa fourniture. Un système de mesure émet une impulsion chaque fois qu'1/100 de litre de carburant est fourni. L'afficheur de la pompe indique le prix du litre, la quantité fournie et le montant correspondant. Il y a 2 types de pompes : ■ la pompe ordinaire permet au client d'acheter la quantité qu'il souhaite, Méthodes objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 2-65 2 Exercices ■ la pompe à pré-sélection permet au client de choisir un montant ; la fourniture s'arrête automatiquement lorsque la limite choisie est atteinte (en conception, on ne traitera que la pompe ordinaire). Toute fourniture donne lieu à une transaction ; celle-ci est affichée jusqu'à ce que le client paie. Le paiement peut se faire en liquide, par carte de crédit ou par chèque. Un client peut demander un reçu. Si un client part sans payer, l'opérateur doit enregistrer le numéro minéralogique du véhicule. A la fin de la journée, toutes les transactions sont archivées. Durant la journée, les transactions sont gardées dans un enregistrement journalier. Si le niveau d'essence d'un réservoir est inférieur à 4% de sa capacité, toutes les pompes reliées à ce réservoir passent hors service. Cette information est détectée lors de la mise en route de la pompe. L'ensemble des transactions est accessible et visualisé par l'utilisateur du système de gestion. Elaboration du modèle objet avec l'outil ObjectPartner Traduire l'énoncé précédent sous forme d'un modèle objet et y appliquer les opérations permettant d'exécuter le scénario de livraison d'essence : 2-66 ■ Lancer l'éditeur de modèle objet par la commande oedit, ■ Identifier les classes du modèle objet, ■ Identifier les opérations de toutes ces classes afin de répondre aux exigences des besoins exprimés ci dessus, ■ Lancer le vérificateur par la commande check du menu Tools. Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Développement orienté objet 3 Objectifs ■ Passage de l’analyse à la conception ■ Présentation de la programmation orientée objet ■ Présentation des langages orientés objet ■ Présentation du langage C++ ■ Présentation de Java ■ Présentation du CASE ■ Liste des principaux outils orientés objet ■ Présentation d’un AGL orienté objet Evaluation ■ Génération de code C++ avec un Atelier de Génie Logiciel Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-1 3 Passage de l’analyse à la conception Système Sous-système Analyse/Conception . Modélisations : objet Dynamique Fonctionnelle . Conception système . Conception logicielle Programmation 3-2 Base de données Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Passage de l’analyse à la conception Rappel sur l’analyse orientée objet Dans la phase d’analyse, on s’intéresse seulement au système du point de vue de ses missions, sans se soucier de la solution technique qui sera retenue. On se focalise sur les objets du domaine étudié : ■ Formulation du problème, ■ Modélisation des objets : identification des objets, des classes, des associations, des attributs, organisation de l’héritage et regroupement en modules, ■ Modélisation dynamique : description des scénarios et diagrammes d’état, ■ Modélisation fonctionnelle : diagramme des flots de données. Conception système Le but est de rechercher une solution informatique et de produire une architecture du système. Les étapes sont : ■ Décomposer le système en sous-systèmes, ■ Identifier les problèmes de concurrence, ■ Allouer les sous-systèmes aux composants matériel et logiciel, ■ Décider comment allouer et gérer les stockages, ■ Décider de l’implémentation du contrôle, ■ Définir le cadre de la conception détaillée. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-3 3 Passage de l’analyse à la conception Conception du logiciel ■ Combiner les trois modèles ■ Concevoir l’implémentation des opérations ■ Optimiser le modèle objet ■ Implémenter les automates ■ Généraliser ■ Implémenter les relations ■ Faire un choix de conception Implémentation ■ Choix d’un langage en principe orienté objet comme C++ ou Smalltalk ■ Persistance des objets dans l’application : ■ 3-4 Si oui, utilisation d’un SGBD Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Passage de l’analyse à la conception Conception du logiciel Le but est de produire une implémentation informatique du système indépendante de tout langage, d’accroître le niveau de détail, d’implémenter les opérations définies lors de l’analyse au moyen d’opérations plus élémentaires, d’introduire de nouvelles classes plus techniques. Les principales tâches en matière de conception du logiciel sont récapitulées dans le tableau ci-contre. Implémentation Le choix d’un langage orienté objet n’est pas une obligation après une analyse objet bien que cela soit assez naturel. Le passage de la conception à l’implémentation passe par les étapes suivantes : ■ définition des classes, ■ création des objets, ■ appel des opérations, ■ héritage, ■ implémentation des associations. L’autre problème est la persistance car les données ne survivent pas à l’exécution du programme, sauf lorsque le programmeur donne des instructions explicites pour les sauvegarder dans des fichiers. Dans les bases de données, la persistance est en revanche systématique. Nous verrons qu’il existe plusieurs façons d’aborder le problème de la persistance des objets. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-5 3 Caractéristiques des langages orientés objet ■ 3-6 Langage de programmation orienté objet ■ Types abstraits de données (A.D.T/Abstract data type) ■ Aptitude à la gestion des héritages ■ Aptitude au polymorphisme Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Caractéristiques des langages orientés objet Les langages orientés objet sont nombreux et pas toujours concurrentiels. Dans la plupart des cas, ils appartiennent à l’une des deux familles que l’on va considérer plus loin, et donc répondent à un besoin spécifique. Cependant, chacun de ces langages intègre les éléments suivants : 1. aptitude à fournir des types abstraits de données (ADT), 2. aptitude à l’héritage simple et multiple, 3. aptitude à gérer le polymorphisme (par dynamicité ou virtualité). Les langages ne répondant pas à ces spécifications ne peuvent pas être considérés comme des langages objet. Nous allons voir par la suite un nombre important de ces langages. Il s’agit simplement de fournir un panorama des langages objet, et non une liste exhaustive. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-7 3 Types abstraits et identité d’objet ■ ■ ■ 3-8 Type abstrait : ■ Données ■ Méthodes ■ Encapsulation. Typage : ■ Statique : contrôle à la compilation ■ Dynamique : type connu seulement à l’exécution. Identité d’objet : ■ Le tout objet dans les langages purs avec la notion d’identifiant ■ Simple pointeur dans les langages hybrides pour les instanciations de classes Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Types abstraits et identité d’objet Méthodes et encapsulation La principale caractéristique des langages objet est de supporter des types abstraits de données (à l’aide des classes). Les services qui caractérisent un type abstrait sont appelées fonctions ou méthodes. Les types abstraits cachent données et méthodes par des opérations dont l’utilisateur ne perçoit que l’interface appelée aussi signature. Le type abstrait doit implémenter par ailleurs, l’encapsulation qui permet de cacher les données privées du type abstrait, ne laissant visible à l’utilisateur que les interfaces. Typage des données d’un objet Dans les langages objet, le typage est soit statique, soit dynamique, soit les deux. Un typage statique signifie que le type de la variable est déterminé à la compilation : c’est le cas par exemple, de C++ et de Eiffel. Un typage dynamique signifie que le langage ne fait une identification de type qu‘à l’exécution : on trouve dans cette catégorie Smalltalk et Objective C. Le typage statique présente l’avantage d’un contrôle des types rigoureux. Le langage Java a l’avantage de posséder à la fois les caractéristiques des typages dynamique et statique. Identité d’objet L’identifiant au niveau objet est un pointeur en mémoire qui permet de l’identifier d’une façon unique : c’est un simple pointeur dans les langages hybrides directement manipulable par l’utilisateur alors qu’il est généré automatiquement dans les langages purs. Pour les langages purs, on parle de tout objet ce qui signifie que toute donnée est un objet et possède donc un identifiant. L’implémentation des types simples dans les langages purs est cependant simplifiée pour éviter l’overhead à l’exécution. Les langages purs sont destinés à des applications très spécifiques (systèmes experts, I.A, représentation des connaissances). Malgré l’overhead généré lors de l’exécution, ils sont conceptuellement très puissants. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-9 3 Polymorphisme : staticité, dynamicité, virtualité ■ Polymorphisme et liens Méthode 1 Méthode 2 Message Switch ? Méthode 3 Méthode 4 ■ 3-10 Dynamicité des liens ■ Extrême souplesse d’utilisation ■ Moins rapide à l’exécution ■ Explicite (Eiffel et C++) ou implicite (Java, Smalltalk) Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Polymorphisme : staticité, dynamicité, virtualité Polymorphisme par les liens Comme nous l’avons vu, le polymorphisme est la possibilité, lorsque l’on envoie un message à un objet, de générer cet envoi non pas à l’objet tel qu’il est vu, mais tel qu’il existe. Dans la mesure où ceci revient à effectuer un appel de fonction (à un niveau ou à un autre), on en arrive à parler des liens. Les liens sont le relais qui est effectué entre l’appelant ou l’appelé. Dans les langages "conventionnels", les liens sont dits statiques. Dans les langages objet, ils sont dynamiques ou statiques avec virtualité. Liens statiques Les liens statiques sont des liens créés lors de la compilation. Dès qu’un appel à une fonction est généré, il lui est substitué le saut permettant le lancement du code auquel il est associé. Liens dynamiques Les liens dynamiques permettent d’effectuer le choix de l’appel au moment de l’exécution. Ils sont l’apanage des langages "purs" et présentent l’avantage de gérer le polymorphisme de façon transparente et simple. Malheureusement, ce principe des liens dynamiques possède un gros défaut : la lenteur du code qu’il génère. En effet, le choix de cet appel sera généré après un nombre parfois conséquent d’examens des champs de l’objet concerné et la mise en oeuvre d’un raisonnement parfois complexe (surtout dans le cas des champs à attributs complexes). L’overhead peut alors devenir très important. Parmi les langages objet utilisant le principe des liens dynamiques on peut citer : Java, Objective C, Smalltalk, Simula, CLOS et C++/Eiffel (si explicitement spécifié - voir fonctions virtuelles). Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-11 3 Polymorphisme : staticité, dynamicité, virtualité ■ Liens statiques et virtualité Père Meth_Norm Meth_Virt Fils Petit-fils Meth_Virt Meth_Virt Meth_Virt Meth_Norm 3-12 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Polymorphisme : staticité, dynamicité, virtualité Virtualité et liens statiques : polymorphisme La virtualité est un moyen utilisé en plus des liens statiques pour permettre la gestion du polymorphisme en liaison statique. Ceci est réalisé par un jeu de pointeurs et d’offset (transparents à l’utilisateur) qui sont implantés lors de la compilation. Lors d’un envoi de message, il suffit alors de se référer à une table pour se rediriger sur le code à lancer. L’overhead impliqué par cette méthode est très faible (une simple indirection en C++) et permet d’accéder au polymorphisme. Le code fourni peut alors être très rapide (dépendant du langage). De plus cette virtualité peut être gérée de deux manières : a. Implicitement : Cette méthode de gestion implique la virtualité au sein même du langage. Elle est implicite et donc transparente à l’utilisateur. C’est le cas de SmallTalk, Objective C et Java. b. Explicitement : Cette méthode n’implique pas le traitement de tout message en tant que sujet à virtualité.Parmi les langages objet utilisant cette méthode, on peut citer : C++, Eiffel, Object Pascal. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-13 3 Classes et métaclasses Classes ■ ■ Spécification d’objets identiques en terme de : ■ Structures de données ■ Comportement Disponible avec tout langage objet Métaclasses 3-14 ■ Constructeur de classes ■ Polymorphisme sur les méthodes de classes ■ Disponible avec certains langages : Smalltalk et Objective C dans une certaine mesure ■ Pas disponibles avec Java et C++ Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Classes et métaclasses Classes Les classes sont le moyen de prototyper les objets. Elles servent à définir le fonctionnement interne de l’objet mais aussi les interfaces de mise en oeuvre de ces objets. Métaclasses Les métaclasses sont un moyen de redéfinir par la création d’un nouveau modèle, les classes de base du langage avec lequel on travaille. Dans les langages "purs", où tout est assimilé à un objet, cela revient à pouvoir redéfinir le fonctionnement même du langage. Parmi les langages disposant des métaclasses, on peut citer Smalltalk. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-15 3 Gestion de la mémoire ■ Garbage collector ■ Permet une gestion transparente de l’allocation mémoire ■ Peut être désactivé lors de phases critiques en temps d’exécution Exemple : langage Smalltalk, Clos, Spoke, Simula, Java ■ Destruction manuelle avec la notion de destructeur Exemple : langage C++, Objective C 3-16 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Gestion de la mémoire Création des objets en mémoire La création des objets exige l’allocation d’une zone mémoire. Dans beaucoup de langages orientés objet, les objets sont créés après l’activation d’une méthode appelée parfois constructeur (Java et C++). Destruction des objets en mémoire Certains langages disposent d’un outil qui, s’il n’est pas lié à la notion d’objet, mérite cependant d’être mentionné. Il s’agit du Garbage collector ou Ramasse miettes. Cet outil permet, en standard dans tout code produit, d’effectuer un nettoyage automatique de la mémoire. Dès qu’un objet n’est plus utilisé, la mémoire qui le contenait est automatiquement libérée. La destruction manuelle s’effectue parfois par appel d’un destructeur (langage C++) qui est une fonction exécutée lors de la destruction de l’objet. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-17 3 Langages orientés objet Historique des langages Algol Lisp Flavors Simula Clos Allegro CL Modula Object Pascal Ada C Smalltalk Loops Pascal self Eiffel Distributed Smalltalk Objective-C C++ Java 3-18 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Langages orientés objet Simula, créé en 1967, est le premier langage orienté objet. Simula-1 était un langage interprété mais il a été remplacé ultérieurement par Simula-67. Cette version est souvent appelée simplement Simula. Smalltalk fut ensuite le nouveau langage majeur orienté objet. Nous reviendrons ultérieurement sur ce langage. C++ développé par Bjarne Stroustrup chez AT&T dans les années 1980 est une extension du langage C intégrant des concepts objets. Nous reviendrons sur ce langage. Objective C développé par Stepstone a connu son heure de gloire avec les stations NeXT et son système NeXTStep. En 1995, Sun a proposé un nouveau langage Java en liaison avec l’Internet. Langage orienté objet à part entière, il est disponible sur d’autres plates-formes et connaît un succès important. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-19 3 Catalogue des langages purs Les langages purs Tout objet Liens dynamiques Métaclasses Attributs complexes Métaclasses Kee Art Kool Smeci Crl Attributs simples Métaclasses Smalltalk Clos Domaines de prédilection Représentation des connaissances 3-20 Prototypage Génération d’applications Simulation Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Catalogue des langages purs Smalltalk Smalltalk est un langage pur objet semi-compilé, c’est à dire qu’un code intermédiaire est généré, puis interprété. Smalltalk reste le langage objet de référence ayant une très forte dynamicité. Les principales différences avec C++ sont : 1. il n’y a pas de contrôle de type à la compilation. 2. les objets échangent des messages d’une façon explicite. 3. réels, entiers, chaînes de caractères sont des objets dont l’identifiant contient la valeur. 4. L’environnement de développement fait partie de Smalltalk qui intégre un éditeur graphique de classes et un debugger. Le tout objet Il n’y a pas en Smalltalk de différence entre classe, objet et membre de données ou attribut. Le tout objet présente l’avantage de considérer une classe comme élément d’une classe supérieure appelée métaclasse. De plus, la hiérarchie des classes comporte une racine unique Object de qui toute classe hérite. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-21 3 Catalogue des langages hybrides Les langages hybrides Type objet et type simple Pas de métaclasse utilisateur C++ Eiffel Simula Objective C Java Domaines de prédilection Génie logiciel industriel Applications à fort taux de maintenabilité Client/Serveur 3-22 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Catalogue des langages hybrides Langage Simula Simula est un langage compilé ancien dont la syntaxe est hérité d’Algol. Les principales caractéristiques de Simula sont : 1. héritage simple et encapsulation, 2. mécanisme de fonctions virtuelles, 3. gestion automatique de la mémoire, 4. typage statique. Objective C Ce langage est une extension de C qui est fortement inspiré de Smalltalk 80. Il a été utilisé pour écrire le système NeXT. Les principales caractéristiques de Objective C sont : 1. pas de métaclasses comme en Smalltalk, 2. typage dynamique, 3. héritage simple. Langage Eiffel Conçu pour les applications scientifiques et la gestion, ce langage compilé intègre, comme Smalltalk et C++, les exceptions. Les principales caractéristiques d’Eiffel sont : 1. héritage simple, multiple et virtualité, 2. notion de packages, 3. gestion automatique de la mémoire. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-23 3 Langage C++ ■ C++ est un sur-ensemble de C ■ Les compilateurs C++ sont aujourd’hui des compilateurs natifs NATIF PREPROCESSEUR Source C++ cfront AT&T Compilateur C++ Compilateur C Fichier objet (.o) Editeur de liens Exécutable 3-24 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Langage C++ Introduction C++ est un sur-ensemble de C. Il rajoute un ensemble de fonctionnalités nouvelles pour C, et ce à deux niveaux : Niveau non orienté objet C++ autorise un nombre d’actions importantes que n’autorise pas C. Ceci donne à C++ une grande souplesse d’emploi. Par exemple, en C++, on peut associer à un même nom de fonction des codes différents. Le choix du code à lancer est effectué en fonction des arguments passés. Ceci provient de l’une des fonctionnalités les plus importantes introduites par C++ : la surcharge et le contrôle de type exercé sur tout appel à une fonction. Niveau orienté objet C++ permet de mettre en oeuvre tout ce que nous venons de voir dans le module précédent. La notion d’héritage est mise en oeuvre au travers des types abstraits de données que sont les classes (A.D.T : Abstract Data Type). Les compilateurs C++ étaient souvent des pré-processeurs de compilateurs C. Aujourd’hui, il sont natifs, effectuant directement toutes les phases de compilation, réduisant ainsi significativement le temps de compilation. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-25 3 Internet et Java Première génération ■ Basée sur HTML et un ensemble de protocoles déterminés: FTP, HTTP ■ Interactivité limitée ■ Charge serveur et réseau importantes ■ Evolutivité faible Seconde génération 3-26 ■ Bénéficie de l’acquis et ajoute la possibilité de télécharger des applications, les applets : ■ Richesse d’un langage de programmation objet dynamique, ■ Interactivité et évolutivité maximales, ■ Exploitation des ressources du poste client Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Internet et Java Première génération La première génération d’applications Internet est essentiellement basée sur HTML et les protocoles tels que FTP, HTTP, SMTP, etc... et offre souvent la seule possibilité de charger des pages HTML associées à des liens hypertextes. L’interactivité et la richesse de ces applications peuvent être améliorées en utilisant des passerelles vers d’autres applications comme les CGI, mais on retrouve alors toutes les difficultés inhérentes au déploiement d’applications traditionnelles (pas de portabilité, développement parfois complexe). De plus, l’ensemble des protocoles disponibles est limité à ceux qui sont offerts par les navigateurs, ce qui en limite l’évolutivité. Seconde génération Java apporte la capacité de télécharger de véritables applications associées à des pages HTML, et cela quelque soit la plate-forme cliente. La Machine Virtuelle Java offre non seulement l’interprétation du langage, mais également la possibilité de télé-chargement dynamique de classes. ceci permet d’étendre aisément les possibilités des applications Internet ou Intranet. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-27 3 Modèle Client/Serveur Java Applet Application Java téléchargée avec une page HTML Serveur (1) demande de page (URL) contenant une référence d’applet (2) retour page demandée + bytecode applet Client (3) exécution du code Java 3-28 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Modèle Client/Serveur Java Applet Une applet est une application écrite en langage Java qui est téléchargée et exécutée par le client. Une applet est liée à une page HTML par un tag particulier (<applet>). Elle est chargée sous sa forme compilée (le bytecode) par le poste client lorsque ce dernier charge la page HTML hôte pour la première fois. Elle est alors exécutée par la Machine Virtuelle Java, après avoir subi plusieurs vérifications destinées à s’assurer de son authenticité et de son caractère “amical”. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-29 3 Java : une plate-forme applicative universelle Machine Virtuelle ■ Abstraction des ressources matérielles et logicielles Application Java Utilise Abstraction Java Machine Virtuelle Système natif 2 Système natif 1 OS OS Fenêtrage Fenêtrage 3-30 ■ UNIX ■ Windows ■ MacOS Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Java : une plate-forme applicative universelle Machine Virtuelle Les besoins liés à l’usage d’Internet ont introduit la nécessité de créer une abstraction de tout système d’exploitation afin de rendre l’applet indépendante de l’architecture de la machine cliente sur laquelle elle s’exécute. La Machine Virtuelle est une abstraction de l’ensemble des fonctionnalités d’un système d’exploitation complexe : ■ système d’exploitation, ■ système de fenêtrage graphique, ■ exécution d’application, ■ gestion des ressources fichiers, imprimantes, réseaux, ■ multi-threading Il existe une implémentation de la Machine Virtuelle Java pour les plates-formes les plus courantes : ■ UNIX: Solaris, AIX, HP-UX, Linux, etc, ■ Windows : NT 4.0, 3.1, 95 ■ MacOS Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-31 3 Principes de fonctionnement Compilation Code source Compilateur Code compilé Bytecode Exécution Code compilé Bytecode Module de Vérification chargement local ou réseau Module d’Exécution Module de Chargement 3-32 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Principes de fonctionnement Compilation La phase de compilation permet de traduire le code source Java en un code binaire virtuel exécutable par la machine virtuelle de façon plus efficace. Il permet également d’optimiser les transferts réseau. Exécution L’exécution se déroule en trois phases: ■ Chargement du code compilé nécessaire à l’exécution, de façon dynamique. ■ Vérification de l’intégrité du code chargé. Le bon déroulement de cette phase est un préalable à la phase d’exécution. ■ Exécution du code par un interpréteur ou un compilateur à la volée, capable de traduire le bytecode Java en code binaire spécifique à la plate-forme d’exécution. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-33 3 Classe C++ class Cercle { private: int x; int y; float rayon; public: Cercle (int, int, float); void dessine (); }; Cercle::Cercle (int cx, int cy, float r) { x = cx; y = cy; rayon = r; } void Cercle::dessine() { cout << "Cercle"; } 3-34 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Classe C++ La définition d’une classe en C++ s’effectue en utilisant le mot clef class. Il faut ici souligner une notion très importante : les droits d’accès. On considère trois types de zone d’accès au sein d’une classe : ■ La zone privée (mot clef : private) Cette zone est interdite d’accès à l’environnement extérieur. Seules les méthodes de l’objet ont un droit de regard sur les données membres de l’objet. ■ La zone protégée (mot clef : protected) Cette zone n’est accessible qu’aux membres de l’objet et aux instances dérivées de la classe pour laquelle elle est définie (vu plus loin). ■ La zone publique (mot clef : public) Cette zone est libre d’accès à tous. Elle sert généralement à définir l’interface entre l’environnement et l’objet instancié de cette classe. Par défaut, une classe est privée. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-35 3 Classe Java class Cercle { Attributs private int x; private int y; private float rayon; public Cercle (int cx, int cy, float r) { x = cx; y = cy; rayon = r; } public void dessine () { System.out.println ("Cercle"); } } Méthodes 3-36 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Classe Java La définition d’une classe en Java s’effectue en utilisant le mot clef class. Comme en C++, on considère trois types de zone d’accès au sein d’une classe : ■ La zone privée (mot clef : private) Cette zone est interdite d’accès à l’environnement extérieur. Seules les méthodes de l’objet ont un droit de regard sur les données membres de l’objet. ■ La zone protégée (mot clef : protected) Cette zone n’est accessible qu’aux membres de l’objet et aux instances dérivées de la classe pour laquelle elle est définie (vu plus loin). ■ La zone publique (mot clef : public) Cette zone est libre d’accès à tous. Elle sert généralement à définir l’interface entre l’environnement et l’objet instancié de cette classe. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-37 3 Constructeur et destructeur C++ class Cercle { private: int x; int y; float rayon; public: Cercle (int, int, float); ~Cercle (); void dessine (); }; Cercle::Cercle (int cx, int cy, float r) { x = cx; y = cy; rayon = r; } Cercle::~Cercle () { cout << "Cercle détruit"; } 3-38 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Constructeur et destructeur C++ Il y a deux méthodes particulières au sein d’une classe : Le constructeur : Il porte toujours le nom de la classe. C’est une méthode qui est appelée lors de l’instanciation de l’objet. Cette méthode est facultative mais peut être surchargée. Le destructeur : Il porte toujours le nom de la classe précédé d’un ~. Il est facultatif, mais s’il existe, il doit être unique (pas de surcharge). D’autre part, un destructeur ne peut pas prendre d’arguments. Utilité des constructeurs et destructeurs Le constructeur sert pour l’initialisation de l’objet. La phase d’instanciation peut se décomposer en trois sous-phases : ■ Allocation : phase d’allocation de la mémoire nécessaire à l’objet, ■ Initialisation : phase d’initialisation des classes de base, des constantes et des références, ■ Assignation : exécution du code de la méthode constructeur (initialisations particulières ou dynamiques). Le destructeur sert pour la destruction de l’objet. Vous ne devez pas l’appeler explicitement ; c’est automatiquement fait par le système dès que l’on arrive en fin de vie de l’objet. On se sert généralement des destructeurs pour libérer la mémoire dynamiquement allouée par l’objet. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-39 3 Constructeur et destructeur Java Pas de type de retour Porte le nom de la classe public Cercle (int cx, int cy, float r) { x = cx; y = cy; initialise les attributs rayon = r; de l’objet construit } public void finalize () { System.out.println ("Cercle détruit"); } 3-40 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Constructeur et destructeur Java ■ Le constructeur est appelé au moment de la création de l’objet (l’instanciation). Sa finalité est d’initialiser cet objet en fonction de paramètres fournis par l’utilisateur. ■ Une classe peut comporter plusieurs constructeurs, qui seront différenciés par leurs paramètres. ■ Le constructeur ne possède pas de type de retour. ■ Chaque classe possède un constructeur par défaut, qui ne prend aucun paramètre. ■ Il n’y a pas de destructeur. La libération est prise en charge par le ramasse-miettes de Java. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-41 3 Allocation C++ ■ Automatique Cercle c (0, 0, 2.0); ■ Dynamique explicite Cercle *c; c = new Cercle (0, 0, 2.0); Java ■ Dynamique explicite seulement Cercle c; int x = 100; int y = 100; (1) déclaration c = new Cercle (x, y, 10.0); ... // utilisation de c (2) allocation dynamique (3) libération par le ramasse-miettes 3-42 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Allocation C++ C++ offre deux manières d’instancier un objet : ■ automatique : dans ce cas, la destruction de l’objet s’effectue lorsque son bloc de définition n’existe plus. ■ dynamique : la destruction doit être prise en charge explicitement par le programmeur. ■ (1) Une référence sur l’objet doit d’abord être déclarée. ■ (2) L’allocation de l’objet est réalisée par l’intermédiaire de new() auquel on passe les paramètres requis par le constructeur. Java Cercle c; X new c Y RAYON ... ■ (3) Il n’y a pas de libération explicite à faire. Celle-ci est effectuée par le ramasse-miettes dès que l’objet est hors de portée. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-43 3 Envoi de message C++ Cercle c (0, 0, 2.0); c.dessiner (); // ou Cercle *c = new Cercle (0, 0, 2.0); c->dessiner (); Java Cercle c = new Cercle (0, 0, 100.0); Envoi de message c.dessiner (); = invocation d’une méthode sur un objet particulier Parallèle avec l’accès aux attributs en C++ et Java Si x et y étaient des attributs publics de Cercle // allocation d’un Cercle c.x = 100; c.y = 20; 3-44 Fournir des méthodes est préférable Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Envoi de message Comme nous l’avons vu, les fonctions sont pour les langages orientés objet le moyen de véhiculer les messages à destination des objets. Elles sont alors des méthodes publiques que l’on peut appeler de l’extérieur. Les langages C++ et Java ne possèdent pas de différence sémantique dans ce domaine. L’accès aux attributs s’effectue de la même manière avec les deux langages. Il est préférable de fournir des méthodes d’accès aux attributs afin de respecter les principes d’encapsulation et de ne pas rendre le code utilisateur trop dépendant des types des attributs. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-45 3 Agrégation C++ : supportée par le langage class Cercle { private: float rayon; Point origine; public: Cercle (int cx, int cy, float r) : origine (cx, cy), rayon (r) { } Java : doit être prise en charge explicitement class Cercle { private float rayon; private Point origine; public Cercle (int cx, int cy, float r) { rayon = r; origine = new Point (cx, cy); } } 3-46 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Agrégation C++ Le langage offre la possibilité de définir des agrégations dont la construction peut être totalement contrôlée au niveau de l’agrégat. Dans l’exemple ci-contre, la définition de la classe Point est : class Point { public: int x; int y; Point (int Java Avec java, il est indispensable de prendre en charge la construction explicite de chaque composant de l’agrégation. Dans l’exemple ci-contre, la définition de la classe Point est : class Point { public int x; public int y; Point (int px, int py) { x = px; y = py; } Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-47 3 Héritage Figure Point origine; hérite de Cercle float rayon; C++ class Cercle : public Figure { private : ....... } Java class Cercle extends Figure { private ...... } 3-48 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Héritage En C++ et Java, les héritages s’effectuent au travers des classes. En fait on effectue la dérivation de classes de base pour obtenir des classes plus évoluées. Par exemple, toutes les instances de Figure seront alors vues comme si la classe Figure avait repris dans sa définition la définition de Cercle. C++ C++ supporte également la notion d’héritage multiple. Java Java ne supporte pas l’héritage multiple d’implémentations. Par contre, il est possible de définir un héritage multiple d’interfaces. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-49 3 Polymorphisme Java Définition ■ Un seul nom, plusieurs implémentations public class Cercle extends Figure { ... public void dessiner () { // dessin d’un cercle } } public class Rectangle extends Figure { ... public void dessiner () { // dessin d’un rectangle } } Utilisation ■ Totalement transparente public class Fenetre { // gestion d’une liste de figures public void dessiner () { // boucle de dessin de chaque Figure // par appel de dessiner() 3-50 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Polymorphisme Java ■ Les classes Cercle et Rectangle sont des Figure qui implémentent la méthode dessiner(). ■ Le comportement de chaque méthode dessiner() dépend de sa classe de définition. ■ La Fenêtre est capable de représenter graphiquement toute Figure, grâce à sa méthode dessiner(). ■ Pour cela, elle gère une liste d’objets de type Figure grâce à des méthodes de type ajouter() et enlever(), que l’on va pouvoir utiliser au niveau de Figure. ■ Il est possible d’enrichir ce mécanisme à l’aide des interfaces, classes et méthodes abstraites. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-51 3 Polymorphisme C++ Définition ■ Un seul nom, plusieurs implémentations class Cercle : public Figure { public: virtual void dessiner () { // dessin d’un Cercle } }; class Rectangle : public Figure { public: virtual void dessiner () { // dessin d’un Rectangle } }; Utilisation ■ Totalement transparente class Fenetre { // gestion d’une liste de figures void dessiner () { // boucle de dessin de chaque Figure // par appel de dessiner() } } 3-52 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Polymorphisme C++ ■ Les classes Cercle et Rectangle sont des Figure qui implémentent la méthode dessiner(). ■ Le comportement de chaque méthode dessiner() dépend de sa classe de définition. Il est indispensable d’indiquer explicitement par l’emploi du mot-clé virtual que l’on désire utiliser le polymorphisme. ■ La Fenêtre est capable de représenter graphiquement toute Figure, grâce à sa méthode dessiner (). ■ Pour cela, elle gère une liste d’objets de type Figure grâce à des méthodes de type ajouter() et enlever(), que l’on va pouvoir utiliser au niveau de Figure. ■ Il est possible d’enrichir ce mécanisme à l’aide des méthodes virtuelles pures. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-53 3 Définition du CASE Computer Aided Software Engineering UPPER CASE AGL (Analyse/Conception) ATELIER Traitements Données objets DE LOWER CASE GENIE L3G Code source RAD OBJET LOGICIEL Test Qualité L4G 3-54 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Définition du CASE Les outils CASE (Computer Aided Software Engineering) ou outils de Génie Logiciel (OGL) sont des logiciels d’aide au développement d’applications. Ils agissent sur une ou deux phases du cycle de développement aussi appelé le cycle de vie du logiciel. Phases hautes (Upper Case) On retrouve dans les phases hautes toutes les méthodes et les outils d’analyse/conception et de modélisation. Ce sont des outils permettant de concevoir des systèmes d’information et de spécifier des applications. De plus en plus, ces outils proposent de la génération automatique de code et agissent donc sur les phases basses du cycle de vie du logiciel. Ils peuvent également générer des schémas de Bases de Données (DDL : Data Definition Language). Phases basses (Lower Case) Les outils du Lower Case sont des outils à faible composante méthodologique tels que des générateurs d’interfaces graphiques (IHM), des L4G (générateurs de code de 4ème génération plus ou moins objet), les L3G (langages tels que C, Fortran, Cobol, utilitaires de développement, outils de debugging, de test, de qualité, les gestionnaires de configuration) et les nouveaux ateliers de développement d’applications objet. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-55 3 Atelier de Génie Logiciel Définition Gestion Analyse Conception Gestion Développement Qualité Test de Configuration d’objets Référentiel Un Atelier de Génie Logiciel (AGL) est un ensemble d’outils de Génie Logiciel (OGLs) articulés autour d’un référentiel permettant l’automatisation de l’ensemble des phases du développement. 3-56 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Atelier de génie logiciel Définition Dans le monde du CASE, il existe un nombre important d’outils couvrant une ou plusieurs phase du cycle de vie du logiciel. Le problème majeur est le manque de communication entre ces outils. Par exemple, il est intéressant de pouvoir utiliser un document de conception venant d’un Upper Case comme point d’entrée du L4G. Pour cela, je dois sauvegarder le schéma de ma base ou la définition de mes objets dans une base de données, propriétaire ou non, appelée référentiel. Un Atelier de Génie Logiciel peut donc être défini comme un ensemble d’outils de Génie Logiciel articulés autour d’un référentiel permettant, l’automatisation de l’ensemble des phases du cycle de vie, grâce à un mode de communication commun et la mise en oeuvre de règles de gestion à l’aide de techniques. On ne peut pas parler d’AGL sans évoquer les structures d’accueil aussi appelée bus logiciel. Une structure d’accueil est composée du référentiel, permettant aux différents outils de partager leurs données, et d’une couche intégration qui leurs permet de communiquer. Si la couche intégration est propriétaire, l’AGL ne permet pas l’intégration d’outils venant d’autres éditeurs et connaît toutes les limitations inhérentes à un système propriétaire (coût, choix, évolution) mais garantit, en général, un environnement bien "rodé" avec un bon niveau de sécurité. Pour des raisons de contrôle de coûts et de pérennité des investissements, les développeurs préfèrent des solutions basées sur des standards. Il y a quelques standards émergeant à l’heure actuelle tels que : ■ PCTE (Portable Common Tool Environment) de l’ECMA (European Computer Manufacturers Association) basé sur UNIX, ■ les systèmes ouverts et CORBA (Common Object Request Broker Architecture) de l’OMG (Object Management Group) pour décrire les mécanismes d’échanges entre objets distribués, ■ Tooltalk de Sun intégré aux spécifications du COSE. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-57 3 Outils d’Upper CASE orientés objet Exemples d’outils 3-58 Outils Editeur Méthodologies StP IDE OMT,Booch ObjecTeam Cadre OMT,S&M Rose Rational Booch, OMT, UML ObjectPartner VERILOG OMT Paradigm Protosoft OMT, Booch, Fusion Objecteering Softeam CLASSE-RELATION ObjectBench SES Shlaer Mellor ObjecTime ObjectTime ROOM Select/omt Select OMT Westmount Westmount OMT JavaPlan Sun-Lighthouse OMT Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Outils d’Upper CASE orientés objet Upper case L’offre de certaines de ces sociétés dépassent d’ailleurs largement le cadre de l’Upper Case puisque ce sont de véritables Ateliers de Génie Logiciel. StP d’IDE Software through Pictures est une gamme complète de produits de développement dans le domaine du lower CASE (génération de SQL pour les principales bases de données avec Stp/IM, outil de test StP/T) et de l’analyse/spécification objet (StP/OMT et StP/Booch). Les outils de l’upper CASE sont interfacés avec des environnements de développement comme le produit ObjectWorks ou Sun WorkShop. ObjectTeam de CADRE En plus de l’outil d’analyse/Conception proposé par cet éditeur, on trouve aussi dans ObjectTeam un module ObjectTeam/Sim de simulation de comportement du modèle OOA en amont de l’implémentation permettant de vérifier le comportement dynamique des applications. Rose de Rational Rose de Rational propose des outils d’analyse/Conception basés sur les méthodes Booch/OMT/UML et de génération de Code C++, Java et Smalltalk. Des outils de documentation (SoDA) et de génération de SQL/DDL pour des bases relationnelles comme Oracle complètent l’offre de Rational. JavaPlan JavaPlan est un outil d’analyse/conception et de génération de code (Java et Objective C) basé sur OMT. Il propose des fonctionnalités de reverse engineering pour C++, Java et Objective C. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-59 3 Outils du Lower CASE orientés objet Exemples d’outils 3-60 Outils Editeur Langages ObjectCenter CenterLine C++ Eiffel ISE Eiffel VisualWorks ParcPlace C++, Smalltalk,Java Borland C++ Borland C++ JBuilder Borland Java Visual C++ Microsoft C++ Visual Studio Microsoft C++, Java Galaxy Visix C++ Vibe Visix Java Visual WorkShop C++ Sun C++ Java WorkShop Sun Java JavaStudio Sun Java Visual Cafe Symantec Java Visual Age IBM Smalltalk, Java, C++ Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Outils du Lower CASE orientés objet Lower CASE On trouve dans cette catégorie : ■ Les environnements de développement autour des langages objet L’objectif de ces outils est de favoriser l’utilisation des langages. Les principales fonctions sont : éditeur, browser de classes, gestionnaire de projets, compilateurs objet, gestionnaires de librairies, debugger. ■ Les L4G Les bases de données orientées objet offrent aussi des outils de création et d’édition du schéma (graphe de classes) appelé concepteur de classes. ■ Les générateurs d’interface graphique (IHM) L’objectif est de permettre aux développeurs d’applications de développer des GUI sans avoir à connaître l’interface de programmation de base. Il peut disposer pour cela de librairie de classes graphiques. Environnements de développement Les environnements de développement sont des plates-formes complètes pour la mise au point itérative des applications. Les solutions C++ sont des références tant dans le domaine UNIX avec Visual WorkShop C++ ou ObjectCenter que sous Windows avec Visual C++ ou Borland C++. De nombreux environnements Java offrent une palette complète d’outils couvrant tous les besoins du développement. En général, ils sont disponibles sur les principales plates-formes du marché : UNIX, Windows NT et Windows 95 (Visual Age et Sun Java WorkShop) ou seulement sous Windows/Windows NT (Visual Cafe, JBuilder). Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-61 3 Présentation de Visual WorkShop C++ WorkShop pour lancer les outils Visual C++ pour construire des IHM Browsing pour naviguer et faire des recherches dans le code Building pour construire Debugging pour trouver facilement les erreurs Compilateur C++ et C 3-62 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Présentation de Sun Visual WorkShop C++ Les outils de Sun Visual WorkShop C++ sont les suivants : ■ Workshop Browsing examine les fonctions et les définitions de variables ainsi que leurs utilisations, les arbres d’appels de fonctions et les hiérarchies de classe C++. ■ Building traduit les règles du make et supervise les différentes phases de construction. ■ Debugging offre : ■ le contrôle d’erreurs à l’exécution, ■ le Fix and Continue qui permet la prise en charge de modifications de source sous contrôle de Debugging, ■ la définition de points d’arrêt, ■ des interfaces graphiques pour la visualisation des données et de la pile du processus. ■ Performance Analyzer affiche les temps user, system ainsi que la charge en Entrées/Sorties et en défauts de page système sous Solaris. ■ Visual C++ : WorkShop Visual de Sun est un outil interactif (produit X-Designer) permettant de construire des interfaces homme-machine utilisant les widgets de la librairie standard OSF/MOTIF. L’outil permet de construire une hiérarchie de widgets. On peut générer du code C, C++ ou UIL (en entrée également) ainsi que les fichiers makefile (si nécessaire). Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-63 3 Présentation d’un AGL ObjectPartner de VERILOG ■ ■ ■ Outils proposés : ■ OMT ProjectOrgamizer : gestion du projet OMT ■ OMT ObjectEditor : diagrammes de classes et d’instances ■ OMT FunctionEditor : diagrammes de flots de données ■ OMT BehaviorEditor : diagrammes d’état et event Traces (modèle dynamique) ■ OpenInterface : interfaces de programmation et utilitaire de documentation ■ C++ ProjectOrganizer : Reverse C++ pour le Reverse Engineering de Code C++ etc... Génération standards : ■ C++ ■ SQL Ouverture ■ 3-64 Langage LDS GEODE de VERILOG Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 33 3 Présentation d’un AGL ObjectPartner de VERILOG Outils ObjectPartner peut être utilisé pendant toutes les phases de la méthode OMT, de l’analyse au codage. Les trois éditeurs graphiques sont : ■ ObjectPartner ObjectEditor qui supporte les diagrammes de classe et d’instances, ■ ObjectPartner FunctionEditor qui supporte les diagrammes de flots de données. ■ ObjectPartner BehaviorEditor qui supporte les modèles dynamiques (diagrammes d’états et event Traces). Chaque éditeur peut importer un modèle existant. Toutes les informations du modèle peuvent être réutilisées dans les différents points de vue. Par exemple, une classe pourra être réutilisée dans la définition d’un processus. La traçabilité est supportée entre l’analyse et la conception. Un mécanisme de marquage permet de connaître les classes spécifiques d’une phase. Du Code à la conception ObjectPartner Reverse C++ permet de reprendre du code source C ou C++ pour générer un modèle objet. Génération de code La génération ne supporte que les parties déclaratives. Grâce à un mécanisme d’annotation, les parties rajoutées peuvent être prises en compte lors d’une régénération. La traduction automatique peut également être personnalisée. Développement orienté objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 3-65 3 Exercices Etude de cas d’une station service Implémentation en C++ 3-66 ■ Lancer le générateur de code par la commande C++ Generator du menu Tools, ■ Editer les différents fichiers générés afin de compléter le code. Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Objets en application 4 Objectifs ■ Présenter ■ Les standards de l’objet ■ Les environnement objet ■ CORBA ■ Neo de SunSoft ■ ORBIX ■ l’approche Internet avec Java et ACTIVE X ■ l’utilisation d’une base de données relationnelle avec JDBC ■ l’appel de méthodes distantes avec RMI ■ les principes de réalisation d’un applicatif Java aux normes CORBA ■ le relationnel étendu ■ les systèmes de gestion de bases de données objet persistants ■ les systèmes de gestion de bases de données objet intégrés ■ les principales bases de données orientées objet Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-1 4 Standards de l’objet COSE X/Open Management information objet ODMG OSF Modèles intégration d’outils CASE OMG X consortium Open distributed processing Trois axes de l’OMG : Applications distribuées Applications intégrées ou services Environnements hétérogènes 4-2 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Standards de l’objet L’objectif des standardisations est de faire communiquer les applications et d’obtenir une certaine transparence par rapport aux plates-formes matérielles et logicielles choisies par les utilisateurs. De nombreux organismes existent qui sont en général complémentaires. Un organisme essentiel est l’OMG, l’Object Management Group qui a été créé en 1989 à l’initiative d’un certain nombre de grandes sociétés américaines. La même année un accord de coopération était conclu entre l’OMG et le consortium X/Open de standardisation des systèmes ouverts pour la promotion de leurs travaux. L’OMG est une association internationale, sans but lucratif regroupant aujourd’hui plus de 750 membres assurant la promotion de spécifications de technologies d’objets distribués. Le but de l’OMG est de créer des standards pour réaliser l’interopérabilité entre les applications orientées objet en milieu hétérogène. L’OMG a proposé un modèle de standardisation des communications inter-objets. Ce projet a donné lieu en 1992, à l’architecture distribuée CORBA 1.1 qui a évolué plus tard vers CORBA 2. Ces spécifications concernent la communication entre objets, les services nécessaires et tendent à assurer l’interopérabilité entre les applications sur différentes machines en environnement distribué. La persistance est aussi étudiée par un groupe, appelé ODMG, qui réunit les principaux éditeurs de bases de données orientées objet et qui s’intéresse en particulier, à la standardisation du langage d’interrogation de la base. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-3 4 CORBA Common Object Request Broker Architecture Applications objets Facilités communes Object Request Broker COSS-1 COSS-2 COSS-3 etc... Services CORBA 4-4 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 CORBA Architecture L’architecture CORBA 1 (Common Object Request Broker Architecture) résulte d’une fusion des propositions HP, Sun, NCR, ODI réalisée suite à un appel d’offre de l’OMG. Une spécification CORBA 2 du produit est sortie en 1994 proposée par Sun et IONA. CORBA propose une approche idéale qui consiste à développer une interface indépendante de tout langage permettant de solliciter des opérations sur des objets sans connaître leur localisation. Il s’agit d’une généralisation des architectures Client/Serveur aux objets. Les objets Clients communiquent avec les objets Serveurs et les utilitaires communs par un échangeur de messages (ORB : Object Request Broker). On trouve quatre composants en CORBA : ■ Object request broker (ORB) – composant de communication, ■ Applications objet – applications utilisateurs, ■ Facilités communes ou Common facilities (CFS) – Services de haut niveau pour les applications objets, ■ Services CORBA – Services pour l’accès à l’ORB : en effet, CORBA est complété par le COSS (Common Object Service Submission) correspondant à un certain nombre de services. Les services proposés par le COSS sont, entre autres : ■ la notification d’événements inter-objets, ■ la gestion du cycle de vie des objets, ■ le service de noms (localisation), ■ la persistance des objets. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-5 4 ORB Object Request Broker ■ Un ORB est un "RPC objet" ■ CORBA spécifie deux approches d’ORB ■ Statique : - Utilisation d’un langage de définition IDL (Interface Definition Language) : - Description de l’interface de l’objet - Edition de liens avec l’application Inconvénient : recompilation en cas de modification ■ Dynamique : interface dynamique depuis un langage compilé - Fiche IDL stockée dans l’IR (Interface Repository : référentiel d’interfaces) - Interrogation IR avec API spécifique - Appel des méthodes avec DII (Dynamic Invocation Interface) Avantage : possibilité d’utiliser en exécution des objets inconnus lors de la phase de compilation Les deux API sont fournies par les éditeurs de logiciels qui proposent aujourd’hui CORBA. 4-6 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 ORB Interfaces d’ORB Les spécifications CORBA concernant l’ORB (Object Request Broker) comprennent deux interfaces différentes : ■ une interface statique décrite en langage de définition d’interface IDL (Interface Definition Language), ■ une interface d’appels dynamiques DII (Dynamic Invocation Interface) avec un référentiel d’interfaces. Langage de définition d’interfaces L’interface statique nécessite la connaissance à la compilation du type des objets avec lesquels on va interagir à l’exécution. Pour cette raison, on parle d’approche statique. IDL est un langage de spécification indépendant du langage de programmation. Un compilateur IDL transforme ensuite les spécifications en langage structuré ; on peut alors faire l’édition de liens avec des modules écrits en C, C++, Java, Ada95 et SmallTalk. Interface d’invocation dynamique L’interface d’appel dynamique propose, à contrario, une interface de programmation qui peut être appelée depuis tout programme conforme à CORBA. La construction est alors dynamique à l’exécution, ce qui peut donner plus de souplesse dans certaines applications : en effet, la connaissance par le développeur des objets Serveurs peut être insuffisante en phase de développement. Une "base de données" d’interface (IR : Interface Repository) permet d’enregistrer les fiches IDL. Une interface de programmation spécifique (DII : Dynamic Invocation Interface) permet à l’application Cliente de découvrir et invoquer les services implémentés par les objets serveurs. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-7 4 ORB Fonctionnement Implémentation Client Interface Repository DII objet Stub Interface Skeleton IDL ORB Serveur Adaptateur Code objet repository ORB Exemple d’interface IDL pour un objet addition interface CompteBancaire { void deposer (in long value); void retirer (in long value); attribute readonly long solde; } 4-8 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 ORB Fonctionnement ■ Client – Pour faire une requête, le client peut utiliser l’interface DII, utiliser un stub statique ou interagir directement avec l’ORB. ■ Stubs IDL et Skeleton – Les stubs client IDL et les skeletons serveurs sont générés par le compilateur IDL. L’interface DII permet au client de rechercher les méthodes de l’objet Serveur à l’exécution du programme client. ■ Interface Repository (IR) – Maintient la description de toutes les classes enregistrées ainsi que la signature (nom et paramètres) des méthodes qui leurs sont associées. En fait, l’IR est une base de données de référence des classes disponibles sur un réseau à un instant donné. L’accès à ce service se fait à travers une API. ■ Adaptateur d’objet ou Basic Object Adapter (BOA) – Contrôle les instanciations d’objets sur le serveur. En réponse aux requêtes sur le réseau, ce composant instancie le serveur objet puis assure l’échange de messages entre les stubs clients et les skeletons serveurs. Toutes les instanciations d’objets sont identifiés par un Object IDentifier (OID). ■ Code Repository – Maintient le registre des classes qu’un serveur peut supporter et les OIDs de serveurs objets actifs. Ce composant gère les données associées à l’audit, la sécurité (administration de objets), etc. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-9 4 Services CORBA et facilités communes Extraits des principaux services 4-10 ■ Object lifecycle – Administration des objets ■ Object persistence – Stockage des objets ■ Object events – Notifications des événements aux objets ■ Object naming – Service de noms ■ Object transactions – Transactionnel ■ ............. Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Services CORBA et facilités communes Alors que l’ORB fournit le mécanisme de base pour l’acheminement des requêtes entre objets, les services CORBA (COSS) offrent des fonctions fondamentales pour les objets distribués. La cible des utilités communes (CFS) est de fournir des interfaces systèmes ou frameworks pour les utilisateurs finaux. Les services CORBA sont des interfaces et services de plus bas niveau que les CFS. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-11 4 Solutions d’objets distribués ■ Réalisations CORBA sous UNIX ■ NEO (Network Environment Object) de Sun ■ DSOM (Distributed System Object Model) d’IBM ■ Orbix de IONA ■ VisiBroker de Visigenic ■ IIOP (Internet Inter Orb Protocol) implémenté par NEO, VisiBroker et Orbix ■ Autres approche objets ■ Microsoft : OLE (Object Linking and Embedding) OLE n'est pas conforme aux standards de l'industrie à savoir OMG/CORBA. 4-12 ■ COM (Common Object Model) et DCOM (Distributed COM) ■ ActiveX ■ Java RMI Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Solutions d’objets distribués Sun Sun propose son implémentation de CORBA 2 NEO sur Solaris qui propose un compilateur IDL générant du code en Java et en C++. IBM et HP DSOM est un produit clairement concurrent de Solaris NEO et il est conforme à CORBA 2. Membre de OMG, HP propose une approche DCE étendu (OODCE), une implémentation d’ORB non conforme a CORBA. Orbix Orbix créé par IONA Technologies, est aujourd’hui disponible sur une large gamme de systèmes d’exploitation comme VMS, MAC, Windows NT, Solaris, HP-UX, etc. Orbix fournit par ailleurs une interface pour l’intégration des systèmes d’objets distribués comme OLE. OLE de Microsoft OLE permet de lier des documents ou des applications, mais pas des objets distribués mais ne répond pas aux spécifications CORBA. DCOM est en revanche une technologie d’objets distribués (non CORBA). ActiveX de Microsoft Active X est une architecture de définition de composants logiciels distribués non conforme à CORBA. Le modèle de distribution est identique à celui des applets Java sans toutefois bénéficier de l’universalité inhérente à la plate-forme Java. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-13 4 NEO de Sun ■ ■ 1988 : Projet Spring ■ 1991 : Première spécification CORBA de l’OMG ■ 1995 : version Prelude de NEO (CORBA 1.2) ■ 1996 : Version Crescendo de NEO Conforme à IIOP (Internet Inter Orb Protocol) avec nombreux services CORBA 2 disponibles Architecture du produit NEO Applications objets spécifiques Applications objets Tiers Framework Développement objet DOMF (CORBA) + Services COSS Solaris 2.x 4-14 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 NEO de Sun Caractéristiques NEO est la solution CORBA 2 de Sun. Par ailleurs, WorkShop NEO propose en plus des outils classiques WorkShop (compilateur, debugger, browser, etc) le compilateur IDL ainsi qu’un générateur d’objets distribués, Networked Object Builder, et les Frameworks de développement de NEO. Par ailleurs, il implémente avec IIOP l’interopérabilité défini par CORBA 2. NEO est complètement conforme aux standards de l’OMG : ■ CORBA à travers le Distributed Object Management Facility (DOMF), ■ COSS (niveau 1), ainsi que des fonctionnalités additives en cours d’implémentation. Autres composantes de NEO ■ Persistent Storage Manager (PSM), ■ Object Development Framework (ODF). Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-15 4 Orbix d’IONA ■ Disponible sur un grand nombre de systèmes d’exploitation : SunOS, Solaris, IRIX, HP-UX,AIX, OS/2, SCO, Digital Unix, Windows NT, Windows 3.1 et 95, VMS, VxWorks, MacOS ■ Dialogue avec OLE/COM de Microsoft ■ Conforme à IIOP (Internet Inter Orb Protocol) ■ Architecture Objets serveurs Service de Noms Repository Compilateur IDL Interface IDL Orbix DII BOA Runtime Orbix Système de communication Orbix Système d’exploitation UNIX, Windows, Propriétaire 4-16 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Orbix d’IONA Présentation Le système de communication Orbix comprend un certain nombre de classes abstraites implémentées par défaut au dessus de TCP/IP et utilisant le codage XDR (eXternal Data Representation). Le runtime Orbix comprend la partie client DII et la partie serveur appelée BOA (Basic Object Adaptor). ainsi que l’API statique. Le service de noms permet de centraliser auprès d’un serveur principal de localisation de serveurs objet. Lorsqu’un client veut utiliser un service objet particulier, il doit demander à Orbix de le mettre en communication avec le service correspondant. Une façon de faire est de fournir une référence complète de l’objet (contenant entre autres le nom de la machine sur laquelle le serveur objet est localisé). Une forme plus générale consiste à solliciter un service sans préciser la machine de localisation. Dans ce cas Orbix fait une recherche sur le réseau des machines offrant le service désigné. La localisation est transparente pour l’objet client. Le compilateur IDL (compatible avec celui de Solaris NEO de Sun) génère du C++ et Java (OrbixWEB) Orbix offre, par ailleurs, de nombreuses passerelles vers d’autres architectures Client/Serveur : moniteurs transactionnels (TUXEDO), DCOM. Par ailleurs, il implémente avec IIOP l’interopérabilité défini par CORBA 2. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-17 4 Solutions d’objets distribués avec Java Java RMI (Remote Method Invocation) ■ Invocation de méthodes distantes en Java ■ Identification des objets et transport d’informations sur le réseau ■ Gestion de la sécurité spécifique ■ Solution propriétaire Java CORBA et Java 4-18 ■ Générateurs IDL - Java ■ Permet la mise en place de solutions hétérogènes Java - C - C++ - Smalltalk ■ Prise en compte du protocole IIOP ■ Soumis à l’OMG pour approbation Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Solutions d’objets distribués avec Java Remote Method Invocation RMI offre à deux Machines Virtuelles Java le moyen d’utiliser leurs services respectifs, que ce soit sur une même machine ou sur deux machines connectées en réseau local ou à grande échelle. RMI comporte des services de nommage et d’identification d’objets et s’appuie sur le sérialisation d’objets pour gérer le transport des paramètres sur le réseau. Le type d’architecture distribuée ainsi défini est purement propriétaire Java, mais un rapprochement vers les protocoles IIOP (Internet InterORB Protocol) devrait s’opérer rapidement. CORBA Un compilateur Java-IDL permet de générer du code Java à partir de descriptions de services écrites en langage IDL. Cela permet de bâtir des solutions hétérogènes dans lesquelles peuvent s’intégrer des clients et des serveurs écrits en C, C++, Smalltalk et Java. Une proposition de normalisation du "mapping" IDL - Java a été soumise à l’Object Management Group (OMG). Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-19 4 Solutions d’objets distribués avec Java Exemple Java et CORBA Interface IDL module HelloApp { interface hello { string sayHello(); }; }; Mise en place ■ ■ 4-20 Serveur ■ Instanciation de l’ORB ■ Instanciation de l’implémentation de l’interface ■ Démarrage du service de nommage ■ Enregistrement du premier objet Client ■ Instanciation de l’ORB ■ Accès au service de nommage ■ Accès à l’objet serveur et invocation distante Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Solutions d’objets distribués avec Java Exemple Java et CORBA Interface IDL Toutes les fonctionnalités du langage IDL normalisé par l’OMG sont disponibles. Mise en place ■ Serveur Le serveur est une application Java autonome qui initialise l’ORB et son service de nommage et d’identification d’objets. Il crée également les premiers objets dont les services pourront être utilisés de manière distante. C’est l’invocation de ces services par les objets clients qui pourra éventuellement créer de nouveaux objets utilisables à travers le réseau. ■ Client Le client peut être une applet ou une application autonome Java. Il doit créer une représentation locale d’un objet distant afin de pouvoir invoquer ses services. Pour cela, il utilise le nom attribué à l’objet par le serveur. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-21 4 Architecture de composants objets Solutions JavaBeans 4-22 ■ Réutilisabilité ■ Modularité ■ Interopérabilité ■ Développement rapide (RAD) Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Architecture de composants objets Solutions JavaBeans JavaBeans est un modèle d’architecture de composants logiciels Java qui permet de constituer une application par simple assemblage de composants. Cette technique permet de constituer des bibliothèques d’objets de haut niveau ou objets métiers et permet de répondre de façon globale aux besoins récurrents liés au développement d’application : ■ réutilisabilité accrue par l’emploi de composants aux interfaces normalisées, ■ modularité liée à la possibilité de remplacer aisément un composant par un autre, ■ interopérabilité grâce à la possibilité d’utiliser un composant JavaBeans au sein de toute application le permettant, ■ développement rapide grâce au mécanisme d’assemblage de composants coopérants. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-23 4 Relationnel et objet Accès aux Bases de Données Relationnelles avec Java JDBC: Java DataBase Connectivity 4-24 ■ Accès à toute base de données relationnelle ou objet conforme à SQL-92 ■ Vision universelle du SGBD ■ Indépendance totale vis-à-vis des fournisseurs de SGBD Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Relationnel et objet Accès aux Bases de Données Relationnelles JDBC : Java DataBase Connectivity Les bases de données sont au coeur de très nombreuses applications. Leur utilisation par une application souffrait jusqu’alors de la diversité des API mises à disposition par les différents fournisseurs. JDBC offre une API unique d’accès à toute base de données conforme au standard SQL2, qu’elle soit relationnelle ou objet. Une application Java est capable d’accéder de façon générique à une base de données, quel que soit son fournisseur. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-25 4 Relationnel et objet JDBC Application Java Une Machine Virtuelle JDBC (java.sql) Driver JDBC fournisseur 1 S.G.B.D. fournisseur 1 Base de données 4-26 Driver JDBC fournisseur 2 S.G.B.D. fournisseur 2 Base de données Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Relationnel et objet JDBC Principes Il offre les moyens d’accès universels à la base de données et notamment la capacité de charger et répertorier les différents drivers d’accès aux SGBD. Un driver est particulier au SGBD dont il gère l’accès et est réalisé par une tierce partie qui peut être le fournisseur du SGBD ou tout autre éditeur de logiciels. JDBC n’offre aucun driver et spécifie uniquement l’architecture que ces drivers doivent respecter. L’implémentation des drivers est totalement libre. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-27 4 Relationnel et objet Limites du relationnel ■ Besoin de représenter des données imbriquées ■ Dichotomie entre : ■ Langage de manipulation (SQL) ■ Langage de programmation (Cobol, C, Pascal) Nouvelles approches ■ ■ 4-28 Systèmes de Gestion de Bases de Données Relationnelles Etendus (SGBDRE) : ■ Modèle V3 de CODD, ■ POSTGRES ■ UniSQL ■ Oracle V8 ■ SQL SERVER de Microsoft Nouveaux modèles de données (SGBDO) Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Relationnel et objet Limites du relationnel A l’origine le modèle relationnel conçu pour les applications de gestion se limitait aux entiers, aux réels, aux flottants. L’émergence des technologies objet (Java, CORBA, C++) a induit une distorsion entre le modèle de données des applications et celui des bases de données (persistance). Pour résoudre ce problème, deux tendances sont apparues : les systèmes s’appuyant sur le relationnel ou systèmes de gestion de bases de données relationnels étendus (SGBDRE) et les autres fondés sur de nouveaux modèles purement objet. SGBDRE Les SGBDRE visent à étendre le modèle relationnel en lui ajoutant de nouveaux outils de modélisation tels que les types abstraits de données et des règles mais aussi en améliorant les langages de manipulation de données. Le niveau V3 de SQL ou SQL3 prévoit une approche évolutionnaire avec entre autres : ■ polymorphisme de types : union récursive et hiérarchie ■ objets persistants avec trois niveaux d’encapsulation : public, privé et protégé ■ procédures cataloguées avec plusieurs instructions SQL. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-29 4 Principes des SGBDO Historique ■ 1984 : Principes ■ 1986-87 : Premiers prototypes avec VBase, Gemstone, Iris, Orion, O2 ■ 1988-89 : Premiers produits VBase et GemStone ■ 1989-90 : La deuxième génération d’éditeurs. Caractéristiques 4-30 ■ Identité objet : tout objet a une identité indépendante de sa valeur ■ objets complexes : objets atomiques et constructeurs d’objets complexes ■ Encapsulation : objet = données + programmes ■ Typage : classe = objets de même structure et de même comportement ■ Héritage ■ Redéfinition et lien dynamique ■ Complétude ■ Extensibilité. Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Principes des SGBDO Un SGBDO est d’abord un SGBD et fournit donc les fonctions de base pour gérer une base de données, c’est-à-dire : l’intégrité des données, leur persistance, leur indépendance physique, la possibilité de requêtes et la gestion des transactions. Un SGBDO propose en plus, la notion d’objet (données + comportement), d’héritage et de polymorphisme (facultatifs). Le schéma de base de données objet comprend la définition des classes et des associations inter-classes. L’utilisation des bases de données objet fait partie intégrante de la technologie objet et leur utilisation est en synergie avec les méthodes d’analyse/conception et les langages de programmation. En dehors de l’approche relationnel étendu qui prévoit une extension du modèle relationnel et du langage de manipulation SQL, on trouve deux approches : une approche langage aussi appelée systèmes objets persistants et une autre appelée systèmes bases de données intégrés. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-31 4 Approche langage ou objet persistant Principes Espace des objets du programme SGBDO Ecrire A Lire Objets temporaires Objets persistants Méthodes de persistance ■ Persistance manuelle, par héritage ou par référence ■ Exemples : ■ ■ 4-32 Langage OPAL de GEMSTONE : extensions de Smalltalk Langage DML d’ObjectStore : extensions de C++ Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Approche langage ou objet persistant Principes Un langage objet tel que C++ ou Smalltalk est étendu pour permettre la définition et la manipulation d’objets persistants. C’est l’approche retenue par des systèmes ObjectStore avec C++ et GemStone avec Smalltalk. En fait, on utilise C++ ou Smalltalk à la place de SQL. Le développeur adopte alors une approche plus continue en utilisant le "paradigme objet" pour les objets temporaires et les objets persistants : il importe les définitions des classes depuis le schéma de la base pour manipuler tous les objets utiles dans son espace de travail. La lecture et l’écriture d’objet persistant est transparente. Par rapport à une approche de type relationnel avec SQL, la frontière est moins rigide grâce à la compatibilité des types temporaires et persistants (c’est à dire appartenant à la base) : en effet, on utilise le même modèle objet pour la base de données et le langage. Persistances manuelle, par héritage et par référence Pour créer dans l’espace du programme un objet persistant, il existe plusieurs méthodes : ■ Méthode manuelle : On donne la possibilité au programmeur de créer un objet persistant à partir d’un objet temporaire déjà existant. ■ Méthode par héritage : Cette technique permet de définir la persistance d’un objet par appartenance à une classe héritant d’une classe persistante. ■ Méthode par référence : Cette technique permet de définir la persistance d’un objet par création explicite d’une racine ou par attachement à un objet persistant. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-33 4 Approche Base de données objet intégrée Compte bancaire Client Nom Prénom Adresse Téléphone Profession Numéro de Client est titulaire Numéro de compte Solde Courant Seuil Découvert Revenu Mensuel a signature Catégorie Retrait Dépôt Etat Fermeture Opposition Changer Information Interdire Client Fermeture Mouvements Compte Courant Date Montant Origine 4-34 Compte Epargne Date Ouverture Intérêt Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Approche Base de données objet intégrée Principes Un SGBDO intégré est indépendant de tout langage de programmation. Il offre une interface multi-langages (base de données O2) ou un langage de manipulation compatible avec SQL. Dans ce dernier cas, la compatibilité ascendante ne signifie pas relationnel étendu car le SGBD et son modèle voit simplement le concept de relation comme un cas particulier. En fait un système de BDO intégré préserve les avantages d’un langage déclaratif comme SQL. Le modèle proposé est en général d’un plus haut niveau sémantique qu’un modèle à objet persistant. Le modèle : ■ intégre le concept d’héritage, ■ supporte directement les relations, ■ prend en compte l’agrégation et la récursivité. Exemple Les relations ci-contre sont construites directement dans la base de données objet : héritage, relations, agrégation, récursivité. On remarque que les jointures des SGBD relationnels sont directement disponibles en orienté objet. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-35 4 Modèle objet de l’ODMG Object Database Management Group ■ Tout objet ■ Propriétés de l’objet : Attributs ■ Associations ■ Opérations (décrivant le comportement) ■ Notion de classe (implémentation d’un type) ■ Types ■ 4-36 ■ ■ Organisés en hiérarchie avec racine unique ■ Création de nouveaux types ■ Extensions Chaque objet est identifié par son OID Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Modèle objet de l’ODMG Objectif L’ODMG est un groupe indépendant regroupant un ensemble d’éditeurs de bases de données (Object Design, Unidata O2 Technology, Objectivity, Ontos, Versant), ayant pour objectif de développer un standard pour les SGBD orientés objet. Ces travaux sont soumis à l’OMG en vue de leurs standardisations. Modèle de l’ODMG Le modèle de l’ODMG ne supporte pas de valeur et tout est objet (on retrouve une approche proche de celle de Smalltalk). Le modèle est plus général que le modèle relationnel et même que le relationnel étendu. Il supporte la notion de classe et les concepts d’attributs et d’associations sont aussi intégrés. Les attributs peuvent être multi-valués par des objets structurés et les associations 1:1, 1:N ou M:N. La notion de classe est vue comme l’implémentation d’un type. Les types sont organisés en une hiérarchie d’héritage représentant les liens types. L’héritage multiple est possible et il existe une racine unique. On peut créer de nouveaux types, en faire l’extension (retrouver tous les objets d’un type donné). Le modèle de l’ODMG supporte les opérations qui décrivent le comportement de l’objet et qui sont définies au niveau des types. Chaque objet est repérable par son Object-id (OID) qui ne peut pas changer pendant toute sa durée de vie. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-37 4 Langage d’interrogation OQL Object Query Language ■ SQL étendu objet compatible SQL2 ■ Envois de méthodes ■ Constructions de valeurs complexes ■ Standard ODMG ■ Caractéristiques : ■ ■ Requête sur les objets complexes ■ Utilisation des opérations dans les listes de projection et dans les clauses where ■ Possibilité de créer un objet résultat d’une requête Deux modes de fonctionnement : ■ interactif select tuple (auto : voiture->title, consommation: voiture.consommation) from voiture in Mercedes.voitures where voiture.consommation > 3 and exists c in voiture.caractéristiques.transmission : c.nom == "Automatique" ; ■ 4-38 intégration à C++, C, etc Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Langage d’interrogation OQL OQL est le langage d’interrogation de bases de données objet que propose l’OMG. OQL est un langage déclaratif où une requête peut être vue comme une fonction select qui s’applique à une ou à plusieurs extensions de types et retourne une extension de types. Pour créer explicitement des objets en résultat, un constructeur de type doit être utilisé explicitement (dans l’exemple construction de l’objet tuple). Les jointures, agrégats et tris sont supportés et peuvent être appliqués aussi aux méthodes. En conclusion, il est possible d’écrire des expressions très complexes qui peuvent être imbriquées aussi bien au niveau du select, du from que du where. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-39 4 Marché des SGBDO Principales bases Produit Editeur Langage Ontos Ontos/BIM C,C++ Versant Versant C++ ObjectStore Object Design C, C++ Gemstone Servio C, C++, Smalltalk P.O.E.T. Poet Software C++ O2 UniData C, C++,O2C Orion Itasca C, C++, Lisp, Ada Matisse Intellitic C,ADA, C++, Cobol Objectivity /DB Objectivity C, C++ Jasmine Computer Associates JAD Illustra Sybase 4-40 Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 44 4 Marché des SGBDO Marché La liste des bases de données jointe ne concerne pas les systèmes relationnels étendus. Nous retrouvons les deux grandes familles avec les systèmes de type langage de programmation persistant et les autres dits bases de données intégrés. ■ GemStone (langage Smalltalk, persistance par héritage) , ■ ObjectStore (C++, persistance par référence), ■ Ontos (C++, OSQL, persistance par héritage), ■ Versant (C++, persistance par héritage) ■ P.O.E.T. (C++, persistance manuelle), ■ O2, ■ Orion. Par exemple, le système O2 est un SGBDO intégré, doté d’un environnement de développement graphique puissant. L’approche est multi-langage et son langage de requête O2SQL lui donne une forte compatibilité avec le standard de l’ODMG. Des travaux visant à l’intégration de OGLs et ODL à Java sont en cours au niveau de l’ODMG. Objets en application Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService 4-41 4 Résumé ■ Standard d’objets distribués (NEO, Orbix, VisiBroker) et interopérabilité (IIIOP) ■ Architecture de composants logiciels : ActiveX et JavaBeans ■ Interfaçage SGBDR et objet : JDBC ■ Persistance : ■ 4-42 ■ Approche évolutionnaire des SGBDRE ■ Approche révolutionnaire des SGBDO Marché : ■ Offre abondante et succès des méthodes et langages objet (effet Java) ■ Maturité des outils CASE ■ Perspective d’évolution des systèmes de gestion de base de données Concepts et méthodologie Objet illustrés par Java et C++ Révision D Copyright février 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Corrections de l’étude de cas A A-1 Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier Fourniture.C #include "Fourniture.h" Fourniture::Fourniture(tProduit pdt) { GenInit(); Cout = 0; Volume = 0; Produit = pdt; } void Fourniture::Init(int tps) { Volume = (float)tps; Cout = this->afficheur->PrixLitre * (int)Volume; } void Fourniture::GenInit() { afficheur = 0; } void Fourniture::set_afficheur (class afficheur& a_afficheur) { p_connect_afficheur(a_afficheur); a_afficheur.p_connect_Fourniture(*this); } void Fourniture::unset_afficheur() { if (afficheur) afficheur->p_disconnect_Fourniture(*this); p_disconnect_afficheur(*afficheur); } void Fourniture::p_connect_afficheur (class afficheur& a_afficheur) { unset_afficheur(); afficheur = &a_afficheur; } void Fourniture::p_disconnect_afficheur(class afficheur& a_afficheur) A-2 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 { assert(&a_afficheur == afficheur); afficheur = 0; } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-3 Fichier Fourniture.h #ifndef _FOURNITURE_H_ #define _FOURNITURE_H_ #include <assert.h> #include "afficheur.h" #ifndef TPRODUIT #define TPRODUIT typedef enum { essence, super } tProduit; #endif class Fourniture { public: int Cout; float Volume; tProduit Produit; Fourniture(tProduit pdt); void Init(int tps); private: void GenInit(); public: class afficheur* afficheur; void set_afficheur (class afficheur& a_afficheur); void unset_afficheur (); public: void p_connect_afficheur (class afficheur& a_afficheur); void p_disconnect_afficheur (class afficheur& a_afficheur); }; #endif A-4 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier Terminal.C #include "Terminal.h" #include "transaction.h" #include <iostream.h> void Terminal::AutoriserPompe() { this->pompe->Status = this->pompe->TestPompe(); cout << "Etat de la pompe : " << this->pompe->Status << endl; } void Terminal::SaisiePaiement(class transaction &transac) { char rep; rep =' '; cout << "volume :" << transac.volume << endl; cout << "cout :" << transac.cout << endl; if (transac.produit == essence) cout << "produit : essence " << endl; else cout << "produit : super " << endl; cout << "numero pompe :" << transac.NumeroPompe << endl; cout << "numero vehicule :" << transac.NumeroVehicule << endl; cout << "mode de paiemant :" << transac.Remarque << endl; cout << endl; while (rep != 'p') { cout << "veuillez payez svp appuyez sur p "<< endl; cin >> rep; } ValidationTransaction(); } void Terminal::ValidationTransaction() { cout << "Transaction valide" << endl; } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-5 void Terminal::GenInit() { pompe = 0; gerant = 0; transaction = 0; } Terminal::Terminal() { GenInit(); } void Terminal::set_transaction (class transaction& a_transaction) { p_connect_transaction(a_transaction); a_transaction.p_connect_Terminal(*this); } void Terminal::unset_transaction() { if (transaction) transaction->p_disconnect_Terminal(*this); p_disconnect_transaction(*transaction); } voidTerminal::p_connect_transaction(classtransaction&a_transaction) { unset_transaction(); transaction = &a_transaction; } void Terminal::p_disconnect_transaction(class transaction& a_transaction) { assert(&a_transaction == transaction); transaction = 0; } void Terminal::set_gerant (class gerant& a_gerant) { p_connect_gerant(a_gerant); a_gerant.p_connect_Terminal(*this); } void Terminal::unset_gerant() { if (gerant) gerant->p_disconnect_Terminal(*this); p_disconnect_gerant(*gerant); } A-6 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 void Terminal::p_connect_gerant (class gerant& a_gerant) { unset_gerant(); gerant = &a_gerant; } void Terminal::p_disconnect_gerant(class gerant& a_gerant) { assert(&a_gerant == gerant); gerant = 0; } void Terminal::set_pompe (class pompe& a_pompe) { p_connect_pompe(a_pompe); a_pompe.p_connect_Terminal(*this); } void Terminal::unset_pompe () { if (pompe) pompe->p_disconnect_Terminal(*this); p_disconnect_pompe(*pompe); } void Terminal::p_connect_pompe (class pompe& a_pompe) { unset_pompe(); pompe = &a_pompe; } void Terminal::p_disconnect_pompe (class pompe& a_pompe) { assert(&a_pompe == pompe); pompe = 0; } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-7 Fichier Terminal.h #ifndef _TERMINAL_H_ #define _TERMINAL_H_ #include "transaction.h" #include "gerant.h" #include <assert.h> #include "pompe.h" class Terminal { public: void AutoriserPompe(); void SaisiePaiement(class transaction &transac); void ValidationTransaction(); Terminal(); private: void GenInit(); public: class transaction* transaction; void set_transaction (class transaction& a_transaction); void unset_transaction (); public: void p_connect_transaction (class transaction& a_transaction); void p_disconnect_transaction (class transaction& a_transaction); public: class gerant* gerant; void set_gerant (class gerant& a_gerant); void unset_gerant (); public: void p_connect_gerant (class gerant& a_gerant); void p_disconnect_gerant (class gerant& a_gerant); public: class pompe* pompe; void set_pompe (class pompe& a_pompe); void unset_pompe (); public: void p_connect_pompe (class pompe& a_pompe); void p_disconnect_pompe (class pompe& a_pompe); }; #endif A-8 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier Timer.C #include "Timer.h" #include <iostream.h> #include <time.h> void Timer::Armer() { cout << "timer arme" << endl; time(&HeureDep); } int Timer::Arreter() { cout << "timer desarme" << endl; time(&HeureArr); return (int)(HeureArr - HeureDep); } Timer::Timer() { GenInit(); } Timer::~Timer() { } void Timer::GenInit() { pompe = 0; } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-9 void Timer::set_pompe (class pompe& a_pompe) { p_connect_pompe(a_pompe); a_pompe.p_connect_Timer(*this); } void Timer::unset_pompe () { if (pompe) pompe->p_disconnect_Timer(*this); p_disconnect_pompe(*pompe); } void Timer::p_connect_pompe (class pompe& a_pompe) { unset_pompe(); pompe = &a_pompe; } void Timer::p_disconnect_pompe (class pompe& a_pompe) { assert(&a_pompe == pompe); pompe = 0; } A-10 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier Timer.h #ifndef _TIMER_H_ #define _TIMER_H_ #include <assert.h> #include "pompe.h" #ifndef TYPTPS #define TYPTPS typedef long TypTps; #endif class Timer { public: TypTps HeureDep; TypTps HeureArr; void Armer(); int Arreter(); Timer(); ~Timer(); private: void GenInit(); public: class pompe* pompe; void set_pompe (class pompe& a_pompe); void unset_pompe (); public: void p_connect_pompe (class pompe& a_pompe); void p_disconnect_pompe (class pompe& a_pompe); }; #endif Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-11 Fichier afficheur.C #include "afficheur.h" #include "Fourniture.h" #include <iostream.h> void afficheur::Raz() { if (this->Fourniture->Produit == essence) PrixLitre = 5; else PrixLitre = 7; Afficher(); } Fourniture &afficheur::Lecture() { return * this->Fourniture; } void afficheur::Afficher() { cout << endl; cout << "cout :" << this->Fourniture->Cout << endl; cout << "volume :" << this->Fourniture->Volume << endl; if (this->Fourniture->Produit == essence) cout << "produit : essence" << endl; else cout << "produit : super" << endl; } void afficheur::GenInit() { pompe = 0; Fourniture = 0; } A-12 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 afficheur::afficheur() { GenInit(); } void afficheur::set_Fourniture (class Fourniture& a_Fourniture) { p_connect_Fourniture(a_Fourniture); a_Fourniture.p_connect_afficheur(*this); } void afficheur::unset_Fourniture () { if (Fourniture) Fourniture->p_disconnect_afficheur(*this); p_disconnect_Fourniture(*Fourniture); } void afficheur::p_connect_Fourniture (class Fourniture& a_Fourniture) { unset_Fourniture(); Fourniture = &a_Fourniture; } voidafficheur::p_disconnect_Fourniture(classFourniture&a_Fourniture) { assert(&a_Fourniture == Fourniture); Fourniture = 0; } void afficheur::set_pompe (class pompe& a_pompe) { p_connect_pompe(a_pompe); a_pompe.p_connect_ptraff(*this); } void afficheur::unset_pompe() { if (pompe) pompe->p_disconnect_ptraff(*this); p_disconnect_pompe(*pompe); } void afficheur::p_connect_pompe (class pompe& a_pompe) { unset_pompe(); pompe = &a_pompe; } void afficheur::p_disconnect_pompe(class pompe& a_pompe) { assert(&a_pompe == pompe); pompe = 0; Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-13 } A-14 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier afficheur.h #ifndef _AFFICHEUR_H_ #define _AFFICHEUR_H_ #include "Fourniture.h" #include <assert.h> #include "pompe.h" class afficheur { public: int PrixLitre; void Raz(); class Fourniture &Lecture(); void Afficher(); afficheur(); private: void GenInit(); public: class Fourniture* Fourniture; void set_Fourniture (class Fourniture& a_Fourniture); void unset_Fourniture (); public: void p_connect_Fourniture (class Fourniture& a_Fourniture); void p_disconnect_Fourniture (class Fourniture& a_Fourniture); public: class pompe* pompe; void set_pompe (class pompe& a_pompe); void unset_pompe (); public: void p_connect_pompe (class pompe& a_pompe); void p_disconnect_pompe (class pompe& a_pompe); }; #endif Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-15 Fichier Client.C #include "client.h" #include <string.h> client::client(char* NV) { GenInit(); NumeroVehicule = new char[strlen(NV)+1]; strcpy(NumeroVehicule,NV); } client::~client() { delete NumeroVehicule; } void client::GenInit() { pompe = 0; pistolet = 0; } void client::set_pistolet (class pistolet& a_pistolet) { p_connect_pistolet(a_pistolet); a_pistolet.p_connect_client(*this); } void client::unset_pistolet () { if (pistolet) pistolet->p_disconnect_client(*this); p_disconnect_pistolet(*pistolet); } void client::p_connect_pistolet (class pistolet& a_pistolet) { unset_pistolet(); pistolet = &a_pistolet; A-16 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 } void client::p_disconnect_pistolet (class pistolet& a_pistolet) { assert(&a_pistolet == pistolet); pistolet = 0; } void client::set_pompe (class pompe& a_pompe) { p_connect_pompe(a_pompe); a_pompe.p_connect_client(*this); } void client::unset_pompe () { if (pompe) pompe->p_disconnect_client(*this); p_disconnect_pompe(*pompe); } void client::p_connect_pompe (class pompe& a_pompe) { unset_pompe(); pompe = &a_pompe; } void client::p_disconnect_pompe (class pompe& a_pompe) { assert(&a_pompe == pompe); pompe = 0; } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-17 Fichier Client.h #ifndef _CLIENT_H_ #define _CLIENT_H_ #include "pistolet.h" #include <assert.h> #include "pompe.h" class client { public: char * NumeroVehicule; client(char* NV); ~client(); private: void GenInit(); public: class pistolet* pistolet; void set_pistolet (class pistolet& a_pistolet); void unset_pistolet (); public: void p_connect_pistolet (class pistolet& a_pistolet); void p_disconnect_pistolet (class pistolet& a_pistolet); public: class pompe* pompe; void set_pompe (class pompe& a_pompe); void unset_pompe (); public: void p_connect_pompe (class pompe& a_pompe); void p_disconnect_pompe (class pompe& a_pompe); }; #endif A-18 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier embrayage.C #include "embrayage.h" #include <iostream.h> int embrayage::Liberer() { cout << "embrayage libere" <<endl; return 0; } int embrayage::Engager() { cout << "embrayage engage" <<endl; return 1; } void embrayage::GenInit() { pompe = 0; pistolet = 0; } embrayage::embrayage() { GenInit(); } void embrayage::set_pistolet (class pistolet& a_pistolet) { p_connect_pistolet(a_pistolet); a_pistolet.p_connect_embrayage(*this); } void embrayage::unset_pistolet() { if (pistolet) pistolet->p_disconnect_embrayage(*this); Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-19 p_disconnect_pistolet(*pistolet); } void embrayage::p_connect_pistolet (class pistolet& a_pistolet) { unset_pistolet(); pistolet = &a_pistolet; } void embrayage::p_disconnect_pistolet(class pistolet& a_pistolet) { assert(&a_pistolet == pistolet); pistolet = 0; } void embrayage::set_pompe (class pompe& a_pompe) { p_connect_pompe(a_pompe); a_pompe.p_connect_ptremb(*this); } void embrayage::unset_pompe() { if (pompe) pompe->p_disconnect_ptremb(*this); p_disconnect_pompe(*pompe); } void embrayage::p_connect_pompe (class pompe& a_pompe) { unset_pompe(); pompe = &a_pompe; } void embrayage::p_disconnect_pompe(class pompe& a_pompe) { assert(&a_pompe == pompe); pompe = 0; } A-20 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier embrayage.h #ifndef _EMBRAYAGE_H_ #define _EMBRAYAGE_H_ #include "pistolet.h" #include <assert.h> #include "pompe.h" class embrayage { public: int Liberer(); int Engager(); embrayage(); private: void GenInit(); public: class pistolet* pistolet; void set_pistolet (class pistolet& a_pistolet); void unset_pistolet (); public: void p_connect_pistolet (class pistolet& a_pistolet); void p_disconnect_pistolet (class pistolet& a_pistolet); public: class pompe* pompe; void set_pompe (class pompe& a_pompe); void unset_pompe (); public: void p_connect_pompe (class pompe& a_pompe); void p_disconnect_pompe (class pompe& a_pompe); }; #endif Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-21 Fichier gerant.C #include "gerant.h" void gerant::GenInit() { Terminal = 0; } gerant::gerant() { GenInit(); } void gerant::set_Terminal (class Terminal& a_Terminal) { p_connect_Terminal(a_Terminal); a_Terminal.p_connect_gerant(*this); } void gerant::unset_Terminal () { if (Terminal) Terminal->p_disconnect_gerant(*this); p_disconnect_Terminal(*Terminal); } void gerant::p_connect_Terminal (class Terminal& a_Terminal) { unset_Terminal(); Terminal = &a_Terminal; } void gerant::p_disconnect_Terminal (class Terminal& a_Terminal) { assert(&a_Terminal == Terminal); Terminal = 0; } A-22 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier gerant.h #ifndef _GERANT_H_ #define _GERANT_H_ #include <assert.h> #include "Terminal.h" class gerant { public: gerant(); private: void GenInit(); public: class Terminal* Terminal; void set_Terminal (class Terminal& a_Terminal); void unset_Terminal (); public: void p_connect_Terminal (class Terminal& a_Terminal); void p_disconnect_Terminal (class Terminal& a_Terminal); }; #endif Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-23 Fichier moteur.c #include "moteur.h" #include <iostream.h> int moteur::Demarrer() { etat = 1; cout << "moteur demarre" << endl; return 1; } int moteur::Arreter() { etat = 0; cout << "moteur arrete" << endl; return 0; } moteur::moteur() { GenInit(); etat = 0; } void moteur::GenInit() { pompe = 0; } void moteur::set_pompe (class pompe& a_pompe) { p_connect_pompe(a_pompe); a_pompe.p_connect_ptrmot(*this); A-24 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 } void moteur::unset_pompe() { if (pompe) pompe->p_disconnect_ptrmot(*this); p_disconnect_pompe(*pompe); } void moteur::p_connect_pompe (class pompe& a_pompe) { unset_pompe(); pompe = &a_pompe; } void moteur::p_disconnect_pompe(class pompe& a_pompe) { assert(&a_pompe == pompe); pompe = 0; } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-25 Fichier moteur.h #ifndef _MOTEUR_H_ #define _MOTEUR_H_ #include <assert.h> #include "pompe.h" class moteur { public: int etat; int Demarrer(); int Arreter(); moteur(); private: void GenInit(); public: class pompe* pompe; void set_pompe (class pompe& a_pompe); void unset_pompe (); public: void p_connect_pompe (class pompe& a_pompe); void p_disconnect_pompe (class pompe& a_pompe); }; #endif A-26 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier pistolet.C #include "pistolet.h" #include <iostream.h> int pistolet::AppuiGachette(tProduit typess) { cout << "la gachette est appuye" << endl; this->pompe->Timer->Armer(); this->embrayage->Engager(); return 1; } int pistolet::RelacherGachette() { int tps; cout << "la gachette est relache" << endl; tps = this->pompe->Timer->Arreter(); this->embrayage->Liberer(); this->pompe->ptraff->Fourniture->Init(tps); return 0; } int pistolet::Autoriser() { if (etat == 0) { etat = 1; return 1; } else return 0; } int pistolet::Interdire() { Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-27 if (etat == 1) { etat = 0; return 1; } else return 0; } pistolet::pistolet() { GenInit(); etat = 0; } void pistolet::GenInit() { embrayage = 0; pompe = 0; client = 0; } void pistolet::set_client (class client& a_client) { p_connect_client(a_client); a_client.p_connect_pistolet(*this); } void pistolet::unset_client() { if (client) client->p_disconnect_pistolet(*this); p_disconnect_client(*client); } void pistolet::p_connect_client (class client& a_client) { unset_client(); client = &a_client; } void pistolet::p_disconnect_client(class client& a_client) { assert(&a_client == client); client = 0; } A-28 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 void pistolet::set_pompe (class pompe& a_pompe) { p_connect_pompe(a_pompe); a_pompe.p_connect_ptrpis(*this); } void pistolet::unset_pompe() { if (pompe) pompe->p_disconnect_ptrpis(*this); p_disconnect_pompe(*pompe); } void pistolet::p_connect_pompe (class pompe& a_pompe) { unset_pompe(); pompe = &a_pompe; } void pistolet::p_disconnect_pompe(class pompe& a_pompe) { assert(&a_pompe == pompe); pompe = 0; } void pistolet::set_embrayage (class embrayage& a_embrayage) { p_connect_embrayage(a_embrayage); a_embrayage.p_connect_pistolet(*this); } void pistolet::unset_embrayage () { if (embrayage) embrayage->p_disconnect_pistolet(*this); p_disconnect_embrayage(*embrayage); } void pistolet::p_connect_embrayage (class embrayage& a_embrayage) { unset_embrayage(); embrayage = &a_embrayage; } void pistolet::p_disconnect_embrayage (class embrayage& a_embrayage) { assert(&a_embrayage == embrayage); embrayage = 0; } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-29 Fichier pistolet.h #ifndef _PISTOLET_H_ #define _PISTOLET_H_ #include "client.h" #include "pompe.h" #include <assert.h> #include "embrayage.h" #ifndef TPRODUIT #define TPRODUIT typedef enum { essence, super } tProduit; #endif class pistolet { public: int etat; int AppuiGachette(tProduit typess); int RelacherGachette(); int Autoriser(); int Interdire(); pistolet(); private: void GenInit(); public: class client* client; void set_client (class client& a_client); void unset_client (); public: void p_connect_client (class client& a_client); void p_disconnect_client (class client& a_client); public: class pompe* pompe; void set_pompe (class pompe& a_pompe); void unset_pompe (); public: void p_connect_pompe (class pompe& a_pompe); void p_disconnect_pompe (class pompe& a_pompe); public: class embrayage* embrayage; void set_embrayage (class embrayage& a_embrayage); void unset_embrayage (); public: void p_connect_embrayage (class embrayage& a_embrayage); A-30 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 void p_disconnect_embrayage (class embrayage& a_embrayage); }; #endif Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-31 Fichier pompe.C #include "Fourniture.h" #include "pompe.h" #include <iostream.h> pompe::pompe(int num, int valetat) { GenInit(); Numero = num; Status = valetat; ptrpis = new pistolet; ptrmot = new moteur; ptraff = new afficheur; ptremb = new embrayage; ptrpis->p_connect_pompe(*this); ptrmot->p_connect_pompe(*this); ptraff->p_connect_pompe(*this); ptremb->p_connect_pompe(*this); } int pompe::DecrocherPistolet() { if (this->ptrpis->Autoriser()) { cout << "Le pistolet est decroche" << endl; return 1; } else return 0; } int pompe::RaccrocherPistolet() { if (this->ptrpis->Interdire()) { this->ptrmot->Arreter(); cout << "Le pistolet est raccroche" << endl; this->ptraff->Afficher(); A-32 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 EnvoiFourniture(this->ptraff->Lecture()); return 1; } else return 0; } int pompe::TestPompe() { if (this->reservoir->TestNiveau()) { if (this->ptrmot->Demarrer()) { this->ptraff->Raz(); return 1; } else return 0; } else return 0; } int pompe::EnvoiFourniture(class Fourniture &Carburant) { char * reponse; reponse = "carte bancaire"; this->reservoir->RemiseANiveau((int)Carburant.Volume); cout << endl; cout << "mode de paiement :"; cin >> reponse; cout << endl; this->transaction->Initialiser(Carburant,Numero,this->client>NumeroVehicule, reponse); return 1; } pompe::~pompe() { delete ptrpis; delete ptrmot; Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-33 delete ptremb; delete ptraff; } void pompe::GenInit() { ptraff = 0; Terminal = 0; reservoir = 0; client = 0; ptremb = 0; ptrmot = 0; ptrpis = 0; transaction = 0; Timer = 0; } void pompe::set_Timer (class Timer& a_Timer) { p_connect_Timer(a_Timer); a_Timer.p_connect_pompe(*this); } void pompe::unset_Timer() { if (Timer) Timer->p_disconnect_pompe(*this); p_disconnect_Timer(*Timer); } void pompe::p_connect_Timer (class Timer& a_Timer) { unset_Timer(); Timer = &a_Timer; } void pompe::p_disconnect_Timer(class Timer& a_Timer) { assert(&a_Timer == Timer); Timer = 0; } void pompe::set_transaction (class transaction& a_transaction) { p_connect_transaction(a_transaction); a_transaction.p_connect_pompe(*this); } void pompe::unset_transaction () { A-34 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 if (transaction) transaction->p_disconnect_pompe(*this); p_disconnect_transaction(*transaction); } void pompe::p_connect_transaction (class transaction& a_transaction) { unset_transaction(); transaction = &a_transaction; } voidpompe::p_disconnect_transaction(classtransaction&a_transaction) { assert(&a_transaction == transaction); transaction = 0; } void pompe::set_ptrpis (class pistolet& a_ptrpis) { p_connect_ptrpis(a_ptrpis); a_ptrpis.p_connect_pompe(*this); } void pompe::unset_ptrpis () { if (ptrpis) ptrpis->p_disconnect_pompe(*this); p_disconnect_ptrpis(*ptrpis); } void pompe::p_connect_ptrpis (class pistolet& a_ptrpis) { unset_ptrpis(); ptrpis = &a_ptrpis; } void pompe::p_disconnect_ptrpis (class pistolet& a_ptrpis) { assert(&a_ptrpis == ptrpis); ptrpis = 0; } void pompe::set_ptrmot (class moteur& a_ptrmot) { p_connect_ptrmot(a_ptrmot); a_ptrmot.p_connect_pompe(*this); } void pompe::unset_ptrmot () { if (ptrmot) ptrmot->p_disconnect_pompe(*this); p_disconnect_ptrmot(*ptrmot); } void pompe::p_connect_ptrmot (class moteur& a_ptrmot) { unset_ptrmot(); Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-35 ptrmot = &a_ptrmot; } void pompe::p_disconnect_ptrmot (class moteur& a_ptrmot) { assert(&a_ptrmot == ptrmot); ptrmot = 0; } void pompe::set_ptremb (class embrayage& a_ptremb) { p_connect_ptremb(a_ptremb); a_ptremb.p_connect_pompe(*this); } void pompe::unset_ptremb () { if (ptremb) ptremb->p_disconnect_pompe(*this); p_disconnect_ptremb(*ptremb); } void pompe::p_connect_ptremb (class embrayage& a_ptremb) { unset_ptremb(); ptremb = &a_ptremb; } void pompe::p_disconnect_ptremb (class embrayage& a_ptremb) { assert(&a_ptremb == ptremb); ptremb = 0; } void pompe::set_client (class client& a_client) { p_connect_client(a_client); a_client.p_connect_pompe(*this); } void pompe::unset_client() { if (client) client->p_disconnect_pompe(*this); p_disconnect_client(*client); } void pompe::p_connect_client (class client& a_client) { unset_client(); client = &a_client; } void pompe::p_disconnect_client(class client& a_client) { assert(&a_client == client); client = 0; A-36 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 } void pompe::set_reservoir (class reservoir& a_reservoir) { p_connect_reservoir(a_reservoir); a_reservoir.p_connect_pompe(*this); } void pompe::unset_reservoir() { if (reservoir) reservoir->p_disconnect_pompe(*this); p_disconnect_reservoir(*reservoir); } void pompe::p_connect_reservoir (class reservoir& a_reservoir) { unset_reservoir(); reservoir = &a_reservoir; } void pompe::p_disconnect_reservoir(class reservoir& a_reservoir) { assert(&a_reservoir == reservoir); reservoir = 0; } void pompe::set_Terminal (class Terminal& a_Terminal) { p_connect_Terminal(a_Terminal); a_Terminal.p_connect_pompe(*this); } void pompe::unset_Terminal() { if (Terminal) Terminal->p_disconnect_pompe(*this); p_disconnect_Terminal(*Terminal); } void pompe::p_connect_Terminal (class Terminal& a_Terminal) { unset_Terminal(); Terminal = &a_Terminal; } void pompe::p_disconnect_Terminal(class Terminal& a_Terminal) { assert(&a_Terminal == Terminal); Terminal = 0; } void pompe::set_ptraff (class afficheur& a_ptraff) { p_connect_ptraff(a_ptraff); a_ptraff.p_connect_pompe(*this); } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-37 void pompe::unset_ptraff () { if (ptraff) ptraff->p_disconnect_pompe(*this); p_disconnect_ptraff(*ptraff); } void pompe::p_connect_ptraff (class afficheur& a_ptraff) { unset_ptraff(); ptraff = &a_ptraff; } void pompe::p_disconnect_ptraff (class afficheur& a_ptraff) { assert(&a_ptraff == ptraff); ptraff = 0; } A-38 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier pompe.h #ifndef _POMPE_H_ #define _POMPE_H_ #include "Timer.h" #include "transaction.h" #include "pistolet.h" #include "moteur.h" #include "embrayage.h" #include "client.h" #include "reservoir.h" #include "Terminal.h" #include <assert.h> #include "afficheur.h" class pompe { public: int Numero; int Status; pompe(int num, int valetat); int DecrocherPistolet(); int RaccrocherPistolet(); int TestPompe(); int EnvoiFourniture(class Fourniture &Carburant); ~pompe(); private: void GenInit(); public: class Timer* Timer; void set_Timer (class Timer& a_Timer); void unset_Timer (); public: void p_connect_Timer (class Timer& a_Timer); void p_disconnect_Timer (class Timer& a_Timer); public: class transaction* transaction; void set_transaction (class transaction& a_transaction); void unset_transaction (); public: void p_connect_transaction (class transaction& a_transaction); void p_disconnect_transaction (class transaction& a_transaction); public: class pistolet* ptrpis; void set_ptrpis (class pistolet& a_ptrpis); Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-39 void unset_ptrpis (); public: void p_connect_ptrpis (class pistolet& a_ptrpis); void p_disconnect_ptrpis (class pistolet& a_ptrpis); public: class moteur* ptrmot; void set_ptrmot (class moteur& a_ptrmot); void unset_ptrmot (); public: void p_connect_ptrmot (class moteur& a_ptrmot); void p_disconnect_ptrmot (class moteur& a_ptrmot); public: class embrayage* ptremb; void set_ptremb (class embrayage& a_ptremb); void unset_ptremb (); public: void p_connect_ptremb (class embrayage& a_ptremb); void p_disconnect_ptremb (class embrayage& a_ptremb); public: class client* client; void set_client (class client& a_client); void unset_client (); public: void p_connect_client (class client& a_client); void p_disconnect_client (class client& a_client); public: class reservoir* reservoir; void set_reservoir (class reservoir& a_reservoir); void unset_reservoir (); public: void p_connect_reservoir (class reservoir& a_reservoir); void p_disconnect_reservoir (class reservoir& a_reservoir); public: class Terminal* Terminal; void set_Terminal (class Terminal& a_Terminal); void unset_Terminal (); public: void p_connect_Terminal (class Terminal& a_Terminal); void p_disconnect_Terminal (class Terminal& a_Terminal); public: class afficheur* ptraff; void set_ptraff (class afficheur& a_ptraff); void unset_ptraff (); public: void p_connect_ptraff (class afficheur& a_ptraff); void p_disconnect_ptraff (class afficheur& a_ptraff); A-40 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 }; #endif Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-41 Fichier reservoir.C #include "reservoir.h" #include <iostream.h> reservoir::reservoir(int id, int qte) { GenInit(); numero = id; capacite = qte; } int reservoir::TestNiveau() { if (capacite <= 100) return 0; else return 1; } void reservoir::RemiseANiveau(int qte) { capacite = capacite - qte; cout << endl; cout << "qte reservoir : " << capacite << endl; } void reservoir::GenInit() { pompe = 0; } void reservoir::set_pompe (class pompe& a_pompe) { p_connect_pompe(a_pompe); a_pompe.p_connect_reservoir(*this); } A-42 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 void reservoir::unset_pompe () { if (pompe) pompe->p_disconnect_reservoir(*this); p_disconnect_pompe(*pompe); } void reservoir::p_connect_pompe (class pompe& a_pompe) { unset_pompe(); pompe = &a_pompe; } void reservoir::p_disconnect_pompe (class pompe& a_pompe) { assert(&a_pompe == pompe); pompe = 0; } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-43 Fichier reservoir.h #ifndef _RESERVOIR_H_ #define _RESERVOIR_H_ #include <assert.h> #include "pompe.h" class reservoir { public: int numero; int capacite; reservoir(int id, int qte); int TestNiveau(); void RemiseANiveau(int qte); private: void GenInit(); public: class pompe* pompe; void set_pompe (class pompe& a_pompe); void unset_pompe (); public: void p_connect_pompe (class pompe& a_pompe); void p_disconnect_pompe (class pompe& a_pompe); }; #endif A-44 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier scenario.c //scenario.C #include #include #include #include #include #include #include #include #include #include #include #include #include "afficheur.h" "client.h" "embrayage.h" "Fourniture.h" "gerant.h" "moteur.h" "pistolet.h" "pompe.h" "reservoir.h" "Terminal.h" "Timer.h" "transaction.h" <iostream.h> int main(void) { char reponse; char choixess; int rep; tProduit chxpdt; //construction des instances pompe PompeA(1,0); Terminal TerminalG; gerant Jacques; client Pierre("666MM69"); transaction transac1; Timer horloge; //construction des associations PompeA.ptrpis->set_embrayage( * PompeA.ptremb); PompeA.set_Timer(horloge); PompeA.set_transaction(transac1); Jacques.set_Terminal(TerminalG); TerminalG.set_pompe(PompeA); TerminalG.set_transaction(transac1); Pierre.set_pompe(PompeA); Pierre.set_pistolet( * PompeA.ptrpis); Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-45 //debut scenario reponse = 'x'; while(reponse != 'e' && reponse != 's') { cout << "quel type de carburant voulez vous? essence (e) ou super (s) ? : "; cin >> reponse; cout << endl; } choixess = reponse; if (choixess=='e') { chxpdt = essence; reservoir Reserv(1,1000); PompeA.set_reservoir(Reserv); } else { chxpdt=super; reservoir Reserv(2,1000); PompeA.set_reservoir(Reserv); } Fourniture livraison(chxpdt); PompeA.ptraff->set_Fourniture(livraison); Jacques.Terminal->AutoriserPompe(); while(reponse != 'd') { cout << endl; cout << "pour decrocher le pistolet, appuyez sur d :"; cin >> reponse; cout << endl; } Pierre.pompe->DecrocherPistolet(); while(reponse != 'a') { cout << endl; cout << "pour appuyer sur la gachette, appuyez sur a :"; A-46 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 cin >> reponse; cout << endl; } if (choixess == 'e') rep = Pierre.pistolet->AppuiGachette(essence); else rep = Pierre.pistolet->AppuiGachette(super); while(reponse != 'l') { cout << endl; cout << "pour relacher la gachette, appuyez sur l :"; cin >> reponse; cout << endl; } Pierre.pistolet->RelacherGachette(); while(reponse != 'r') { cout << endl; cout << "pour raccrocher le pistolet appuyez sur r :"; cin >> reponse; cout << endl; } Pierre.pompe->RaccrocherPistolet(); } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-47 Fichier transaction.C #include "transaction.h" #include "Fourniture.h" #include <string.h> void transaction::Initialiser(class Fourniture &carb, int numppe, char* numveh, char* rque) { cout = carb.Cout; volume = carb.Volume; produit = carb.Produit; NumeroPompe = numppe; NumeroVehicule = new char(strlen(numveh)+1); strcpy(NumeroVehicule , numveh); Remarque = new char(strlen(rque)+1); strcpy(Remarque , rque); this->Terminal->SaisiePaiement(*this); } void transaction::GenInit() { Terminal = 0; pompe = 0; } transaction::transaction() { GenInit(); } void transaction::set_pompe (class pompe& a_pompe) { p_connect_pompe(a_pompe); a_pompe.p_connect_transaction(*this); } void transaction::unset_pompe() { A-48 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 if (pompe) pompe->p_disconnect_transaction(*this); p_disconnect_pompe(*pompe); } void transaction::p_connect_pompe (class pompe& a_pompe) { unset_pompe(); pompe = &a_pompe; } void transaction::p_disconnect_pompe(class pompe& a_pompe) { assert(&a_pompe == pompe); pompe = 0; } void transaction::set_Terminal (class Terminal& a_Terminal) { p_connect_Terminal(a_Terminal); a_Terminal.p_connect_transaction(*this); } void transaction::unset_Terminal () { if (Terminal) Terminal->p_disconnect_transaction(*this); p_disconnect_Terminal(*Terminal); } void transaction::p_connect_Terminal (class Terminal& a_Terminal) { unset_Terminal(); Terminal = &a_Terminal; } void transaction::p_disconnect_Terminal (class Terminal& a_Terminal) { assert(&a_Terminal == Terminal); Terminal = 0; } Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-49 Fichier transaction.h #ifndef _TRANSACTION_H_ #define _TRANSACTION_H_ #include "pompe.h" #include <assert.h> #include "Terminal.h" #ifndef TPRODUIT #define TPRODUIT typedef enum { essence, super } tProduit; #endif class transaction { public: int cout; float volume; tProduit produit; int NumeroPompe; char * NumeroVehicule; char * Remarque; void Initialiser(class Fourniture &carb, int numppe, char* numveh, char* rque); transaction(); private: void GenInit(); public: class pompe* pompe; void set_pompe (class pompe& a_pompe); void unset_pompe (); public: void p_connect_pompe (class pompe& a_pompe); void p_disconnect_pompe (class pompe& a_pompe); public: class Terminal* Terminal; void set_Terminal (class Terminal& a_Terminal); void unset_Terminal (); public: void p_connect_Terminal (class Terminal& a_Terminal); void p_disconnect_Terminal (class Terminal& a_Terminal); }; #endif A-50 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Fichier de compilation CC afficheur.C client.C embrayage.C Fourniture.C gerant.C moteur.C pistolet.C pompe.C reservoir.C scenario.C Terminal.C Timer.C transaction.C -o exo Corrections de l’étude de cas Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 A-51 A-52 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Index A Abstract Data Type 3-25 Abstraction 1-9 ActiveX 4-13 ADT 3-7 AGL 3-57 Agrégation 1-15, 2-45 Analyzer 3-63 Applet 3-29 association 1-15, 2-43 Association lien donnée 2-45 B Base de données Objet intégrée 4-35 BOOCH 2-31 Borland C++ 3-60, 3-61 bytecode 3-33 C C++ 3-13, 3-25 cardinalité 2-43 CASE 3-55 CLASSE-RELATION 2-32, 2-33 Classification 1-4, 1-7 CLOS 3-11 Coad-Yourdon 2-31 COM 4-12 Common Object Model 4-12 Common Object Service Submission 4-5 Common Request Broker Architecture 4-5 Communication par messages 1-4 constructeur 3-39 CORBA 3-57, 4-5, 4-18, 4-19 CORBA 1.1 4-3 CORBA 2.0 4-3 COSS 4-5, 4-11 cycle de vie du logiciel 3-55 D Data Flow Diagram 2-57 DCE 4-13 DCOM 4-13 DDL 3-55 Debugger 3-63 destructeur 3-16, 3-17, 3-39 DFD 2-57 Diagramme d’états 2-55 Diagramme de classes 2-41 Diagramme de flux d’événements 2-53 Diagramme de flux de données 2-57 Diagramme de traces d’événements 2-51 diagrammes de flux successifs 2-9 DII 4-7 Distributed System Object Model 4-12 DML 4-32 DSOM 4-12, 4-13 Index-1 Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 Dynamic Invocation Interface 4-7 dynamicité 3-7 E ECMA 3-57 Eiffel 3-13, 3-23, 3-60 Encapsulation 1-4, 1-11 Environnements de développement 3-61 F fonctions virtuelles 3-11 FTP 3-27 FUSION 2-32, 2-33 JavaBeans 4-22, 4-23 JavaPlan 3-58, 3-59 JavaStudio 3-60 JDBC 4-24 K KEE 3-11 L L4G 3-61 librairie de classes graphiques 3-61 Liens dynamiques 3-11 liens statiques 3-11 M G Garbage collector 3-17 GemStone 4-33, 4-41 H héritages 3-49 Hierarchical Object Oriented Design 2-31 HOOD 2-31 HTTP 3-27 I Identité 1-7 Identité d’objet 3-8, 3-9 IDL 4-6, 4-7, 4-9, 4-18 IHM 3-55, 3-61 IIOP 4-12, 4-14, 4-15, 4-16, 4-17 Interface Definition Language 4-7 Interface Repository 4-6, 4-9 Internet 4-28 IR 4-6 J Java 3-11, 3-13, 3-59 Java DataBase Connectivity 4-24 Java RMI 4-18 Java WorkShop 3-60 Index-2 MakeTool 3-63 MCD 2-19 MCT 2-25 Merise 2-15 Merise objet 2-32 méthodes de décompositions fonctionnelles 2-7 Méthodes et encapsulation 3-9 Méthodes orientées Traitements 2-7, 2-8, 2-9, 2-10, 2-11, 2-12, 2-13 MLD 2-21 Modèle Conceptuel de Traitements 2-25 Modèle Dynamique 2-5, 2-15 Modèle Fonctionnel 2-5, 2-15 Modèle Opérationnel de Traitements 2-29 Modèle Organisationnel de Traitements 2-27 Modèle Physique de Données 2-23 Modèle Statique 2-5, 2-15 Modèle V3 du CODD 4-28 Modélisation Dynamique 2-48 Modélisation Fonctionnelle 2-56 Modélisation statique 2-40 Modularisation 1-4 MOpT 2-29 MOT 2-27 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 MPD 2-23 N NEO 4-12, 4-13 Network Environment Object 4-12 Networked Object Builder 4-15 new 3-43 O O2 4-35, 4-41 O2SQL 4-41 Object Adapter 4-9 Object Database Management Group 4-36 Object IDentifier 4-9 Object Modeling Technique 2-31, 2-39 Object Pascal 3-13 Object Request Broker 4-5, 4-7 ObjectBench 3-58 ObjectCenter 3-60, 3-61 Objecteam 3-58 Objecteering 3-58 ObjecTime 3-58 Objective C 3-11, 3-23, 3-59 ObjectPartner 3-58, 3-65 ObjectPartner BehaviorEditor 3-65 ObjectPartner FunctionEditor 3-65 ObjectPartner ObjectEditor 3-65 ObjectStore 4-33, 4-41 ObjectWorks 3-60 objets persistants 4-33 objets temporaires 4-33 ODMG 4-3, 4-37 OGL 3-55 OLE 4-12, 4-13 OMG 3-57, 4-3, 4-37 OMT 2-31, 2-33, 2-39 Ontos 4-41 OOA/D 2-31 OOA/OOD 2-31 OODCE 4-13 OPAL 4-32 opérations 3-9 OQL 4-38, 4-39 Oracle V8 4-28 ORB 4-5, 4-7, 4-20 Orbix 4-12, 4-13, 4-17 OrbixWEB 4-17 Orion 4-41 P P.O.E.T. 4-41 Paradigm 3-58 PCTE 3-57 Persistance 3-4 Polymorphisme 1-4, 1-21, 3-6, 3-11 POSTGRES 4-28 private 3-35, 3-37 propriétés privées 1-11 propriétés publiques 1-11 protected 3-35, 3-37 public 3-35, 3-37 R RAD 4-22 ramasse-miettes 3-41 référentiel 3-57 Remote Method Invocation 4-18 ROOM 2-32, 2-33 Rose 3-60 Rumbaugh 2-31 S Select/omt 3-58 SGBD 3-4, 4-24 SGBDRE 4-28, 4-29 Shlaer et Mellor 2-31 signature 3-9 Simula 3-11, 3-23 skeletons 4-9 Smalltalk 3-11, 3-21, 4-37 SMTP 3-27 SourceBrowser 3-63 SQL 4-24 SQL SERVER de Microsoft 4-28 SQL2 4-25 SQL3 4-29 SSADM 2-15 Index-3 Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999 StP 3-58 stubs 4-9 Systèmes de Gestion de Bases de Données Relationnelles Etendus 4-28 T Typage des données d’un objet 3-9 typage dynamique 3-9 typage statique 3-9 Types abstraits 3-6 U UML 2-32 Unified Modeling Language 2-32 UniSQL 4-28 upper case 3-59 V Versant 4-41 Virtualité 3-13 virtualité 3-7 Visual Age 3-60 Visual C++ 3-60, 3-61 Visual Cafe 3-60 Visual Studio 3-60 W Westmount 3-58 WorkShop 3-61 WorkShop C++ 3-60 WorkShop NEO 4-15 X X/Open 4-3 X-Designer 3-63 Index-4 Concepts et méthodologie Objet illustrés par Java et C++ Copyright February 2, 1999 Sun Microsystems, Inc. Tous droits réservés. SunService Fevrier 1999