Design Patterns Les problèmes de la programmation objet

publicité
Design Patterns
Une manière de capitaliser et
de réutiliser des objets
Les problèmes de la
programmation objet
Pourquoi concevoir des objets est difficile ?
Multiplicité des solutions « offertes » par les
langages
Multiplicité des architectures
Visions multiples :
Algorithmes et données
Multiplicité des granularités
Faible granularité : peu réutilisable ou réadaptable
Forte atomicité : multiplication peu gérable du nombre
total d’objets
1
Les problèmes de la
programmation objet
Pourquoi concevoir des objets «
réutilisables » est encore plus difficile ?
Définir des objets qui peuvent s’accommoder de
situations nouvelles (flexibilité)
Définir des hiérarchies de classes pas trop
contraignantes
Spécifier des relations entre les objets de
manière portable
Une telle conception
Est même pour un designer expérimenté «
impossible à réaliser en une fois »
L’idée : réutiliser les schémas de
raisonnement ayant fait leur preuve : les
design patterns
Christopher Alexander « Chaque schéma
décrit un problème récurrent dans un
environnement, et décrire une solution de
tel manière à ce que la solution puisse être
utilisée plus d’un million de fois sans jamais
faire deux fois la même chose de la même
manière »
(L’approche de Christopher Alexander est une
approche d’un architecte d’immeubles !)
2
Les éléments caractérisant un
« design pattern »
Le nom : sert à
caractériser un «
design problem »
Le problème : décrit le
problème et le
contexte que la
solution apporte
Spécification
La solution : décrit les
éléments composant
le design, les relations
et collaborations avec
les autres éléments
Les conséquences :
les résultats et les
compromis liés à
l’utilisation du pattern
Implantation
Une classification des «
Design pattern »
Les « creational patterns ». Ce sont des
patterns qui créent des objets.
Les « structural patterns ». Ce sont des
patterns qui définissent des modes
d’accès aux objets
Les « behavioral patterns ». Ce sont des
patterns qui définissent un comportement
à l’exécution.
3
Les éléments décrits dans un
« design pattern »
1.
2.
3.
4.
5.
Nom et
classification
Objet
Motivation
Application
Structure
6.
7.
8.
9.
Participants
Collaborations
Conséquences
Implantations
Un « design pattern » en détail
Adapter :
Structural Design Pattern
Description brève
Aussi connu sous le nom de « wrapper »
Convertit l’interface d’une classe en une autre classe afin
que cette objet puisse être utilisé par un client.
Motivation
L’implantation d’un objet est disponible selon une interface
Les algorithmes manipulant ces objets attendent une autre
interface
4
Exemple : utiliser une boîte de
texte dans un éditeur graphique ?
Le domaine d’application d’un
tel « design pattern »
Ce pattern peut-être utilisé
Quand on souhaite utilisé une classe
existante et qu’il n’existe aucune classe
compatible avec l’interface
Quand on souhaite créer des classes qui
pourront coopérer avec des classes non
corrélées ou non encore définies
Quand on souhaite hériter d’une classe
n’ayant pas l’interface souhaité
5
Quelle fonctionnalité doit supporter le
langage pour implanter un « Adapter » ?
L’adapter fait appel à « l’héritage
multiple »
Implantation de l’exemple
précédent
La classe « nouvelle
class Shape {
public: Shape();
virtual void BoundingBox(Point& bottomLeft,
Point& topRight ) const;
virtual Manipulator* CreateManipulator() const;
};
interface »
class TextView {
La classe « ancienne
public:
TextView();
void GetOrigin(Coord& x, Coord& y) const;
void GetExtent(Coord& width, Coord& height) const;
virtual bool IsEmpty() const;
};
interface »
6
Implantation de l’exemple
précédent
class TextShape : public Shape, private
TextView
{ public:
TextShape();
virtual void BoundingBox(
Point& bottomLeft, Point& topRight )
const;
virtual bool IsEmpty() const; virtual
Manipulator* CreateManipulator() const;
};
La surcharge des fonctions de
la nouvelle interface
void TextShape::BoundingBox ( Point& bottomLeft, Point& topRight )
const
{ Coord bottom, left, width, height;
GetOrigin(bottom, left); GetExtent(width, height);
bottomLeft = Point(bottom, left); topRight =
Point(bottom + height, left + width);
}
Manipulator* TextShape::CreateManipulator () const { return new
TextManipulator(this);
}
bool TextShape::IsEmpty () const {
return TextView::IsEmpty();
}
7
Autres exemples de « design
pattern » : un singleton
Nom
Categorie
Singleton
Creational Design Pattern
Objet
Garantir qu’au plus une seule instance
d’une classe puisse être construite.
Structures et collaborations
Structures
Participants
Définit une instance de la classe
Expose une interface correspondant à celle de
la classe aux clients
Collaborations
Toute classe n’accède à la classe instanciée
qu’au travers du « Singleton ».
8
Exemple d’implantation d’une
telle classe
class MyObject {
public:
static MyObject* Instance();
protected:
MyObject ();
private:
static MyObject* _instance;
…
// Ajouter l’interface existante
};
Comment utiliser des « design
patterns » ?
Une aide à trouver d’abord les « bons objets »
Les design patterns offrent des schémas permettant de capture
les objets les moins évident à modéliser, comme les processus
ou les algorithmes
Une aide à trouver la bonne granularité
Les design patterns permettent d’aider à trouver le bon
compromis entre la taille des objets et leur nombre et notamment
De gérer de nombreux objets à une granularité très fine.
De décomposer un objet en sous-objets
De créer des objets de types déterminés à l’exécution
De définir des objets dont la seule mission a pour but de contrôler
d’autres objets
9
Comment utiliser des « design
patterns » ?
Une aide à la « spécification d’interface »
Les design patterns permettent d’aider à
construire une interface en offrant des schémas
permettant
D’ adapter des interfaces
De déléguer des interfaces,
D’isoler des interfaces (accès par mandataire)
…
Les « design patterns » sont en
conséquence un moyen de capitaliser un
ensemble de schémas de conception et de
les offrir au programmeur.
Où trouver des « design
patterns » ?
Dans de nombreux ouvrages dédiés :
Addison Wesley - Design Patterns - E. Gamma,
R. Helm, R. Johnson, J. Vlissides (1995)
Sur le WEB :
http://www.cs.wustl.edu/~schmidt/tutorialspatterns.html Un ensemble de tutoriel sur les «
design patterns »
Et bien plus encore sur le site du cours
http://www.ensta.fr/~bmonsuez/Cours
10
Téléchargement