8. LIMITES DE LA LA PROGRAMMATION FONCTIONNELLE Maintenance complexe : avec la factorisation des comportements, les fonctions sont devenues interdépendantes. Une simple mise à jour du logiciel à un point donné, peut entraîner , en cascade, la modification d’une multitude d’autres fonctions. En cas d’évolution majeure du logiciel (passer, par exemple, de la gestion d’une bibliothèque à celle d’un médiathèque, l’écriture du logiciel devient plus complexe. Même si la structure générale du logiciel reste valide, la multiplication des points de maintenance, engendrée par le chaînage des fonctions, rend l’adaptation très laborieuse. Il faut retoucher le logiciel dans sa globalité. L'approche fonctionnelle n'est pas adaptée au développement d'applications qui évoluent sans cesse et dont la complexité croit continuellement (plusieurs dizaines de milliers de lignes de code).
9. L’APPROCHE ORIENTEE OBJET L’approche orientée La nécessité impérative d’une information de bonne qualité , l’explosion de besoins nouveaux découlant de l’ouverture des Systèmes d’Informations (SI) ne laissent d’autres choix que de rechercher de nouvelles méthodes, beaucoup plus efficaces, pour la prise en charge des applications. L’approche orientée objet est aujourd’hui l’une des pierres angulaires de l’évolution à laquelle l’entreprise est contrainte. Elle conduit tout naturellement à une vision différente de la vision procédurale (fonctionnelle) et plus proche de la réalité des métiers. L’approche orientée objet a pour origine la programmation à objets dont les langages Smalltalk et C++ sont les représentants. Elle a obtenu ses premiers succès importants avec la programmation d’interfaces graphiques. Depuis, son application s’est généralisée à de nombreux domaines dont le génie logiciel, les systèmes repartis et les bases de données. L’approche orientée objet apporte des avantages décisifs comme la modularité , la réutilisabilité et l’ extensibilité du code qui conduisent à une meilleur productivité des développeurs et à une plus grande qualité des applications.
10. II : Concepts de la Programmation Orientée Objet
11.
12.
13. OBJETS méthode : Une méthode est une fonction ou un traitement qui manipule des attributs. Une méthode est liée à un objet , elle est déclenchée à la réception d’un message particulier : la méthode déclenchée correspond strictement au message reçu. Exemple d’une entité logicielle Pour calculer la somme des n premiers entiers, il est possible de concevoir une entité logicielle appelée SommeN dont le fonctionnement revient à interpréter certains messages que l’on pourra lui envoyer (voir figure) Une telle entité, du point de vue de l’utilisateur, est une boîte noire qui réagit seulement à la réception de message. Entité , qui sait calculer la somme des N premiers entiers et l’afficher SommeN Messages initialiseToi faisSomme pour N précisé afficheSomme
14.
15. OBJETS La liste des méthodes constitue l’ interface de l’ objet pour l’utilisation : ce sont les messages que l’ objet peut comprendre si on les lui envoie, et dont la réception déclenche les méthodes correspondantes. Signature : La précision d’une méthode (nom de la méthode), du type de ses arguments et du type de donnée retournée s’appelle signature de méthode . Exemple : int additionEntier ( int a, int b) Représentation de l’objet SommeN : vision programmeur Type de retour Précision de la méthode Type des paramètres Objet SommeN Attributs I,S : Entier N : Entier Méthodes initialiseToi () retourne vide faisSomme (Entier) retourne vide afficheSomme () retourne vide
16. OBJETS Encapsulation : On dit qu’un objet , qui réunit dans une même entité attributs et méthodes , les encapsule . Les détails de l’implémentation de l’ objet sont masqués aux autres objets du système à objets . On dit qu’il y’a encapsulation des données et du comportement des objets. L’encapsulation applique le principe d’ abstraction : un objet n’est accessible que par ses opérations visibles (son interfaces externe ). Ainsi les modifications de données restent locales aux objets et sont sans effet sur les programmes utilisateurs. L’encapsulation apporte alors indépendance entre programmes , opérations et données . Modularité : La modularité d’un logiciel consiste à regrouper des classes qui participent à la réalisation d’un service ou d’une fonctionnalité donnée au sein d’un même package (ou module ).
17. CLASSES Définition : Une classe est un ensembles d’objets qui ont en commun les mêmes méthodes et qui partagent les mêmes types d’attributs. Une classe est en sorte un type abstrait qui encapsule données et comportements. C’est une sorte de « moule », qui permet ensuite de créer autant d’instances que l’on veut, et ces instances seront des objets instances de la classe, auxquels on pourra effectivement envoyer des messages, qui activeront les méthodes correspondantes. Instance : Une instance d’une classe est un objet particulier d’une classe qui peut activer les méthodes de la classe et qui a des valeurs particulières pour ses attributs. Classe Attributs Méthodes Une instance de la classe Une autre instance de la classe Encore une instance de la classe Une classe et trois de ses instances
18.
19.
20.
21. CLASSES Invocation d’une méthode Il reste enfin à préciser comment on invoque une méthode sur un objet. Cela se fait par l’application, sur l’identificateur de l’objet, du nom de la méthode à l’aide d’un opérateur, l’opérateur « . » L’appel d’une méthode sur un objet receveur est alors le suivant : instance_de_classe . méthode (); Utilisation de la classe Personne Il est maintenant possible d’utiliser la classe Personne, puisque celle-ci est déclarée et que ses méthodes ont été écrites. Il a même été possible de définir la classe dans un algorithme dont le rôle se limitait strictement à cela. Un autre algorithme va en permettre l’utilisation. Un mot-clé permet de préciser qu’elle classe est utilisée dans ce nouvel algorithme et ainsi d’identifier les méthodes employées. Ce mot-clé, placé au tout début de l’algorithme, est utlise . utilise Nom_de_classe;
22. CLASSES Algorithme : déclaration de Peronne class Personne debut privé // les attributs suivants ne sont pas accessibles de l’extérieur de la classe nom, adresse : chaîne de caractères; âge : Entier; public // les méthodes seront déclarées publiques, accessibles de l’extérieur initialiser (x : chaîne de caractères, y : chaîne de caractères, z : entier) retourne vide debut non x; adresse y; âge z; fin
23. CLASSES catégorieDâge () retourne vide debut si (âge > 50) alors écrire (‘’Personne agée’’); sinon si (âge < 20) alors écrire (‘’Personne jeune ’’); sinon écrire (‘’Age moyen’’); fin catégorieDeResidence () retourne vide debut si (adresse = ‘’Ville’’) alors écrire (‘’Habitant urbain’’); sinon si (adresse =‘’Village’’) alors écrire (‘’Villageois’’); sinon écrire (‘’Habitant rural’’); fin fin
24. CLASSES utilise Personne ; //on connaît ainsi la classe Personne et ses attributs class ManipulationDePersonne variables : personne1, personne2, personne3 : Personne // déclaration de trois objets instances de la classe Personne debut personne1 new Personne (); // création effective d’un objet personne2 new Personne (); // création effective d’un autre objet personne3 new Personne (); // création du troisième objet personne1.initialiser (‘’Bemba’’, ’’ville’’,35); personne2.initialiser (‘’Loemba’’, ’’campagn2’’,35); personne1.categorieDâge (); personne1.categorieDeResidence (); fin
25.
26. CLASSES Les constructeurs : Exemple 2 classe Toto debut …… public Toto (x : Entier, y : Entier) ; // signature du constructeur avec arguments fin …… fin La classe Personne, de l’exemple précédent, peut implémenter le constructeur suivant : Personne ( x : chaîne de caractères, y : chaîne de caractères, z : Entier) retourne vide Si nous reprenons l’algorithme de la classe Personne comportant cette fois-ci un constructeur, nous aurons :
27. CLASSES Algorithme : déclaration de Personne avec un constructeur class Personne debut privé // les attributs suivants ne sont pas accessibles de l’extérieur de la classe nom, adresse : chaîne de caractères; âge : Entier; public // les méthodes seront déclarées publiques, accessibles de l’extérieur Personne (x : chaîne de caractères, y : chaîne de caractères, z : entier) retourne vide debut non x; adresse y; âge z; fin
28. CLASSES catégorieDâge () retourne vide debut si (âge > 50) alors écrire (‘’Personne agée’’); sinon si (âge < 20) alors écrire (‘’Personne jeune ’’); sinon écrire (‘’Age moyen’’); fin catégorieDeResidence () retourne vide debut si (adresse = ‘’Ville’’) alors écrire (‘’Habitant urbain’’); sinon si (adresse =‘’Village’’) alors écrire (‘’Villageois’’); sinon écrire (‘’Habitant rural’’); fin fin
29. CLASSES utilise Personne ; //on connaît ainsi la classe Personne et ses attributs class ManipulationDePersonne variables : personne1, personne2, personne3 : Personne // déclaration de trois objets instances de la classe Personne debut personne1 new Personne (‘’Bemba’’, ’’ville’’,35); // création et initialisation des attributs par le // constructeur personne2 new Personne (‘’Loemba’’, ’’Village’’,35); // création effective d’un autre objet personne1.categorieDâge (); personne1.categorieDeResidence (); personne2.categorieDâge (); personne2.categorieDeResidence (); fin
30. L’HERITAGE Le concet d’héritage est central dans l’approche objet. Il est en effet très rare de concevoir un système dans lequel il n’existe pas de classes liées par héritage Définition : Une classe peut être considérée comme héritant d’une autre si elle peut activer toutes les méthodes de cette dernière et si elle contient également tous ses attributs. Graphe d’héritage Le graphe d’héritage d’un ensemble de classes est la structure représentant la manière dont les classes sont liées les unes aux autres par héritage. Ce graphe constitue une hiérarchie. Exemple La classe Quadrupède est une classe générale. Elle se spécialise en deux sous-classes indépendantes et de même niveau de spécialisation, la classe Chien et la classe Cheval .
31. L’HERITAGE Toutes les propriétés de la classe quadrupède, et en particulier le fait d’avoir quatre pattes, sont automatiquement portées dans ces deux sous-classes. La classe Chien précise que l’animal pratique l’aboiement alors que la classe Cheval précise que l’animal est utilisé pour travailler dans des exploitations agricoles. Quadrupède Cheval Chien Une hiérarchie de trois classes
32.
33. L’HERITAGE Dans l’exemple précédent, un objet instance de la classe Chien peut se voir appliquer la méthode nombreDePattes (), qui retournera vraisemblablement quatre, car cette classe hérite de la classe Quadrupède et peut donc utiliser toutes ses méthodes . Les méthodes nombreDePattes (), decritType () , decritSite () s’appliquent donc à des objets de type Quadrupède, Chien et Cheval. Par contre, il est impossible d’appliquer la méthode sonPropriétaire () à un objet instance de Quadrupède ou instance de Cheval car la méthode est spécifique à la classe Chien. Définition des classes de l’héritage classe A spécialise B // A hérite de B { privé // zone de définition des éléments privés ……… public // zone de définition des éléments publics …… .. }
34. POLYMORPHISME Les méthodes sont attachées aux classes et précisent leur comportement. Il sera possible de donner à des méthodes de classes différentes le même identificateur. Cette propriété, qui revient à définir un même identificateur pour désigner plusieurs méthodes de plusieurs classes , s’appelle polymorphisme . Ainsi, la méthode déclenchée dépendra de l’objet receveur et ne pourra pas être attribuée a priori à une classe. Nous avons déjà utilisé ce concept dans l’exemple précédent. L’identificateur de méthodes sonNom() correspond soit à une méthode de la classe Chien , soit à la méthode de la classe Cheva l, qui à priori, ne sont pas les mêmes. C’est seulement lorsque le receveur sera connu, que la bonne méthode sera déclenchée.
35. SURCHARE ET REDEFINION DE METHODE Surcharge de méthode : Il peut arriver que l’on définisse plusieurs fois une même méthode pour une même classe, en gardant donc le même identificateur, mais en changeant le type ou le nombre des paramètres des méthodes récrites. Sinon, il y aurait ambiguïté dans l’appel des méthodes, puisqu’elles auraient la même signature. On dit que l’on surcharge la méthode. Ce cas de définition de méthodes ayant le même identificateur sera fréquente pour les constructeurs. Redéfinition de méthode Il peut arriver que l’on souhaite redéfinir dans une classe dérivée une méthode de la classe mère . On dit, dans ce cas, que l’on redéfinit la méthode, qui est déjà opérante dans la classe fille par héritage, par une méthode locale qui va la masquer.