Académique Documents
Professionnel Documents
Culture Documents
PROGRAMMATION
ORIENTEE OBJET
COO et POO
2
Objectif du cours:
Paradigmes de Programmation
Programmation structurée/modulaire
Analyse fondée sur les fonctionnalités du programme;
Mise en évidence des fonction(s) à réaliser
Décomposition hiérarchique et descendante des fonctions jusqu'à ce que le
codage des sous fonctions simple à réaliser
Unité logique = Fonction/module
Définition duale Variables/Fonctions
Question première : sur quoi porte le programme
Introduction
5
Paradigmes de Programmation
Programmation structurée/modulaire
Introduction
6
Paradigmes de Programmation
Programmation Orientée Objets (POO)
Approche ascendante :
Identifier les entités (objets) manipulées dans le système
Composer ces objets pour créer le système;
Unité logique = Objets (en fait les classes des Objets); des entités regroupant
a la fois des données et des fonctions qui les manipulent.
Question première : sur quoi porte le programme
Introduction
7
Paradigmes de Programmation
Programmation Orientée Objets (POO)
Introduction
8
Point Faible
Evolutivité, maintenabilité : Les fonctions constituent la partie la plus
volatile du système; Le fait que son architecture soit très fortement liée
aux fonctionnalité d’un système donné, pose problème.
Introduction
9
Approche Objet
orienté «entités » : identification des objets du système, puis identification des
fonctions applicables à ces objets
10
Introduction
11
Approche Objet
Points forts …:
Fournit un cadre plus homogène pour traiter simultanément les données et leur
comportement;
permet de réduire la distance sémantique qui existe entre le modèle réel et le modèle du
système;
Favorise la réutilisabilité (Réutiliser des fragments de code développés dans un cadre
différent)
Améliore la conception et la maintenabilité et l’évolutivité des grands systèmes;
Introduction
12
Le Label Objet
Historique
Début en Norvège à la fin des années 60
Développement de Simula (Simple Universal Language) = Algol +
concepts de POO et simulation discrète
Années 1970
Smalltalk = archétype des langages objets
Développé chez Xerox (=>1er système Fenêtres, Icônes, Souris)
Au cours des années 80 : intérêt pour les interfaces graphiques
Apparition de nouveaux langages
Eiffel : fortement typé, entièrement orienté objet
C++, extension du C
Object Pascal (Delphi)
Introduction
15
Le Label Objet
Historique
Années 1990
Le Label Objet
Constituants du Label « Orienté Objet »
identité,
classification,
héritage
polymorphisme
Introduction
17
Le Label Objet
Identité :
Chaque objet possède sa propre identité indépendante du contenu de l’objet
Le Label Objet
Classification :
les objets ayant la même structure de données (attributs) et le même
comportement(opérations) sont regroupés dans une classe.
Une classe est une abstraction qui décrit les propriétés pertinentes pour
l’application et ignore les autres.
Chaque instance possède ses propres valeurs pour chaque attribut mais
partage nom d’attributs et opérations avec les autres instances de la classe.
Introduction
19
Le Label Objet
L’héritage
Partage des attributs et des opérations entre les classes s’appuyant sur une
relation hiérarchique.
Une classe peut être définie à grands traits (super-classe) et ensuite affinées
dans des sous-classes de plus en plus fines. Chaque sous incorpore ou hérite
toutes les propriétés de sa super-classe et y ajoute ses propres propriétés.
Le Label Objet
Polymorphisme
Une opération est une action ou une transformation qu’un objet effectue ou
subit.
Abstraction
Partage
Introduction
22
Les Thèmes de L‘Orienté Objet
TAD
Exporte un type;
Encapsule l'implémentation du type
met à disposition une interface (ensemble de fonctions pour manipuler le
TAD)
Introduction
23
séparer les aspects externes d’un objet, accessibles par les autres objets, des
détails de son implémentation interne invisibles aux autres objets
Ainsi, l’implémentation d’un objet peut être modifiée (par exemple pour
améliorer les performances, corriger un bogue, consolider le code ou porter
le code sur une autre machine) sans affecter les applications qui utilisent cet
objet.
économie de code
conception plus claire car permettant de révéler que des opérations différentes
sont en réalité identiques (du point de vue sémantique).
Objet
Un objet est un concept, une abstraction ou une chose ayant des
limites claires et un sens précis dans le contexte du problème étudié.
Objet
Identifiant d’objet (Object Identifier)
Un objet peut changer de valeur, mais pas d’identifiant). L’identité peut être
implémentée de plusieurs façons et ne relève pas en général de la
responsabilité du programmeur : adresse, indice dans un tableau, ou valeur
unique d’un attribut
Les Concepts de Base de la POO
31
Objet
Identifiant d’objet (Object Identifier)
Deux objets O1 et O2 sont identiques (on note O1 == O2) s’ils ont le même
identifiant ; il n’y a alors en fait qu’un objet désigné par deux pointeurs O1 et
O2.
Au contraire, deux objets sont égaux (on note O1 = O2) s’ils ont même
valeur (le même état). O1 == O2 implique O1 = O2, l’inverse étant faux;
L’identité d’objet apporte une plus grande facilité pour modéliser des objets
complexes; en particulier, un objet peut référencer un autre objet;
Objet
Etat d’un objet
Comportement
Objet
V1
P1 P2
Classes
Une classe décrit un groupe d’objets ayant des propriétés similaires
(attributs), un comportement commun (opérations), des relations
communes avec les autres objets ainsi qu’une même sémantique
Classes
Utilité d’une classe:
Créer des catégories;
Disposer d’un moule pour la création d’objets.
Classes
Attributs
Aussi appelés variables d’instance.
Caractéristique d’un objet désignée par un nom permettant de mémoriser une
ou plusieurs valeurs, ou un ou plusieurs identifiants d’objets.
Un attribut sert à mémoriser une valeur ou une référence précisant une
caractéristique d’un objet.
Un attribut a un nom, un type et une intention sémantique
Le type d’un attribut peut être élémentaire (un entier, un réel ou un texte) ou
complexe (une structure à valeurs multiples) ou un type Référence. La
référence correspond à un identifiant d’un autre objet. Elle permet de pointer
vers un autre objet avec des pointeurs invariants.
Les Concepts de Base de la POO
37
Classes
Opérations, Méthodes
Classes
Opérations, Méthodes
Types d’opération :
Sélecteurs (accesseur),
Modificateurs (mutateur),
constructeur : Fonction associée à une classe permettant la création et
l’initialisation d’un objet en mémoire
Destructeur: Fonction associée à une classe permettant la destruction d’un objet
en mémoire
Itérateurs
Classes
Opérations, Méthodes
Accesseurs
Méthodes get...() : lecture d'un attribut
Objet non modifié
Retour = une copie (valeur) de l'attribut
Mutateurs
Méthodes set...() : écriture d'un attribut (et éventuellement d'attributs dépendants)
Objet modifié
Type de retour = void ou un type indiquant un statut (modification effectuée ou
non, ...)
Classes
Encapsulation
le principe d’ encapsulation hérité des types abstraits cache les structures
de données (les attributs) et le code des méthodes en ne laissant visible que
les opérations exportées, appelées opérations publiques.
Par opposition, les opérations non exportées sont qualifiées de privées. Elles
ne sont accessibles que par des méthodes associées à l’objet.
Classes
Encapsulation -
Interface d’une classe : Ensemble des signatures des opérations, y compris
les lectures et écritures qui sont applicables depuis l’extérieur sur les objet de
la classe
Pour éviter de modifier les clients, une interface ne doit pas être changée
fréquemment : elle peut être enrichie par de nouvelles opérations, mais il faut
éviter de changer les signatures des opérations existantes.
class Fraction {
private int numerateur;
private int denominateur;
Classes
Propriétés de classe:
Un attribut classique est une variable d’instance (il stocke une valeur de
propriété d’une instance).
Attribut de classe: attribut dont la valeur n'est pas propre a une instance particulière
(valeur partagée par toutes les instances).
Permet d'implémenter une propriété (variable ou constante) commune à toutes les entités
d'une même classe :
Message :
Instruction composée d’un objet récepteur, d’un nom d’opérations et de paramètres,
permettant par envoi, l’invocation de l’opération publique de l’objet récepteur.
Associations et Liens
Une association permet d’établir une relation entre deux classes (binaire) ou
plus (n-aire). Une association décrit un ensemble de liens potentiels.
Associations et Liens
Agrégation
Association entre deux classes exprimant que les objets de la classe cible sont des
composants (font partie ) de ceux de la classe source (composite).
Relation de dominance et de subordination. Une action sur une classe implique une
action sur une autre classe.
Une classe peut appartenir a plusieurs agrégats
Composition
Agrégation forte exprimant une Contenance structurelle :
Création/Copie/Destruction du composite Création/Copie/Destruction de ses
composants
Un composant appartient à au plus un composite
Les Concepts de Base de la POO
47
Associations entre classes et Liens
Classe-Association
Une association peut avoir ses propres propriétés, qui ne sont disponibles dans aucune des classes
associées.
Une association peut être représentée par une classe pour ajouter attributs et opérations à des
associations
Les associations entre classe se traduisent le plus souvent par des instances
qui détiennent des références à d'autres objets.
l’ensemble (Set) qui permet de définir des collections non ordonnées sans double ;
le sac (Bag) qui permet de définir des collections non ordonnées avec doubles;
la liste (List) qui permet de définir des collections ordonnées avec doubles ;
le tableau (Array) qui permet de définir des collections ordonnées et indexées.
Dans les systèmes objet, la notion de collection est souvent réalisée par des classes
paramétrées, encore appelées classes génériques ou patterns de classes. Les classes
collection sont généralement organisée hiérarchiquement.
Les Concepts de Base de la POO
50
lesNums
AnnuaireTelephonique NumTelephone
*
Généralisation et Héritage
Généralisation
Lien hiérarchique entre deux classes spécifiant que les objets de la classe
supérieure sont plus généraux que ceux de la classe inférieure.
Généralisation et Héritage
Héritage: transmission automatique des caractéristiques (attributs et methodes)
d'une classe vers une sous-classe en faisant dériver une nouvelle classe d'une
classe existante.
C’est une Abstraction permettant de partager les points communs entre les classes tout en
préservant leurs différences.
Objectifs :
définir une nouvelle classe comme specialisation d'une classe existante
factoriser des propriétés et comportements communs à plusieurs classes
(généralisation)
définir une relation de sous-typage entre classes
hériter des attributs et des méthodes de sa super-classe
éviter la duplication et encourage la réutilisation
La sémantique la plus courante de la généralisation consiste à dire que tout
élément d’une sous-classe est élément de la superclasse (relation d’inclusion)
Les Concepts de Base de la POO
55
Généralisation et Héritage
Une sous-classe spécialise une superclasse de 2 manières:
Par enrichissement: En ajoutant des attributs et/ou des méthodes;
Généralisation et Héritage
Redéfinition
On procède à une redéfinition pour les raisons suivantes:
Redéfinir pour étendre: même opération que celle héritée mais modification du
comportement pour tenir compte par exemple de nouveaux attributs;
Redéfinir pour restreindre: la nouvelle opération restreint le protocole par
exemple en réduisant le type des arguments pour conserver l’opération héritée
dans les limites de la classe.
Redéfinir pour optimiser: tirer avantage des contraintes imposées par une
restriction pour améliorer le code de l’opération
Redéfinir pour raisons pratiques: pratique non recommandée consistant à
rechercher une classe C similaire à la nouvelle classe C’, à hériter de C et à
redéfinir les méthodes de C non opportunes pour C’.
Les Concepts de Base de la POO
57
Généralisation et Héritage
Redéfinition
Une instance d’une classe est une instance de tous les ancêtres de la classe toutes
les caractéristiques des classes ancêtres doivent s’appliquer aux instances de la sous-
classe.
Une classe descendante ne peut pas omettre ou supprimer un attribut ancêtre car ses
instances ne seraient pas vraiment des instances de l’ancêtre. Par contre une sous-
classe peut restreindre les attributs ancêtres (Restriction).
Par exemple un cercle est une ellipse dont le petit axe et le grand axe sont égaux.
Les opérations sur une classe ancêtre doivent s’appliquer sur toutes les classes
descendantes. Une sous-classe peut ré implémenter une opération mais ne peut pas
changer le protocole externe.
Les Concepts de Base de la POO
58
Généralisation et Héritage
Une Solution possible: Généraliser les aspects communs des classes originelles
et nouvelles en une troisième classe dont les deux premières héritent.
Les Concepts de Base de la POO
59
Généralisation et Héritage
A
C
B
A B
C = points communs de A et B
Les Concepts de Base de la POO
60
Généralisation et Héritage
Toutes les opérations de requêtes (sélecteurs) sont héritées par toutes les sous-classes;
Les opérations de màj sont héritées au travers de toutes les extensions;
Les opérations de màj qui ont des attributs contraints ou les associations sont bloquées
par une restriction. Par ex. l’opération ajuster-x est autoriser pour Ellipse, bloquée
dans Cercle.
Les opérations ne peuvent pas être redéfinies pour avoir un comportement différent de
celui des opérations héritées.
On peut affiner les opérations héritées en leur ajoutant un comportement
supplémentaire
Les Concepts de Base de la POO
61
Généralisation et Héritage
Exemple java et c++
Les Concepts de Base de la POO
62
Généralisation et Héritage
Association vs généralisation:
L’association met en relation des instances (un objets est lié à ou englobé
dans l’autre). L’association permet la réutilisation du code par délégation
Pile
Pile
empiler
dépiler empiler
dépiler
DECONSEILLE RECOMMANDE
Les Concepts de Base de la POO
64
classe Pile{
contenu: Liste de T // Liste<T>
empiler(e: T){
this.contenu.ajouter(1,e);
}
depiler(){
this.contenu.enlever(1);
}
sommet(): T {
retourner this.contenu.premier();
}
vide () : Booleen{
retourner this.contenu.vide();
}
Pile(){
this.contenu.= nouveau Liste();
}
}
65
Concepts Avancés
66
Héritage multiple
Afin d’augmenter la puissance de modélisation du Système, il est souhaitable
qu’une classe puisse hériter des propriétés de plusieurs autres classes (héritage
multiple).
Héritage multiple
Héritage multiple
Problème d’homonymie
Il peut y avoir des problèmes de gestion des homonymes si Les classes A et B ont des
attributs et/ou des méthodes dont les noms sont identiques.
C’est (en général) le programmeur qui a la responsabilité de résoudre le problème
Solution C++:
on utilise le nom de la classe mère en préfixe afin de spécifier l'origine du membre requis
(A::attr et B::attr)
Pour les méthodes, il est également possible de redéfinir la super méthode qui est à l’origine
du conflit.
A B
C
Concepts Avancés
69
Héritage multiple
Héritage à répétition d’une propriété.
Il y a héritage à répétition lorsqu’une propriété de la même classe ancêtre est
rencontrée sur plus d’un chemin.
Les attributs de la classe A sont présents en double exemplaire
dans la classe D (en provenance de B et C)
Solution C++:
On utilise l’héritage en mode virtuel (virtual) pour préciser de n'incorporer
qu'une seule fois les membres de la classe A dans D
Concepts Avancés
70
Héritage multiple
Quelques règles concernant l’héritage multiple
Chaque généralisation doit couvrir une propriété unique
Si une classe peut être affinée sur plusieurs dimensions distinctes et indépendantes
alors, utiliser des généralisations multiples
Les sous-classes d’une généralisation peuvent ou non être disjointes
Véhicule
VéhiculeTerrestre VéhiculeMarin
Héritage multiple
Héritage multiple accidentel: une instance participe à deux classes se
recouvrant.
Un thésard est à la fois enseignant et étudiant (héritage multiple normal)
Approche de solution:
traiter une Personne comme un objet composé de multiples objets
MembresUniversité
Concepts Avancés
73
Héritage multiple
Héritage multiple accidentel
Personne MembreUniversité
ChargédeCours
Concepts Avancés
74
Héritage multiple
Contournement de l’héritage multiple.
Comment gérer(contourner) l’héritage multiple si le langage de programmation utilisé
ne l’autorise pas (comme Java par exemple) ?
C’est un enjeu d’implémentation mais il est mieux traité si l’on restructure le modèle de
façon anticipée.
Techniques de restructuration:
Délégation utilisant l’agrégation des rôles
Généralisation Imbriquée
Concepts Avancés
75
Héritage multiple
Contournement de l’héritage multiple (Agrégation des rôles)
Une superclasse avec des généralisations multiples indépendantes peut être remaniée comme un
agrégat dans lequel chaque composant remplace une généralisation.
EmployéNonProtégé
EmployéProtég
EmployéSalarié
EmployéHorair
Vacataire
é
e
Concepts Avancés
76
Héritage multiple
Contournement de l’héritage multiple (Héritage + Agrégation)
Hériter de la classe la plus importante et Déléguer le reste
Employé PensionEmployé
EmployéNonProtég
EmployéProtégé
EmployéSalari
EmployéHoraire
Vacataire
é
é
Contournement
77
Généralisation Imbriquée: Factoriser d’abord sur une généralisation puis sur une autre
et ainsi de suite.
Employé
EmployéSNonProtég
EmployéVNonProtég
EmployéSProtég
EmployéVProtég
EmployéHProtégé
é
é
é
Concepts Avancés
78
Héritage multiple
Contournement de l’héritage multiple – Quelques conseils.
Si une classe a plusieurs superclasses d’importance égale: utiliser la délégation qui préserve
la symétrie du modèle;
Si une des superclasses dominent les autres: héritage simple + délégation;
Si le nombre de combinaisons est réduit, envisager la généralisation imbriquée sinon il faut
l’éviter
Si une superclasse a largement plus de propriétés que les autres superclasses ou qu’une
superclasse représente un goulot d’étranglement, préserver l’héritage à travers ce chemin
Si l’on utilise la généralisation imbriquée, il faut factoriser en commençant par le critère plus
important.
Éviter si possible les généralisations imbriquées si une grande quantité de code doit être
dupliquée
Seules les généralisations imbriquées permettent de préserver une identité stricte.
79
Concepts Avancés
80
Classes Abstraites
Classes qui n’a pas d’instances directes
« new » et « abstract » sont incompatibles
Une classe concrète peut avoir des sous-classes abstraites (mais elles doivent
avoir des descendants concrets)
Une classe abstraite ne peut pas être une classe feuille dans l’arbre
d’héritage
Concepts Avancés
81
Classes Abstraites
Particularités
Les classes abstraites servent à organiser les propriétés communes à
plusieurs classes:
pour encapsuler les classes qui participent à la même association ou agrégation
pour définir des méthodes qui doivent être héritées par des sous-classes.
Classes Abstraites
Exemple
Employé
cumulsalaireanné
calculerpaie
Classes Abstraites
Exemple
ObjetGraphique
dessiner
Classes Abstraites
Implémentation dans les langages
En C++, une classe abstraite est une classe contenant au moins une méthode virtuelle pure
(méthode abstraite); Il n’y a d’autre moyen de rendre une classe abstraite qu’en y
installant une méthode abstraite ou virtuelle pure
Virtual float calculerPaie() = 0;
En Java , C# ou en PHP5, une classe abstraite doit être explicitement déclarée abstraite:
abstract class C {…}.
Ces 3 langages n’accepteraient pas qu’une méthode abstraite soit définie dans une
classe, si cette classe elle-même n’est pas déclarée comme abstraite. Par contre, ils
acceptent d’une classe qu’elle soit abstraite, alors qu’aucune méthode abstraite ne s’y
trouve.
public abstract class EmployeSalarie extends Employe{
…….
}
Classes Abstraites
85
Classes Abstraites
Intérêt des classes abstraites
Elles permettent souvent une meilleure conception de la hiérarchie des
classes (reflétant plus précisément ce que l’on essaie de modéliser)
Elles permettent une meilleure localisation des erreurs d’exécution
Les classes abstraites ont un caractère général et sont donc souvent
réutilisable.
Classes Génériques
Une classe générique (classe paramétrée, template) est le descripteur d’une
classe ayant un ou plusieurs paramètres formels.
Une classe générique définit une famille de classes non directement utilisable
Une liaison des paramètres à des valeurs particulières génère une classe
particulière
Les classes génériques sont utilisée massivement dans les classes de type
collections: List, Array, Set, etc.
La génération des implémentations selon le type des paramètres est généralement à la
charge du compilateur du langage objet de définition de classe paramétrée.
L’intérêt d’utiliser des classes paramétrées est la facilité de réutilisation, dans des
contextes différents selon les paramètres.
L’inconvénient est souvent l’accroissement de la taille du code généré.
Concepts Avancés
89
Classes Génériques
Dans la plupart des environnement Objet, les collections sont des classes
d’objets génériques qui offrent des méthodes d’accès spécifiques. Le paramètre
est souvent le type des objets de la collection. Elles peuvent être organisées en
hiérarchie de généralisation.
Exemple : List<X> et Set<X>
Set<Int> , List<Etudiant>
Set<List<Vin>>
Concepts Avancés
90
Classes Génériques
Exemple
class Phrase {
List <Array <char>> Séquence; };
class Paragraphe {
Phrase Thème;
List <Phrase> Détails;
Phrase Conclusion; };
class Texte {
List <Paragraphe*> Contenu; };
Concepts Avancés
91
Classes Génériques
Exemple
public class Duo<T, S> {
private T valeur1;
private S valeur2; public T getValeur1() {
public Duo(){ return valeur1;}
this.valeur1 = null;
public void setValeur1(T valeur1) {
this.valeur2 = null;} this.valeur1 = valeur1;}
public S getValeur2() {
public Duo(T val1, S val2){ return valeur2;}
this.valeur1 = val1;
public void setValeur2(S valeur2) {
this.valeur2 = val2;} this.valeur2 = valeur2;}
}
92
Concepts Avancés
93
Polymorphisme
Polymorphisme
Question:
Soit une méthode m de la superclasse C, redéfinie dans les sous-classes C 1, …
Cn de C;
Soit refc (refc: C) une référence à une instance quelconque de C ou d’un
descendant Ci de C;
Soit le message : refc.m(). Quelle version de m doit être appelée étant donnée
que refc peut référencer un C ou un Ci ?
Réponses:
Si l’on se base sur le type de la référence (C), C.m() sera évoquée;
Si l’on se base sur le contenu de l’objet référencé, sot Cj la classe de cet objet,
alors la méthode Cj.m() sera évoquée. Polymorphisme
Concepts Avancés
95
Polymorphisme
Définition: le polymorphisme est la possibilité qu’une variable soit
utilisée pour référencer des objets de différents types (appartenant à une
hiérarchie) et pour appeler automatiquement la version appropriée de la
méthode de l’objet qu’elle référence.
Avantages :
Possibilité de regrouper des objets d’une même hiérarchie dans une même
structure (tableau, liste etc.) pour les traiter de façon uniforme.
Référencer un code nouveau à partir d’un code ancien.
Concepts Avancés
96
Polymorphisme
Mise en Œuvre:
Pour utiliser le polymorphisme sur une méthode m, il faut que m soit définie
dans la superclasse et dans la sous-classe.
Approche Java: mise en œuvre automatique du polymorphisme (toute
méthode est considérée comme virtuelle);
Approche C++: la méthode concernée doit être déclarée virtuelle dans la
superclasses et redéfinie dans les sous-classes qui nécessitent une
redéfinition.
Approche C#: la méthode doit être déclarée virtual (dans la superclasse) et
override (dans la sous-classe)
Concepts Avancés
97
Polymorphisme
Mise en Œuvre: