Poo

35
LA PROGRAMMATION ORIENTEE OBJET

Transcript of Poo

Page 1: Poo

LA PROGRAMMATION ORIENTEE OBJET

Page 2: Poo

I : L’APPROCHE ORIENTEE OBJET II : CONCEPTS DE LA PROGRAMMATION ORIENTEE OBJET

PLAN DU RAPPORT

Page 3: Poo

I : l’Approche Orientée Objet

Page 4: Poo

LES QUALITES D’UN LOGICIEL

On peut mesurer les qualités d’un logiciel par plusieurs critères qui sont entre autres : L’exactitude : aptitude d’un programme ou d’un logiciel à fournir le résultat voulu et a répondre

ainsi aux spécifications du cahier des charges. La robustesse : aptitude à bien réagir lorsque l’on s’écarte des conditions normales d’utilisation L’extensibilité : facilité avec laquelle un programme pourra être adapté pour répondre à

l’évolution des spécifications; La réutilisabilité : possibilité d’utiliser certaines parties du logiciel pour résoudre un autre

problème. La portabilité : facilité avec laquelle on peut exploiter un même logiciel dans différentes

implémentations. L’efficience : temps d’exécution, espace mémoire occupé

Page 5: Poo

LA PROGRAMMATION FONCTIONNELLE

La découpe fonctionnelle d’un problème informatique : il s’agit de décomposer l’écriture d’un algorithme en différentes parties bien distinctes, représentant chacune une tâche bien précise et autonome. Il s’agira ensuite de bien agencer la mise en action de ces tâches pour réaliser les calculs aboutissant à la solution du problème général comme le montre la figure suivante :

Logiciel de gestion de bibliothèque

ces tâches indépendantes s’appellent des fonctions ou sous-programmes.

Page 6: Poo

LA PROGRAMMATION FONCTIONNELLE

Cette approche de l’écriture des algorithmes, utilisant systématiquement la notion de fonction (ou sous-programme), est très intéressante car elle permet, pour résoudre un problème, d’employer une méthode de décomposition en sous-problèmes distincts. Elle a ainsi deux avantages : Elle permet, par le découpage en sous-problèmes, de résoudre des cas plus simples et bien identifiés. Elle permet de réutiliser des fonctions déjà développées par ailleurs.

Le concepteur d’un algorithme compliqué peut ainsi définir de multiples fonctions simples, bien identifiées, dont l’agencement constituera la solution à son problème. La forme générale de son programme sera alors un ensemble de sous-programmes, et l’exécution consistera en appels de ces sous-programmes.

Réutilisation de fonctions

Page 7: Poo

LA PROGRAMMATION FONCTIONNELLE

Mais ce découpage d’un algorithme en fonctions pose les questions suivantes : une simple modification du programme en un point donné, ne risque t-elle pas d’entraîner

en cascade, la modification d’une multitude d’autres fonctions ? l’approche fonctionnelle est-elle adaptée au développement d’application complexes et qui

évoluent sans cesse ?

Page 8: Poo

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).

Page 9: Poo

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.

Page 10: Poo

II : Concepts de la Programmation Orientée Objet

Page 11: Poo

LA PROGRAMMATION ORIENTEE OBJET (POO)

Définition : La Programmation orientée Objet est un paradigme de programmation qui consiste à utiliser les concepts d’objets, de classes, d’encapsulation, d’héritage, de polymorphisme, de modularité…

Objectifs :La Programmation orientée Objet répond au problème de réutilisabilité et d’extensibilité de la programmation fonctionnelle par l’encapsulation des données et des opérations qui les manipulent dans des objets, en lieu et place des structures de données (définitions de types et des variables), des procédures ou fonctions et d’un programme principal qui appelle les procédures.

La Programmation orientée Objet permet une démarche de type industriel dans la conception et le développement de logiciels, processus caractérisé par la standardisation des éléments, assemblage des éléments en composants (ou objets), réutilisation possible des composants.

D’où, pour les applications développées : Une grande fiabilité Des temps d’assemblage réduits Une maintenance facilitée Une diminution des coûts de fabrication à long terme

Page 12: Poo

OBJETS

Les concepts d’objet et de classe sont interdépendants. En effet, un objet appartient à une classe (c’est une instance d’une classe) et une classe décrit la structure et le comportement commun d’objets (ses instances).

