Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parJuliette Duquette Modifié depuis plus de 8 années
1
Héritage Et la réutilisation de code
2
2 Une nouvelle entreprise u Est-ce qu’une petite entreprise peut survivre sur la vente de composants logiciels ? äUn composant est une classe (ou ensemble des classes) u Avec la documentation correspondante ! äLes librairies Java (JDK) montrent qu’une clientèle pour des composants pré-développés existe u Les éléments en faveur de l’entreprise ä1. Elle est reliée aux clients via l'Internet Et le nombre de clients potentiels est gigantesque Elle livre ses marchandises directement aux clients u Frais de transport minimaux !
3
3 Succès de l’entreprise u 2. Les clients (des programmeurs) savent que le développement coûte äIl est plus sage d’acheter un composant que de le faire soi- même Un composant est complexe (p.ex: un driver) et on ne possède ni le temps ni le savoir faire pour le développer Un composant est un standard, et on est obligé de l’utiliser u P.ex: les drivers pour les dispositifs matériels, le code pour le chiffrement, les outils systèmes de communication La programmation d’un composant non-erroné reste une tâche difficile
4
4 Succès de l’entreprise u 3. Une classe est liée dynamiquement aux applications äUn programmeur n’a pas besoin d’avoir tout le code à la compilation ou à l’installation Parmi ses clients se trouvent tout ceux qui font de la maintenance et la mise à jour des applications !!! u 4. Les clients peuvent espérer un niveau supérieur de äFiabilité : les composants sont utilisés, et donc testés, plus souvent äCompatibilité : assurée par la présence d’interfaces standards dans le système
5
5 Succès de l’entreprise... u 5. On aide le client à faire du prototypage rapide (rapid prototyping) äLe but du client est toujours de développer le plus vite possible äMais parfois la spécification n’est pas claire ; le client ne sait pas à 100% ce qu’il veut Alors on construit une première version pour voir si elle marche et puis on le modifie petit à petit u La programmation à base de composants facilite le prototypage rapide puisque les composants sont encapsulés
6
6.. mais les problèmes surviennent ! u Après un moment, le gestion du rayon des composants commence à poser de problèmes äElle dépend trop des notions de classe et d’objet ! u 1. Trop de redondance dans le code äP.ex: les classes Carré et Cercle (dans Cours 2) possèdent 80% de code en commun ! Trop de temps perdu dans le développement Rappel: le but dans le développement est de réutiliser l’expérience ainsi que le code (pour le fournisseur aussi !)
7
7 Les problèmes de l’entreprise u 2. Un composant ne satisfait pas les besoins à 100% äUn cercle possède une couleur ne peut pas être représenté par notre classe Cercle äLa classe StockProduit (cf. TP 2) est-elle adéquate pour la représentation des livres dans une bibliothèque ? äUn document dans une bibliothèque peut-être représenté par une classe Document Les messages comprennent date(), texte() Mais désormais, un document est multimédia u Il contient du son, des images, u Comment peut-on adapter les classes comme Document ?
8
8 Les problèmes de l’entreprise u 3. Recherche de composants äComment retrouver le composant qu’on cherche dans un vaste rayon de classes ? Parfois on recherche un ensemble de classes pour une tache (un framework ou un pattern) On peut chercher une classe à partir de son interface ou d’un descriptif textuel de son comportement u Ces besoins nécessitent l’utilisation d’une base de données avancée äEt lorsqu’on trouve une classe, comment vérifier qu’elle corresponde exactement aux besoins du programmeur ?
9
9 Les problèmes de l’entreprise u 4. Protection de droits de vente (le piratage) äMême si l’entrepreneur demande de paiement pour ses composants Ses composants peuvent être facilement réutilisés ou copiés sans que l’entreprise ne reçoive un paiement äCe problème nécessite des solutions techniques ainsi que juridiques Aspects techniques : cours sur la mise en œuvre des langages orientés-objets Aspects juridiques : cours Outils-Internet (D. Tsichritzis)
10
10 Héritage - Rappel u L'héritage permet de définir une classe B à partir d’une classe existante A äB est une sous-classe de A äS’adresse aux problèmes 1 et 2 de l’entreprise u B peut comprendre plus de messages qu’A u B peut définir ses propres versions des méthodes qui sont définies dans A äCe mécanisme s’appelle overloading
11
11 Exemple de Carré et Cercle u Les classes Carré et Cercle partagent äUn positionnement sur la grille Les variables x et y äLes méthodes xCoord(), yCoord(), dessiner(), et bouger() u Approche programmation objet äOn définit une classe Forme qui contient ces variables et ces méthodes äCarré et Cercle héritent de la classe Forme
12
12 Exemple: classe Forme class Forme{ int x, y; public Forme(int a, int b) { x=a; y=b;} public void bouger(int a,int b) { x = a; y = b;} /* La méthode surface() */ public float surface(){ return 0;} public int xCoord() { return x;} public int yCoord() { return y;} public void dessiner() { Ecran.afficher(this) } }
13
13 Exemple: classe Cercle class Cercle extends Forme{ int radius; /* les variables x et y sont définies implicitement */ public Cercle(int a, int b, int r) {/* on invoque le constructeur de la super-classe */ super(a,b); radius = r;} public float surface() { return 3.14*radius * radius} /* Les méthodes bouger(), xCoord(), yCoord(), dessiner() sont implicitement définies */ } Note : Over-loading de la méthode surface()
14
14 Utilisation de l’héritage u Regrouper les fonctionnalités communes äP.ex: la classe Forme regroupe la fonctionnalité commune aux classes Carré et Cercle äEn Java, toute classe hérite directement ou indirectement de la classe Object La classe Object définit les méthodes dont toute classe a besoin u P.ex: les sémaphores pour la synchronisation u L’héritage est donc un moyen important pour la réutilisation du code et de l’expérience äOutil important de développement
15
15 Utilisation de l’héritage u L’héritage permet la spécialisation d’un composant äP.ex: Cercle est une forme spécialisée de Forme u L’héritage définit une relation est-une entre classes u Cercle est une (spécialisation de la classe) Forme äC-à-d : un Cercle est-une Forme On peut donc utiliser un Cercle au lieu d’une Forme Voilà pourquoi les objets de la classe Cercle doivent comprendre tous les messages qui sont compris par la classe Forme äOutil important d’exécution
16
16 L’utilisation de l'héritage Cercle c1 = new Cercle(2,3,4); Carre c2 = new Carre (3,6,7,4); Forme F; F = c1; F.dessiner() System.out.print(«Surface est» + F.surface()); F = c2; F.dessiner() System.out.print(«Surface est» + F.surface()); u La relation est-une spécifie quand un composant peut être remplacé par un autre u Liaison dynamique: La variable F peut référencer un objet de la classe Forme, de la classe Carré, ou de la classe Cercle au cours de son existence
17
17 L’utilisation de l'héritage u La liaison dynamique est la base de l'extensibilité dans la programmation objet Et de la maintenance des systèmes äPour “F.surface()”, on ne sait pas à la compilation, quel est le code qui sera exécuté La méthode surface() de Forme, de Carré ou de Cercle u À la différence des librairies en C où le code est recherché à la compilation De nouveau code (via des nouvelles classes) peut être introduit dynamiquement sans même arrêter l’application qui tourne Ceci permet de remplacer un composant (p.ex: un objet Forme) avec un autre (p.ex: un objet Cercle)
18
18 Héritage multiple u Dans quelques langages à objets, une classe peut hériter de plusieurs classes äUne classe peut ainsi être définie comme une généralisation de plusieurs classes äC++ et Eiffel mettent en œuvre de l'héritage multiple u La classe Mémoire-Sûre représente une page de mémoire qu’on peut chiffrer et déchiffrer CryptoMemoire Memoire Sûre Chiffrer() et Déchiffrer() Chiffrer() et Déchiffrer(), lire(), écrire() et swap() lire(), écrire() et swap()
19
19 Héritage multiple u L’héritage multiple pose des problèmes pour le gestion de noms äP.ex: supposons que la classe Mémoire et la classe Crypto définissent une variable r äSelon le principe de l’héritage, toute variable déclarée dans une classe est implicitement déclarée dans une sous-classe äAlors, quelle est la signification de r dans la classe Mémoire-Sûr ? u Ce problème a poussé les concepteurs de Java de n’utiliser que de l’héritage simple
20
20 Les 2 buts de l’héritage (multiple) u 1. Réutiliser du code de plusieurs sources dans une nouvelle classe u 2. Construire une classe qui peut être utilisée en place de plusieurs classes äP.ex: un objet Mémoire-Sûre peut être utilisé en place d’un objet Crypto, ou bien en place d’un objet Mémoire u En Java, une classe peut implanter plusieurs interfaces äAinsi, Java satisfait le deuxième but
21
21 La classe Object u Java possède une seule hiérarchie des classes À la différence de C++ äLa classe Object se trouve à la racine et implante les méthodes de base u P.ex: equals(), hashcode(), clone(), getClass() Donc, tout objet comprend un minimum de messages u La généricité äP.ex: Une classe Chiffrement peut contenir une méthode public Object chiffrer(Object obj) qui opère sur n’importe quel objet !! u De n’importe quelle classe !
22
22 Coût de l'héritage u Un programme objet est généralement plus lent que le même programme écrit en C äPrincipalement à cause de la liaison dynamique de code u Complexité des programmes : äL’effet yo-yo : le comportement attendu d’un programme peut être défait par des sous-classes dynamiquement liées à l’application Pour comprendre un système, il faut comprendre toute sous- classe
23
La programmation objet L’enrichissement du modèle - 1. La destruction d’objets - 2. Le traitement des exceptions
24
24 La destruction d’objets u L'opérateur new() exécuté sur une classe crée un objet de cette classe äIl n’y a pas d'opérateur pour détruire un objet ! Et pour optimiser l’utilisation de la mémoire primaire de la machine, il faut enlever les objets qui ne sont pas utilisés u En C, les opérateurs malloc() et free() alloue et détruit les régions mémoires äMais leur utilisation s'avère trop susceptible aux erreurs de programmation Dans la programmation objet, un objet doit rester dans l’application jusqu’au moment où le runtime le supprime
25
25 La destruction d’objets u Un objet consomme du CPU & de la mémoire äEt doit être détruit lorsqu’il n’est plus utilisé par l’application u Un objet est une miette s’il n’est plus utilisable äSi aucun autre objet ne possède une référence sur cet objet äCar on ne peut pas envoyer un message à cet objet et donc, cet objet ne peut pas contribuer à l’application u Un processus de ramasse-miettes (garbage collection) tourne périodiquement pour enlever les miettes de la mémoire
26
26 Les exceptions u Le modèle d’objets simplifie la tolérance aux erreurs äUne erreur est contenue au sein d’un objet P.ex: un débordement de valeur dans la méthode surface() de Carré d’un objet n’influence pas les données dans un autre objet u Il faut un moyen de récupérer des erreurs, car äUn objet client qui envoie surface() à un objet (provoquant un débordement de valeur) reste bloqué äP.ex: on envoie un message à un objet qui se trouve sur une autre machine, et le réseau et stoppé …. (Trop) fréquente dans la programmation sur l’Internet
27
27 Les exceptions u Une exception est un événement anormal qui peut survenir dans un programme äElle doit être traitée pour que le programme puisse continuer u P.ex: en Java, FileNotFoundException, NullPointerException, ArrayIndexOutOfBoundsExceprion, UnknownHostException u 1. Il faut qu’un objet soit capable de signaler (throw) une exception à un autre objet u 2. Il faut qu’un objet puisse être notifié (catch) d’une exception
28
28 Les exceptions /* Dans Cercle */ public float surface() throws OverFlowException { if(radius>100000) /* pour éviter un débordement */ throw new OverFlowException(); else return radius*radius*3.14; } Pour signaler une exception u Une méthode doit spécifier dans son entête quelles sont les exceptions possibles äL’exception forme partie du contrat entre le programmeur et le client u Une exception est signalée avec l’opérateur throw
29
29 Les exceptions main(){ Cercle c1 = new Cercle(2,3,4); try {float f = c1.surface()} catch (OverFlowException e) { System.out.println("Caught exception" + e.toString();} finally {System.out.println("finally s’exécute toujours"); } u Dans le client, il faut vérifier si la méthode invoquée génère une exception ou pas ätry - catch - finally u try: essayer le code u catch : ce code s’exécute si l’objet appelé génère une exception
30
30 Les exceptions u Dans Java, une exception est aussi un objet ! äOn le crée de sa classe new OverFlowException() äOn peut lui envoyer des messages e.toString() äOn peut passer l’exception en paramètre à un autre objet äLa classe Throwable hérite de la classe Object class OverFlowException extends java.lang.Throwable{ public OverFlowException(){} public String toString(){ return new String(“Débordement de valeur”); }
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.