La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Héritage Et la réutilisation de code. 2 Une nouvelle entreprise u Est-ce qu’une petite entreprise peut survivre sur la vente de composants logiciels ?

Présentations similaires


Présentation au sujet: "Héritage Et la réutilisation de code. 2 Une nouvelle entreprise u Est-ce qu’une petite entreprise peut survivre sur la vente de composants logiciels ?"— Transcription de la présentation:

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”); }


Télécharger ppt "Héritage Et la réutilisation de code. 2 Une nouvelle entreprise u Est-ce qu’une petite entreprise peut survivre sur la vente de composants logiciels ?"

Présentations similaires


Annonces Google