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