Définition :Un objet est une entité logicielle (une abstraction des données du monde réel) : Qui a une identité, Qui est capable de sauvegarder un état, c’est-à-dire un ensemble d’informations dans des variables internes (ses attributs ou propriétés), Qui répond à des messages en déclenchant des activations internes appropriées qui changent l’état de l’objet. Ces opérations sont appelées des méthodes. Ce sont des fonctions liées à des objets et qui précisent le comportement des ces objets.

L’identité de l’objet est son nom, c’est-à-dire son identificateur. Les états de l’objet sont les valeurs de ses variables propres, qui sont appelées des attributs. Les messages auxquels l’objet peut répondre sont en fait les intitulés des méthodes qu’il peut déclencher : leur identificateur et le type de paramètres nécessaires.

Attributs : Les attributs d’un objet sont l’ensemble des informations se présentant sous forme de variable et permettant de représenter l’état de l’objet.

Message : un message est une demande d’activation envoyé à un objet. C’est un mode de communication entre les objets de classes différentes. À l’aide d’un message, un objet d’une classe A sollicite les services d’un objet d’une classe B

Page 13: Poo

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 desN premiers entiers et l’afficher

SommeN

Entité,qui sait calculer la somme desN premiers entiers et l’afficher

SommeN

Messages

initialiseToi

faisSomme pour N précisé

afficheSomme

Page 14: Poo

OBJETS

Dans l’exemple précédent, l’objet à pour nom SommeN. Son état est représenté par trois attributs suivants : S : de type entier, qui représente la somme calculée, N : de type entier, qui représente le nombre d’entiers successifs à sommer, I : qui est un attribut permettant de compter le nombre de tours de boucle dans sa méthode de calcule de la somme.

L’utilisateur n’a pas à connaître le nom des attributs de l’objet, qui ne servent qu’aux calculs internes de SommeN et qui n’apportent rien à l’utilisateur, qui ne veut qu’un résultat.

Les trois méthodes que comporte SommeN sont : initialiseToi(), méthodes sans paramètre, et qui ne retourne rien; faisSmme (entier), qui est une méthode qui reçoit comme attribut le nombre d’entiers à sommer, ne retourne rien. afficheSomm ce (), qui affiche la valeur de la somme, ne retourne rien.

Chacune de ces méthodes est aussi le nom d’un message que l’on peut envoyer à l’objet SommeN. A la réception d’un message, l’objet active la méthode qui a le même nom.

Page 15: Poo

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)

Objet SommeN

Attributs I,S : EntierN : Entier

MéthodesinitialiseToi () retourne videfaisSomme (Entier) retourne videafficheSomme () retourne vide

Représentation de l’objet SommeN : vision programmeur

Type de retourPrécision de la méthode

Type des paramètres

Page 16: Poo

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).

Page 17: Poo

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

Page 18: Poo

CLASSES

Exemple de classe

Comme exemple, nous allons définir une classe représentant les caractères d’une personne. La déclaration de la classe Personne revient à définir son nom, son adresse et son âge et à préciser comment on accède à ces informations.

Personne

Attributs de la classe :-nom : chaîne de caractères - adresse : chaîne de caractères- âge : Entier

Méthodes de la classe+ initialiser (chaîne de caractères, chaîne de caractères, Entier) retourne vide + catégorieDâge () retourne vide+ catégorieDeResidence () retourne vide

Personne

Attributs de la classe :-nom : chaîne de caractères - adresse : chaîne de caractères- âge : Entier

Méthodes de la classe+ initialiser (chaîne de caractères, chaîne de caractères, Entier) retourne vide + catégorieDâge () retourne vide+ catégorieDeResidence () retourne vide

Chéma de da la classe Personne

Page 19: Poo

CLASSES

L’usage de l’entité Personne définie comme classe se ramène alors à : la création d’une classe Personne la création d’un objet instance de la classe Personne l’activation des méthodes sur l’objet

La figure ci-dessous présente la classe Personne et deux instances nommées Personne1, Personne2

Classe Personne

-nom : chaîne de caractères - adresse : chaîne de caractères- âge : Entier

