Université A/Mira Béjaïa M1 : Réseau et télécommunication, Electronique instrumentation, Système de télécommunication. Introduction la programmation orientée objet (résumé) Dans cette polycopie, nous allons aborder l’une des notions les plus importantes de la programmation moderne. En effet, la programmation orientée objet est très popularisée et utilisée de nos jours. Elle s’appuie sur la notion d’objets et a rendu possible l’apparition des systèmes complexes et évolués tels que l’environnement graphique de Microsoft Windows. 1. De la programmation impérative à la programmation orientée objet Avant l’apparition de la programmation orientée objet, il y avait la programmation impérative ou procédurale: qui utilise des procédures, des variables, des pointeurs, etc. Exemple : C, Pascal, Cobol, Fortran, etc. Un programme procédural est généralement une liste ordonnée d’instructions. Bien que ce type de programmation reste très pratique, leurs limites deviennent flagrantes dès qu’on passe au développement d’applications graphiques volumineuses. Ou lorsqu’on essaye de modéliser des phénomènes du monde réel (fonctionnement d’entreprise, analyse des données complexes, etc.) Pour répondre aux nouvelles exigences, un nouveau style de programmation plus adapté au développement de ce genre d’application a été développé : la programmation Orientée Objet (POO). L’objectif était de pouvoir réutiliser le code et de créer de nouveaux éléments sans rééditer les instructions en question. Imaginez-vous en train d’utiliser une application graphique, vous utilisez une interface faite de boutons, de menus, de cases à cocher, de zones d’édition, etc. Chacun de ces éléments doit pouvoir être affiché et masqué au besoin. En utilisant la programmation impérative, il faudrait écrire pour chaque composant autant de procédures d’affichage et de masquage. Ces codes présenteraient incontestablement des similarités. Des concepts de la programmation orientée objets (héritage et polymorphisme) permettent justement d’écrire une seule fois la procédure de masquage et d’affichage et de pouvoir les réutiliser à volonté dans de nouveaux éléments. 2. Classes et objets Les deux premiers concepts de la programmation orientée objet à comprendre sont la classe et l’objet. Une classe en programmation orientée objet est l’équivalent d’un concept (dans le monde réel). Autrement dit une classe permet de transcrire au mieux les concepts du monde réel en langage de programmation. Ainsi une classe définit les données relatives à une notion et les actions qui s’y apportent. Exemple : Un téléviseur. Université A/Mira Béjaïa M1 : Réseau et télécommunication, Electronique instrumentation, Système de télécommunication. Un concept de téléviseur est lié à des données (voir d’autres concepts) et des actions. Les données : poids, longueurs, chaines mémorisées, état (allumé, veille, éteint, etc.). Les actions : changer une chaine, éteindre, allumer le téléviseur, régler d’une chaine. Le concept téléviseur peut lui-même être raccordé à d’autres concepts : magnétoscope, ordinateur, etc. Voici donc une représentation possible du concept téléviseur : En programmation orientée objet, la représentation idéale du concept téléviseur est une classe. Ainsi il est possible au sein d’une même structure (classe) de regrouper les données (dites attributs) et les actions (dites méthodes). Poussons notre exemple un peu plus loin : un concept n’est pas une réalisation pratique. Un concept (dans le monde réel) ou la classe (dans la Programmation Orientée Objet) est une sorte de moule. Le concept téléviseur, ne vous permettra pas d’en regarder chez vous, il va vous falloir sa réalisation pratique : un exemplaire physique. En programmation orientée objet, la réalisation d’une classe est un objet (ou instance). Université A/Mira Béjaïa M1 : Réseau et télécommunication, Electronique instrumentation, Système de télécommunication. Parlons maintenant des écrans d’ordinateurs, ils sont également caractérisés par : leurs poids, leurs longueurs, leurs diagonales, etc. L’écran d’un ordinateur possède encore une liste de résolutions d’écran possibles. Un tel écran peut être : allumé, éteint ou en veille. De même le concept écran de l’ordinateur pourra être représenté par une classe, dont laquelle les attributs représentent le poids, la longueur et la hauteur. Et les méthodes pour éteindre, allumer ou changer la résolution. Comme vous pouvez le constater, les deux classes présentent des attributs et méthodes en communs. Ainsi, un téléviseur et un écran d’ordinateur possédant un poids, une longueur, et il est possible de l’éteindre ou l’allumer. Néanmoins, certaines caractéristiques (attributs) et actions (méthodes) sont spécifiques à l’écran de l’ordinateur ou du téléviseur (notion d’héritage et polymorphisme). Ainsi les trois concepts peuvent être représentés selon le schéma suivant (dit hiérarchie de classes): Université A/Mira Béjaïa M1 : Réseau et télécommunication, Electronique instrumentation, Système de télécommunication. Première question qui surgit donc lors de la modélisation en termes d’objets c’est « quel concept du monde réel deviendra un objet dans le programme et quelle classe le décrira au mieux ? » le tableau suivant vous donnera une idée plus claire sur la question. Objets Windows (fenêtres) Éléments de l’environnement utilisateur Windows Menus Objets graphiques (cercles, rectangles, etc.) Périphériques (Claviers, souris). Un véhicule dans la simulation des trafics. Objets physiques Un composant électronique dans un circuit. Un pays dans un monde économique Employé Entité humain Etudiant Consommateur Vendeur Structures de données Tableaux Listes Université A/Mira Béjaïa M1 : Réseau et télécommunication, Electronique instrumentation, Système de télécommunication. Arbres binaires Fichier personnel Collection de données Dictionnaire Table de latitudes et longitudes des cités du monde Temps Type de données Angle Nombre complexe Point dans un plan Ainsi un programme orienté objet consiste en un ensemble d’objets qui communiquent entre eux en appelant les méthodes externes (voir l’aspect abstraction de la POO) des autres objets. 3. Les concepts de bases de la programmation orientée objet Les notions de classes et d’objets ont étaient introduites dans le but de mieux organiser les programmes complexes grâce à quatre notions : Encapsulation Abstraction Héritage Polymorphisme Université A/Mira Béjaïa M1 : Réseau et télécommunication, Electronique instrumentation, Système de télécommunication. 3.1. Encapsulation : L’encapsulation consiste à regrouper dans le même objet, les données et les traitements qui lui sont spécifiques. Attributs : les données incluses dans un objet. Méthodes : Les foncions (traitements) définies dans un objet. Donc chaque objet est défini par ses méthodes et ses attributs. Exemple : Soit une classe qui décrit la notion de rectangle, cette notion est liée à des données (attributs) telles que la longueur et la largeur, et des traitements (méthodes) tel que le calcul de la surface et du périmètre. L’objet peut être alors décrit comme suit : 3.2. Abstraction : L’abstraction permet une description générique de l’ensemble considéré (ensemble d’objets) et de réduire le code d’un niveau de détail : se focaliser sur l’essentiel et ignorer les détails. L’abstraction permet de définir un niveau de perception dit externe, qui est la partie visible par les programmeurs utilisateurs (dite aussi interface). Et un niveau interne qui contient les détails d’implémentation et l’ensemble des méthodes et des attributs accessibles seulement depuis l’intérieur de l’objet. Bonne pratique de programmation : Les attributs d’un objet ne doivent pas être accessibles depuis l’extérieur, mais uniquement par des méthodes (manipulateurs et accesseurs). Université A/Mira Béjaïa M1 : Réseau et télécommunication, Electronique instrumentation, Système de télécommunication. 3.3. Pourquoi l’encapsulation/abstraction : L’encapsulation et l’abstraction permettent : Une meilleure visibilité. Une meilleure cohérence. Plus grande modularité. 3.4. Héritage : Imaginons un jeu vidéo ou il y a quatre personnages : Guerrier, Voleur, Magicien, Sorcier. Définissons les classes pour ces quatre personnages (définir les attributs et les méthodes) : Université A/Mira Béjaïa M1 : Réseau et télécommunication, Electronique instrumentation, Système de télécommunication. Vous remarquez qu’il y a beaucoup de code dupliqué. Ce qui peut engendrer un problème de maintenance : par exemple, si on change le type de l’attribut energie de l’entier à réel nous devons mettre à jour le code des quatre classes. C’est ici qu’intervient le troisième aspect de la Programmation Orientée Objet : l’héritage. L’héritage représente la relation «est-un». Il permet de créer des classes plus spécialisées, appelées sous-classes, à partir de classes plus générales déjà existantes, dites superclasses. Lorsqu’une sous-classe C1 est créée à partir d’une super-classe C : Le type est hérité : un objet de classe C1 est aussi de classe C. C1 hérite de l’ensemble des attributs et des méthodes de C. Les attributs et méthodes de C vont être disponibles pour C1 sans que l’on ait besoin de les redéfinir explicitement dans C1. Par ailleurs : o des attributs et/ou méthodes supplémentaires peuvent être définis par la sous-classe C1 (enrichissement). o des méthodes héritées de C peuvent être redéfinies dans C1 (spécialisation). Exemple : Lorsqu’une sous-classe C1 (ici Guerrier ou Voleur) est créée à partir d’une super-classe C (ici Personnage), le type est hérité : un Guerrier est (aussi) un Personnage Université A/Mira Béjaïa M1 : Réseau et télécommunication, Electronique instrumentation, Système de télécommunication. La classe Guerrier va hériter de l’ensemble des attributs et des méthodes de la classe Personnage. Des attributs et/ou méthodes supplémentaires peuvent être définis par la sous-classe Guerrier : par exemple, une classe Guerrier définit un attribut supplémentaire : arme (enrichissement). des méthodes héritées de Personnage peuvent être redéfinies dans Voleur : rencontrer(Personnage). Remarque : L’héritage doit être utilisé pour décrire une relation « est un ». Il ne doit jamais décrire une relation « a un » (assurée par l’encapsulation). Transitivité de l’héritage : Les instances d’une sous-classe possèdent : Les attributs et méthodes de l’ensemble des classes parentes (super-classe, super-super-classe, etc.). Exemple : L’héritage est transitif : un Sorcier est un Magicien qui est un Personnage. 3.5. Polymorphisme : Université A/Mira Béjaïa M1 : Réseau et télécommunication, Electronique instrumentation, Système de télécommunication. Mécanisme de redéfinition du comportement des méthodes de la super classe. Un exemple : Grâce à l’héritage, le même code pourra être appliqué à un Magicien, un Guerrier, etc. qui sont de classe Personnage. La façon dont un Personnage en rencontre un autre peut prendre plusieurs formes : le saluer (Magicien), le frapper (Guerrier), le voler (Voleur), etc. Grâce au polymorphisme, le même code appliqué à différents personnages pourra avoir un comportement différent, propre à chacun.