+ initialiser (chaîne de caractères, chaîne de caractères, Entier) retourne vide + catégorieDâge () retourne vide+ catégorieDeResidence () retourne vide

Classe Personne

-nom : chaîne de caractères - adresse : chaîne de caractères- âge : Entier

+ initialiser (chaîne de caractères, chaîne de caractères, Entier) retourne vide + catégorieDâge () retourne vide+ catégorieDeResidence () retourne vide

Personne1

nom : Bangoura adresse : ville âge : 35

Personne2

nom : Keitaadresse : campagne âge : 25

Deux instances de Personne

Page 20: Poo

CLASSES

Déclaration d’une classe

La syntaxe de déclaration d’une classe est la suivante :

class identificateur_de_la_classe

debut déclaration des attributs signature des méthodes fin

Déclaration et instanciation d’une classeLa création d’une instance de classe se fait en deux temps : d’abord, on déclare l’existence de l’objet instance de la classe. Cela revient à donner un identificateur à un certain objet la création effective de l’instance se fait à l’aide d’un opérateur spécifique, l’opérateur new.

identificateur_instance : identificateur_de_la_classe;identificateur_instance new identificateur_de_la_classe ();

Page 21: Poo

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 PersonneIl 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;

Page 22: Poo

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

Page 23: Poo

CLASSES

catégorieDâge () retourne videdebut si (âge > 50) alors

écrire (‘’Personne agée’’); sinon si (âge < 20) alors

écrire (‘’Personne jeune ’’); sinon

écrire (‘’Age moyen’’);fin

catégorieDeResidence () retourne videdebut si (adresse = ‘’Ville’’) alors

écrire (‘’Habitant urbain’’); sinon

si (adresse =‘’Village’’) alors écrire (‘’Villageois’’);

sinon écrire (‘’Habitant rural’’); finfin

Page 24: Poo

CLASSES

utilise Personne; //on connaît ainsi la classe Personne et ses attributsclass 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

Page 25: Poo

CLASSES

Nous avons donc bien distingué dans l’exemple de la classe Personne, un algorithme composé en fait de deux parties :

1. Une partie déclaration de la classe et de ses méthodes2. Une partie utilisation de la classe par création d’instances et envoi de messages aux instances

Ce type de conception sera considéré comme usuel.

Les constructeurs : Un constructeur est une méthode particulière d’une classe permettant d’initialiser les attributs d’un objet lors de sa création effective. Elle porte le même nom que la classe et ne retourne pas de valeur.

Exemple 1classe Namadébut …… public Nama () ; // signature du constructeur sans arguments fin……fin

Page 26: Poo

CLASSES

Les constructeurs :

Exemple 2classe Totodebut …… 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 :

Page 27: Poo

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

Page 28: Poo

CLASSES

catégorieDâge () retourne videdebut si (âge > 50) alors

écrire (‘’Personne agée’’); sinon si (âge < 20) alors

écrire (‘’Personne jeune ’’); sinon

écrire (‘’Age moyen’’);fin

catégorieDeResidence () retourne videdebut si (adresse = ‘’Ville’’) alors

écrire (‘’Habitant urbain’’); sinon

si (adresse =‘’Village’’) alors écrire (‘’Villageois’’);

sinon écrire (‘’Habitant rural’’); finfin

Page 29: Poo

CLASSES

utilise Personne; //on connaît ainsi la classe Personne et ses attributsclass 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

Page 30: Poo

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éritageLe 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.

Page 31: Poo

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 Cheval Chien Chien

Une hiérarchie de trois classes

Page 32: Poo

L’HERITAGE

Classe Quadrupède

-type : Chaîne- site : Chaîne

+ nombreDePattes () retour Entier+ decritType () retourne vide + decritSite () retourne Chaine

Classe Chien

-nom : Chaîne- propriétaire : Chaîne

+ typeDeCri () retour Chaine+ sonPropriétaire () retourne Chaine + sonNom () retourne Chaine

Classe Cheval

-nom : Chaîne

+ sonNnom () retour Chaine+ sonCri () retourn Chaine + sonTravail () retourne Chaine

Schéma du graphe d’héritage

Page 33: Poo

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 ……..}

Page 34: Poo

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 Cheval, 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.

Page 35: Poo

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éthodeIl 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.