génie logiciel avancé cours 5 conception d'un système...

127
Génie Logiciel Avancé Cours 5 — Conception d’un système d’objets Stefano Zacchiroli [email protected] Laboratoire PPS, Université Paris Diderot - Paris 7 3 mars – 7 avril 2011 URL http://upsilon.cc/zack/teaching/1011/gla/ Copyright © 2011 Stefano Zacchiroli License Creative Commons Attribution-ShareAlike 3.0 Unported License http://creativecommons.org/licenses/by-sa/3.0/ Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 1 / 99

Upload: dodat

Post on 25-Apr-2018

218 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Génie Logiciel AvancéCours 5 — Conception d’un système d’objets

Stefano [email protected]

Laboratoire PPS, Université Paris Diderot - Paris 7

3 mars – 7 avril 2011

URL http://upsilon.cc/zack/teaching/1011/gla/Copyright © 2011 Stefano ZacchiroliLicense Creative Commons Attribution-ShareAlike 3.0 Unported License

http://creativecommons.org/licenses/by-sa/3.0/

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 1 / 99

Page 2: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Sommaire

1 Patron de conception à objets

2 Création (Creational Patterns)

3 Structure (Structural Patterns)

4 Comportement (Behavioral Patterns)

5 Les anti-patrons de conception (Anti-patterns)

6 Synthèse

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 2 / 99

Page 3: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Sommaire

1 Patron de conception à objets

2 Création (Creational Patterns)

3 Structure (Structural Patterns)

4 Comportement (Behavioral Patterns)

5 Les anti-patrons de conception (Anti-patterns)

6 Synthèse

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 3 / 99

Page 4: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Architecture d’un système à objets

Les différents styles architecturaux du dernier cours donnent despistes pour organiser un système suivant multiples niveauxd’abstractions, multiples modèles de calcul et multiplescomposantes de façon à :

minimiser les interdépendances et maximiser la cohésion

Les objets (et les modules) sont des briques élémentairespermettant de réaliser ces architectures puisque :

Ils aident à maximiser la cohésion grâce à l’encapsulation deleur état.

Les classes abstraites (et l’héritage) permettent de minimiser lesinterdépendances en contrôlant le niveau de détails des servicesvisibles par les clients d’un objet.

Le sujet d’aujourd’hui :

Comment agencer ces briques ?

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 4 / 99

Page 5: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Deux difficultés

1 La conception de composants réutilisables est une activitédélicate.

2 La programmation objet a des problèmes intrinsèques.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 5 / 99

Page 6: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Les patrons de conception : des « recettes »

Un programmeur ou un concepteur expérimenté réutilise desprocédés d’organisation qui ont fonctionné dans le passé.

Ces solutions sont indépendantes (en général) du langage objetutilisé.

Exemple (Par exemple, dans votre expérience. . . )

XHTML + CSS : séparer un contenu de la description de sa miseen forme.

Idée à retenir :ñ un composant traitant les données (modèle),ñ un composant de visualisation (vue).

Compilateur : composition de traductions bien spécifiées.

Idée à retenir :ñ la fameuse separation of concerns de Dijkstra.ñ “Un composant bien conçu se focalise sur un unique problème.”

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 6 / 99

Page 7: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Références

~Menu~Création

Fabrique abstraite (Abstract Factory) Monteur (Builder) 

Fabrique (Factory Method) Prototype (Prototype) Singleton (Singleton) 

StructureAdaptateur (Adapter) 

Pont (Bridge) Objet composite (Composite) 

Décorateur (Decorator) Façade (Facade) 

Poids­mouche ou poids­plume (Flyweight) Proxy (Proxy) 

ComportementChaîne de responsabilité (Chain of responsibility) 

Commande (Command) Interpréteur (Interpreter) 

Itérateur (Iterator) Médiateur (Mediator) Memento (Memento) 

Observateur (Observer) État (State) 

Stratégie (Strategy) Patron de méthode (Template Method) 

Visiteur (Visitor) 

Gamma, Helm, Johnson, VlissidesDesign Patterns : Elements ofReusable Object-Oriented Software.Addison-Wesley, 1995.

auteurs AKA “Gang of Four” (GoF)

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 7 / 99

Page 8: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Classification des patrons de conception

GoF ont explicité trois grandes classes de patrons dans leur livre,chacune spécialisée dans :

création d’objets (creational patterns)

structure des relations entre objets (structural patterns)

comportement des objets (behavioral patterns)

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 8 / 99

Page 9: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational
Page 10: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Héritage ou composition ?

on parle de white-box reuse quand on réutilise du code à traversl’héritage

ñ est dangereux, car les sous-classes ont droit à briserl’encapsulation

ñ n’est pas toujours possible (p. ex. code propriétaire dont ladocumentation interne n’est pas disponible)

on parle de black-box reuse quand on réutilise du code à traversla composition d’objet (association/composition/agrégation)

ñ est dynamique, donc le compilateur et le langage deprogrammation n’aident pas à imposer des contraints de bonneforme

« est plus difficile raisonner sur un logicielñ les objets parlent entre eux seulement à travers interfaces, donc

l’encapsulation est sauvegardé

Principe général

Favor object composition over class inheritance.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 10 / 99

Page 11: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Sommaire

1 Patron de conception à objets

2 Création (Creational Patterns)

3 Structure (Structural Patterns)

4 Comportement (Behavioral Patterns)

5 Les anti-patrons de conception (Anti-patterns)

6 Synthèse

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 11 / 99

Page 12: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Fabrique (Factory Method) — description

Exemple Je veux fournir un composant réutilisable implémentantun dictionnaire. Ce dictionnaire doit être implémenté àl’aide de la structure de données la plus adaptéepossible (p. ex. une table de hachage tant que sa taillen’excède pas quelques Mo, une base de données sinon).Les prochaines versions de mon composant intégrerontde nouvelles structures de données.

Problème Comment rendre la choix de la structure de donnéesindépendant de l’acte d’instanciation ?

Solution On fournit une classe DictionaryFactory qui répond aumessage CreateDictionary (n)—le factory method—où nest le nombre potentiel d’entrées dans le dictionnaire.L’implémentation de cette classe choisit la bonnesous-classe et en retourne une instance vue comme unDictionary. On ne divulgue donc que DictionaryFactoryet Dictionary.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 12 / 99

Page 13: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Fabrique (Factory Method) — description

Exemple Je veux fournir un composant réutilisable implémentantun dictionnaire. Ce dictionnaire doit être implémenté àl’aide de la structure de données la plus adaptéepossible (p. ex. une table de hachage tant que sa taillen’excède pas quelques Mo, une base de données sinon).Les prochaines versions de mon composant intégrerontde nouvelles structures de données.

Problème Comment rendre la choix de la structure de donnéesindépendant de l’acte d’instanciation ?

Solution On fournit une classe DictionaryFactory qui répond aumessage CreateDictionary (n)—le factory method—où nest le nombre potentiel d’entrées dans le dictionnaire.L’implémentation de cette classe choisit la bonnesous-classe et en retourne une instance vue comme unDictionary. On ne divulgue donc que DictionaryFactoryet Dictionary.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 12 / 99

Page 14: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Fabrique (Factory Method) — interface en C++

// Dictionary from string to string .class Dictionary {public :

struct NotFound { } ;

virtual Dictionary *addEntry ( const std : : str ing& key , const std : : str ing& value ) = 0;

virtual const std : : str ing&operator [ ] ( const std : : str ing& key ) const throw (NotFound ) = 0;

} ;

// Dictionary factory chooses the best implementation// given the potential number of entries .class DictionaryFactory {public :

// You are responsible for the l i f e of the result ing dictionary .Dictionary * create ( long int potential_entry_number ) ;

} ;

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 13 / 99

Page 15: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Fabrique (Factory Method) — implémentation en C++

class RedBlackTreeDictionary : public Dictionary {virtual Dictionary *addEntry ( const std : : str ing& key , const std : : str ing& value ) { . . . }

virtual const std : : str ing&operator [ ] ( const std : : str ing& key ) const throw (NotFound ) { . . . }

} ;

class DataBaseDictionary : public Dictionary {virtual Dictionary *addEntry ( const std : : str ing& key , const std : : str ing& value ) { . . . }

virtual const std : : str ing&operator [ ] ( const std : : str ing& key ) const throw (NotFound ) { . . . }

} ;

Dictionary * DictionaryFactory : : create ( long int potential_entry_number ) {i f ( potential_entry_number <= 100000000L )

return (new RedBlackTreeDictionary ( ) ) ;else

return (new DataBaseDictionary ( ) ) ;}

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 14 / 99

Page 16: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Fabrique (Factory Method) — UML

Product ConcreteCreator

+factoryMethod() : Product

Creator

+factoryMethod() : Product

http://en.wikipedia.org/wiki/File:FactoryMethod.svg

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 15 / 99

Page 17: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Fabrique (Factory Method) — discussion

Une fabrique peut aussi servir à différencier les constructeurs declasse, à l’aide d’un nom.

En effet, il n’est pas toujours évident de dissocier lesconstructeurs seulement à l’aide de leur signature (i.e. du typesdes arguments).

Dans notre exemple, on peut vouloir construire un dictionnaireà l’aide d’un entier correspondant :

ñ au nombre moyen d’entrées ;ñ ou au nombre minimal d’entrées ;ñ ou au nombre maximal d’entrées.

Les constructeurs auraient tous la même signature !

Dans ce cas, on peut plutôt donner un nom explicite auxmessages de la fabrique pour dénoter le cas de construction(createFromMean,createFromMin,createFromMax).

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 16 / 99

Page 18: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Fabrique (Factory Method) — vision fonctionnelle

Introduire une indirection pour la construction des données est unprocédé d’encapsulation très courant dans tous les paradigmes deprogrammation.Lorsque le langage de programmation fournit des types abstraits, onimplémente des « constructeurs intelligents » (smart constructor).

module Dictionary : sigtype t ( * Abstract type of dict ionaries . * )val mk_dictionary : in t −> t ( * Smart constructor . * )( * Funct ional i t ies * )val add_entry : str ing −> str ing −> t −> tval get_entry : str ing −> t −> t

end = structtype t =

| RedBlackTreeDictionary of RedBlackTreeDictionary . t| DataBaseDictionary of DataBaseDictionary . t

let mk_dictionary nb_potential_entries =i f nb_potential_entries <= 10000000L then

RedBlackTreeDictionary RedBlackTreeDictionary .emptyelse

DataBaseDictionary DataBaseDictionary .emptyend

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 17 / 99

Page 19: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Fabrique abstraite (Abstract Factory) — description

Exemple Je veux distribuer une nouvelle version de moncomposant : les dictionnaires peuvent maintenant êtrepersistants (la méthode addEntry renvoie une nouvelleinstance du dictionnaire sur le tas et ne détruit pas laprécédente).

Problème Comment minimiser la quantité de code à modifier pourassurer la migration vers la nouvelle version (sans pourautant divulguer les sous-classes mise en jeu) ?

Solution Appliquer le motif de Fabrique à la Fabrique elle-même !La classe DictionaryFactory devient abstraite. On créeune classe PersistantDictionaryFactory et une classeNonPersistantDictionaryFactory. On peut ensuite définirune classe DictionaryFactoryCreator qui choisitd’instancier la bonne fabrique en fonction d’un booléen.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 18 / 99

Page 20: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Fabrique abstraite (Abstract Factory) — description

Exemple Je veux distribuer une nouvelle version de moncomposant : les dictionnaires peuvent maintenant êtrepersistants (la méthode addEntry renvoie une nouvelleinstance du dictionnaire sur le tas et ne détruit pas laprécédente).

Problème Comment minimiser la quantité de code à modifier pourassurer la migration vers la nouvelle version (sans pourautant divulguer les sous-classes mise en jeu) ?

Solution Appliquer le motif de Fabrique à la Fabrique elle-même !La classe DictionaryFactory devient abstraite. On créeune classe PersistantDictionaryFactory et une classeNonPersistantDictionaryFactory. On peut ensuite définirune classe DictionaryFactoryCreator qui choisitd’instancier la bonne fabrique en fonction d’un booléen.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 18 / 99

Page 21: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Fabrique abstraite (Abstract Factory) — UML

http://thisblog.runsfreesoftware.com/?q=Abstract+Factory+Design+Pattern+UML+Class+Diagram

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 19 / 99

Page 22: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Abstraction de l’allocation etgestion explicite de la mémoire

typedef std : : l i s t < std : : pair <std : : string , std : : string > > ent ry_ l i s t ;

Dictionnary*add_l ist ( Dictionnary* dict , const ent ry_ l i s t& entr ies ) {

Dictionnary* accu = dict ;for ( en t ry_ l i s t : : i t e ra tor i = entr ies . begin ( ) ; i != entr ies .end ( ) ; ++ i )

accu = accu−>add_entries ( i−>f i r s t , i−>second ) ;return ( accu ) ;

}

Quelle est l’empreinte mémoire de l’exécution de ceprogramme ?

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 20 / 99

Page 23: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Pointeur intelligent (Smart Pointer) — description

Exemple 1 Après leur migration à la version persistante de moncomposant, les utilisateurs se plaignent de la présencede fuites de mémoire.

Problème Lors le mécanisme d’allocation est abstrait, on ne peutpas demander au client de désallouer l’instance. End’autres termes, il faut aussi implémenter unmécanisme abstrait de désallocation.

Solution Les objets implémentent le comportement de pointeursmunis d’un mécanisme de destruction automatiquelorsque l’on ne les utilise plus. Il existe plusieursimplémentations de ces pointeurs « intelligents » :

les auto-pointeurs (présents dans la bibliothèquestandard de C++) ;les compteurs de références (présents dans labibliothèque Boost).

1. ce patron s’applique seulement en absence de ramasse-miettesStefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 21 / 99

Page 24: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Pointeur intelligent (Smart Pointer) — description

Exemple 1 Après leur migration à la version persistante de moncomposant, les utilisateurs se plaignent de la présencede fuites de mémoire.

Problème Lors le mécanisme d’allocation est abstrait, on ne peutpas demander au client de désallouer l’instance. End’autres termes, il faut aussi implémenter unmécanisme abstrait de désallocation.

Solution Les objets implémentent le comportement de pointeursmunis d’un mécanisme de destruction automatiquelorsque l’on ne les utilise plus. Il existe plusieursimplémentations de ces pointeurs « intelligents » :

les auto-pointeurs (présents dans la bibliothèquestandard de C++) ;les compteurs de références (présents dans labibliothèque Boost).

1. ce patron s’applique seulement en absence de ramasse-miettesStefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 21 / 99

Page 25: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Pointeur intelligent (Smart Pointer)

Dans notre exemple, la méthode addEntry renvoie désormais unpointeur intelligent vers un dictionnaire.

boost : : shared_ptr<Dictionary > addEntry ( . . . ) ;

Il est malheureusement nécessaire de modifier le code client carla signature de la méthode addEntry a changé.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 22 / 99

Page 26: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Monteur (Builder) — description

Exemple Pour obtenir une partie d’échec pleinement initialisée, jedois avoir un plateau, attendre que deux joueurs soientprêts à jouer, s’accorder sur le type de partie voulue, etenfin déterminer la couleur de chacun des joueurs.Mon programme permet de jouer sur différentes formesde plateau, les joueurs peuvent se connecter localementou via un serveur, il y a 30 types de partie proposés . . .

Problème Comment décorréler le protocole de création d’unepartie de la nature de ces parties ?

Solution Un objet GameDirector fait office de fabriqueimplémentant le protocole en appelant les fabriques desdifférents composants de la partie dans le bon ordre.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 23 / 99

Page 27: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Monteur (Builder) — description

Exemple Pour obtenir une partie d’échec pleinement initialisée, jedois avoir un plateau, attendre que deux joueurs soientprêts à jouer, s’accorder sur le type de partie voulue, etenfin déterminer la couleur de chacun des joueurs.Mon programme permet de jouer sur différentes formesde plateau, les joueurs peuvent se connecter localementou via un serveur, il y a 30 types de partie proposés . . .

Problème Comment décorréler le protocole de création d’unepartie de la nature de ces parties ?

Solution Un objet GameDirector fait office de fabriqueimplémentant le protocole en appelant les fabriques desdifférents composants de la partie dans le bon ordre.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 23 / 99

Page 28: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Monteur (Builder)

http://en.wikipedia.org/wiki/File:Builder2.png

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 24 / 99

Page 29: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Prototype (Prototype) — description

Exemple On veut créer des modèles de partie d’échec (parexemple, une partie d’échec en Blitz sur un plateau en 3dimensions avec deux joueurs sur le réseau ou encoreune partie d’échec sans limitation de temps sur unplateau en ASCII avec un joueur local jouant contre unprogramme, . . . ).

Problème Doit-on faire une classe de fabrique par combinaison ?

Solution Pour éviter la multiplication des sous-classes, onreprésente une combinaison particulière desparamètres à l’aide d’une instance d’une classeGamePrototype qu’on est capable de cloner.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 25 / 99

Page 30: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Prototype (Prototype) — description

Exemple On veut créer des modèles de partie d’échec (parexemple, une partie d’échec en Blitz sur un plateau en 3dimensions avec deux joueurs sur le réseau ou encoreune partie d’échec sans limitation de temps sur unplateau en ASCII avec un joueur local jouant contre unprogramme, . . . ).

Problème Doit-on faire une classe de fabrique par combinaison ?

Solution Pour éviter la multiplication des sous-classes, onreprésente une combinaison particulière desparamètres à l’aide d’une instance d’une classeGamePrototype qu’on est capable de cloner.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 25 / 99

Page 31: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Prototype (Prototype) — en Scala (1/2)

abstract class Board { def cloneMe ( ) : Board }class Board2d extends Board { override def cloneMe ( ) = this }class Board3d extends Board { override def cloneMe ( ) = this }

abstract class Kind { def cloneMe ( ) : Kind }class B l i t z extends Kind { override def cloneMe ( ) = this }class Standard extends Kind { override def cloneMe ( ) = this }

abstract class Player { def cloneMe ( ) : Player }class LocalPlayer extends Player { override def cloneMe ( ) = this }class AIPlayer extends Player { override def cloneMe ( ) = this }

class Game ( board : Board , kind : Kind ,player_1 : Player , player_2 : Player ) {

var _board : Board = boardvar _kind : Kind = kindvar _player_1 : Player = player_1var _player_2 : Player = player_2

def play ( ) = . . .}

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 26 / 99

Page 32: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Prototype (Prototype) — en Scala (2/2)

class GamePrototypeFactory ( board : Board , kind : Kind ,player_1 : Player , player_2 : Player ) {

var _board : Board = boardvar _kind : Kind = kindvar _player_1 : Player = player_1var _player_2 : Player = player_2

def makeGame ( ) = new Game ( _board . cloneMe ( ) , _kind . cloneMe ( ) ,_player_1 . cloneMe ( ) , _player_2 . cloneMe ( ) )

}

val standard_game_factory =new GamePrototypeFactory (new Board2d , new Standard ,

new LocalPlayer , new LocalPlayer )

val alone_game_factory =new GamePrototypeFactory (new Board2d , new Standard ,

new LocalPlayer , new AIPlayer )

val blitz_game_factory =new GamePrototypeFactory (new Board2d , new Bl i tz ,

new LocalPlayer , new AIPlayer )

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 27 / 99

Page 33: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Prototype (Prototype) — dans un langage fonctionnel

Dans un cadre fonctionnel, on peut composer les constructeurs pourobtenir de nouveaux constructeurs (ce sont des objets de premièreclasse).

Exemple

val mk_board_2d : unit −> Board . tval mk_board_3d : unit −> Board . tval mk_local_player : unit −> Player . tval mk_ai_player : unit −> Player . tval mk_blitz : unit −> Kind . tval mk_standard : unit −> Kind . t

let mk_game mk_board mk_kind mk_player_1 mk_player_2 =(mk_board ( ) , mk_kind ( ) , mk_player_1 ( ) , mk_player_2 ( ) )

let mk_standard_game ( ) =mk_game mk_board_2d mk_local_player mk_local_player mk_standard

let mk_alone_game ( ) =mk_game mk_board_2d mk_local_player mk_ai_player mk_standard

let mk_blitz_game ( ) =mk_game mk_board_2d mk_local_player mk_ai_player mk_blitz

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 28 / 99

Page 34: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Singleton (Singleton) — description

Exemple Un programme s’exécute dans un environnement qui aune existence physique particulière (un systèmed’exploitation, un numéro de processus, . . . ). On veutle représenter par un objet qui est une instance d’uneclasse Environment.

Problème Pour une exécution donnée, il ne doit exister qu’uneunique instance de la classe Environment.

Solution On empêche l’instanciation explicite (par unconstructeur) de la classe Environment. Une classeEnvironmentSingleton est fournie et offre le servicegetInstance qui construit une instance de laclasse Environment la première fois qu’il est appelé puisrenvoie cette même instance lors des invocationssuivantes.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 29 / 99

Page 35: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Singleton (Singleton) — description

Exemple Un programme s’exécute dans un environnement qui aune existence physique particulière (un systèmed’exploitation, un numéro de processus, . . . ). On veutle représenter par un objet qui est une instance d’uneclasse Environment.

Problème Pour une exécution donnée, il ne doit exister qu’uneunique instance de la classe Environment.

Solution On empêche l’instanciation explicite (par unconstructeur) de la classe Environment. Une classeEnvironmentSingleton est fournie et offre le servicegetInstance qui construit une instance de laclasse Environment la première fois qu’il est appelé puisrenvoie cette même instance lors des invocationssuivantes.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 29 / 99

Page 36: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Singleton (Singleton) — en C++

class EnvironmentSingleton ;

class Environment {private :

Environment ( ) { }friend class EnvironmentSingleton ;

} ;

class EnvironmentSingleton {private :

static Environment* _instance ;

public :Environment& getInstance ( ) {

i f ( EnvironmentSingleton : : _instance == NULL) {EnvironmentSingleton : : _instance = new Environment ( ) ;

}return ( * EnvironmentSingleton : : _instance ) ;

}} ;

Environment* EnvironmentSingleton : : _instance = NULL;

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 30 / 99

Page 37: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Singleton (Singleton) — critique

Le patron Singleton permet de définir des variables globalesdont l’initialisation est contrôlée.

On peut raffiner l’implémentation précédente pour s’assurerque la classe se comporte bien dans un environnementconcurrent à l’aide de verrous (mutex).

Problèmes de : concurrence, unit testing, bouclesd’instanciation, héritage, etc.

L’utilisation de variables globales peut mettre en dangerl’encapsulation et l’extensibilité du système. Il faut donc utiliserce patron avec parcimonie.

ñ Pour une discussion intéressante sur ce sujet :http://www.codingwithoutcomments.com/2008/10/08/singleton-i-love-you-but-youre-bringing-me-down/

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 31 / 99

Page 38: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Réserve d’objets (Object Pool) — description

Exemple Un serveur peut traiter un nombre N de clientssimultanés. Chaque client se voit allouer des ressourcesdont l’allocation est longue (une connexion sur unebase de données externes, des périphériques systèmes,. . . ).

Problème Lorsque les ressources utilisées par chaque instancesont coûteuses et bornées, on veut contrôler le nombred’instances d’une classe donnée.

Solution On peut utiliser un gestionnaire de ressources (unefabrique) fournissant un service acquire, donnant accèsà une instance si c’est possible, et un service releasepermettant de réinjecter l’instance dans l’ensemble desinstances accessibles.

Référence : http://www.kircher-schwanninger.de/michael/publications/Pooling.pdf

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 32 / 99

Page 39: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Réserve d’objets (Object Pool) — description

Exemple Un serveur peut traiter un nombre N de clientssimultanés. Chaque client se voit allouer des ressourcesdont l’allocation est longue (une connexion sur unebase de données externes, des périphériques systèmes,. . . ).

Problème Lorsque les ressources utilisées par chaque instancesont coûteuses et bornées, on veut contrôler le nombred’instances d’une classe donnée.

Solution On peut utiliser un gestionnaire de ressources (unefabrique) fournissant un service acquire, donnant accèsà une instance si c’est possible, et un service releasepermettant de réinjecter l’instance dans l’ensemble desinstances accessibles.

Référence : http://www.kircher-schwanninger.de/michael/publications/Pooling.pdf

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 32 / 99

Page 40: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Réserve d’objets (Object Pool) — réflexion

Que faire si il ne reste plus d’objets en réserve ?

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 33 / 99

Page 41: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Sommaire

1 Patron de conception à objets

2 Création (Creational Patterns)

3 Structure (Structural Patterns)

4 Comportement (Behavioral Patterns)

5 Les anti-patrons de conception (Anti-patterns)

6 Synthèse

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 34 / 99

Page 42: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Adaptateur (Adapter) — description

Exemple J’utilise une bibliothèque de traitement d’images (dontje ne peux pas modifier le code source). Pourfonctionner, elle attend un objet fournissant uneinterface d’accès en lecture et en écriture à un tableauen deux dimensions contenant des triplets d’octets.J’aimerais l’interfacer avec une bibliothèqued’entrées/sorties fournissant une abstraction sur destableaux unidimensionnels stockés de manièrepersistante dans une base de données ou dans unsystème de fichiers.

Problème Comment concilier les services proposés par labibliothèque d’entrées/sorties et l’interface attenduepar la bibliothèque de traitement d’images.

Solution Utiliser un objet qui implémente l’interface attendue enfaisant appel aux services proposés par une instance dela bibliothèque d’entrées/sorties.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 35 / 99

Page 43: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Adaptateur (Adapter) — description

Exemple J’utilise une bibliothèque de traitement d’images (dontje ne peux pas modifier le code source). Pourfonctionner, elle attend un objet fournissant uneinterface d’accès en lecture et en écriture à un tableauen deux dimensions contenant des triplets d’octets.J’aimerais l’interfacer avec une bibliothèqued’entrées/sorties fournissant une abstraction sur destableaux unidimensionnels stockés de manièrepersistante dans une base de données ou dans unsystème de fichiers.

Problème Comment concilier les services proposés par labibliothèque d’entrées/sorties et l’interface attenduepar la bibliothèque de traitement d’images.

Solution Utiliser un objet qui implémente l’interface attendue enfaisant appel aux services proposés par une instance dela bibliothèque d’entrées/sorties.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 35 / 99

Page 44: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Adaptateur (Adapter) — en Java

// image manipulation l ibrarypublic interface ColorImage2D {

public int get_width ( int x ) ;public int get_height ( int x ) ;public short get_red ( int x, int y ) ;public short get_green ( int x, int y ) ;public short get_blue ( int x, int y ) ;

}public static class ImageProcessing {

public static void blur (ColorImage2D image ) { }}

// input/output l ibrarypublic class IOArray {

public short get ( int x) { return 0; }public int size ( ) { return 0; }

}

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 36 / 99

Page 45: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Adaptateur (Adapter) — en Java

public class IOArrayToColorImage2DAdapter implements ColorImage2D {private int width ;private int height ;private IOArray array ;

IOArrayToColorImage2DAdapter ( IOArray array , int width , int height ) {assert ( array . size ( ) == width * height ) ;this . width = width ;this . height = height ;this . array = array ;

}

public int get_width ( int x) { return width ; }public int get_height ( int x) { return height ; }public int get_point ( int x, int y ) {

return array . get ( y * width + x ) ; }public short get_red ( int x, int y ) {

return ( short ) ( this . get_point (x , y ) & 0xff ) ; }public short get_green ( int x, int y ) {

return ( short ) ( this . get_point (x , y ) >> 8 & 0xff ) ; }public short get_blue ( int x, int y ) {

return ( short ) ( this . get_point (x , y ) >> 16 & 0xff ) ; }}

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 37 / 99

Page 46: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Adaptateur (Adapter) — UML

http://en.wikipedia.org/wiki/File:ClassAdapter.png

Figure: class adapter (avec héritage)

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 38 / 99

Page 47: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Adaptateur (Adapter) — UML (cont.)

http://en.wikipedia.org/wiki/File:ObjectAdapter.png

Figure: object adapter (avec composition)

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 38 / 99

Page 48: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Pont (Bridge) — description

Exemple Un logiciel de dessin propose une hiérarchie de formes(carré, cercle, losange, . . . ). Ces formes sontimplémentées comme des ensembles de points quipeuvent être décrits de multiples façons (équationvectorielle, énumération, image bitmap, . . . ).

Problème Pour éviter la multiplication des classes et modulariserle système, il est nécessaire de décorréler la hiérarchiedes abstractions (les formes) de leurs implémentations(les ensembles de points) car elles peuvent varier demanière indépendante.

Solution Les implémentations sont organisées dans unehiérarchie indépendante. Une instance de la classeabstraite du sommet de cette hiérarchie (une classenommée Implementor) est agrégée à toute forme.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 39 / 99

Page 49: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Pont (Bridge) — description

Exemple Un logiciel de dessin propose une hiérarchie de formes(carré, cercle, losange, . . . ). Ces formes sontimplémentées comme des ensembles de points quipeuvent être décrits de multiples façons (équationvectorielle, énumération, image bitmap, . . . ).

Problème Pour éviter la multiplication des classes et modulariserle système, il est nécessaire de décorréler la hiérarchiedes abstractions (les formes) de leurs implémentations(les ensembles de points) car elles peuvent varier demanière indépendante.

Solution Les implémentations sont organisées dans unehiérarchie indépendante. Une instance de la classeabstraite du sommet de cette hiérarchie (une classenommée Implementor) est agrégée à toute forme.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 39 / 99

Page 50: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Pont (Bridge) — UML

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 40 / 99

Page 51: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Pont (Bridge) — UML, cas général

Abstraction

- impl : Implementor

+ function()

RefinedAbstraction

+ refinedFunction()

Implementor

+ implementation()

ConcreteImplementor

+ implementation()

this.impl.implemantation();

http://en.wikipedia.org/wiki/File:Bridge_UML_class_diagram.svg

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 41 / 99

Page 52: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Objet composite (Composite) — description

Exemple Dans un logiciel de dessin, il est possible de créer desgroupes de formes. Un groupe de formes est alorsconsidéré comme une forme.

Problème Comment voir une composition de formes comme uneforme ?

Solution Fournir un objet Shape qui implémente l’interface d’uneforme ainsi que les services add et remove. Unobjet ShapeComposite, héritant de Shape, correspond àun noeud possédant des sous-composants qui sont desformes. Lorsqu’un message est envoyé a une classecomposite, elle le transfère à toutes ses composantes.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 42 / 99

Page 53: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Objet composite (Composite) — description

Exemple Dans un logiciel de dessin, il est possible de créer desgroupes de formes. Un groupe de formes est alorsconsidéré comme une forme.

Problème Comment voir une composition de formes comme uneforme ?

Solution Fournir un objet Shape qui implémente l’interface d’uneforme ainsi que les services add et remove. Unobjet ShapeComposite, héritant de Shape, correspond àun noeud possédant des sous-composants qui sont desformes. Lorsqu’un message est envoyé a une classecomposite, elle le transfère à toutes ses composantes.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 42 / 99

Page 54: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Objet composite (Composite) — UML

Component

+ operation()

Leaf

+ operation()

Composite

+ operation()+ add()+ remove()+ getChild()

1

0..*

parent

child

http://en.wikipedia.org/wiki/File:Composite_UML_class_diagram_(fixed).svg

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 43 / 99

Page 55: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Objet composite (Composite) — critique

L’implémentation des méthodes add et remove n’a pas vraiment desens pour les formes atomiques (cercle, carré, . . . ). On perd ainsi lasûreté (une exception sera lancée si le message add est envoyé à uncercle).

On pourrait n’imposer ces méthodes que dans laclasse ShapeComposite.

On perd alors la transparence car on doit alors avoir untraitement différent pour le cas atomique et pour le cascomposé.

Le GoF estime qu’il s’agit d’un compromis à décider au cas parcas. . .

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 44 / 99

Page 56: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Objet composite sûr — en OCaml

class virtual shape = object ( * interface * )method virtual draw : unit −> unitmethod virtual as_composite : composite option

endand c i r c l e = object ( * leaf * )

inherit shapemethod draw ( ) = ( * . . . * )method as_composite = None

endand composite = object ( se l f ) ( * container * )

inherit shapeval mutable children : shape l i s t = [ ]method as_composite = Some ( se l f :> composite )method add c = children <− c : : childrenmethod remove c = children <− L i s t . f i l t e r ( ( = ) c ) childrenmethod draw ( ) = L i s t . i t e r ( fun c −> c#draw ( ) ) children

end( * . . . why not using an algebraic data type al ltogether ? * )

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 45 / 99

Page 57: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Décorateur (Decorator) — description

Exemple Dans un traitement de texte, un document est formé dedifférents composants (texte, image, figure, . . . ).L’utilisateur doit pouvoir associer une URL à chacun deces composants. Une fois associé, on peut cliquer sur lecomposant pour suivre le lien.

Problème Comment rajouter une fonctionnalité dynamiquement àun objet ?

Solution Une classe décorateur agrège un composant particulieret implémente l’interface d’un composant en déléganttous les messages correspondants à son instanceagrège. En héritant d’un Décorateur, on peut rajouterun comportement particulier, comme par exemple, lagestion des hyperliens.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 46 / 99

Page 58: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Décorateur (Decorator) — description

Exemple Dans un traitement de texte, un document est formé dedifférents composants (texte, image, figure, . . . ).L’utilisateur doit pouvoir associer une URL à chacun deces composants. Une fois associé, on peut cliquer sur lecomposant pour suivre le lien.

Problème Comment rajouter une fonctionnalité dynamiquement àun objet ?

Solution Une classe décorateur agrège un composant particulieret implémente l’interface d’un composant en déléganttous les messages correspondants à son instanceagrège. En héritant d’un Décorateur, on peut rajouterun comportement particulier, comme par exemple, lagestion des hyperliens.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 46 / 99

Page 59: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Décorateur (Decorator) — UML

Component

+ operation()

ConcreteComponent

+ operation()

Decorator

- component

+ operation()

ConcreteDecorator

+ operation()

http://en.wikipedia.org/wiki/File:Decorator_UML_class_diagram.svg

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 47 / 99

Page 60: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Décorateur (Decorator) — discussion

les implémentations de Decorator::operation() typiquementappellent component−>operation() (en ajoutant avant ou aprèsdes autres comportements)

on peut décorer le même objet avec plusieurs décorateurs (aumoins au niveau de types. . . )

on peut changer des “décorations” dynamiquement, car le typedu décorateur(s) est compatible avec le type du composants

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 48 / 99

Page 61: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Façade (Facade)

Exemple Pour traiter les données d’un programme de gestion debibliothèque multimédia, je désire utiliser l’API dePostgresql, un gestionnaire de base de données trèsélaboré. Mon utilisation de la base de données estessentiellement un dictionnaire associant des noms defichier et des descriptions à des noms symboliques.

Problème Comment fournir une interface simple en utilisant unsystème complexe ?

Solution Le patron façade implémente seulement les méthodesutiles à mon dictionnaire en utilisant l’API de Postgresql.Il s’agit donc d’implémenter une couche d’abstraction.

Dans le cas général, façade fourni une abstractionunique (simplifiée) sur plusieurs sous-système,sans empêcher de les utiliser directement (makesimple tasks simple, complex tasks possible).

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 49 / 99

Page 62: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Façade (Facade)

Exemple Pour traiter les données d’un programme de gestion debibliothèque multimédia, je désire utiliser l’API dePostgresql, un gestionnaire de base de données trèsélaboré. Mon utilisation de la base de données estessentiellement un dictionnaire associant des noms defichier et des descriptions à des noms symboliques.

Problème Comment fournir une interface simple en utilisant unsystème complexe ?

Solution Le patron façade implémente seulement les méthodesutiles à mon dictionnaire en utilisant l’API de Postgresql.Il s’agit donc d’implémenter une couche d’abstraction.

Dans le cas général, façade fourni une abstractionunique (simplifiée) sur plusieurs sous-système,sans empêcher de les utiliser directement (makesimple tasks simple, complex tasks possible).

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 49 / 99

Page 63: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Façade (Facade) — UML, cas général

http://thisblog.runsfreesoftware.com/?q=Facade+Design+Pattern+UML+Class+Diagram

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 50 / 99

Page 64: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Poids-mouche (Flyweight) — description

Exemple Un compilateur traduit un code source en code machine. Unedes premières phases consiste à savoir à quoi les identifiantsutilisés dans le source font référence. Ce travail de résolutionpeut-être coûteux en temps et en espace (pour stocker ladescription de l’objet auquel on fait référence). Dans unmême espace de noms, on voudrait ne pas avoir à refairecette résolution plusieurs fois et partager les descriptions.

Problème Comment partager les calculs et le résultat de ces calculs defaçon transparente ?

Solution On coupe l’état des occurrences d’identifiants en état interne(intrinsic state) et externe (extrinsic state). Les identifiantssont créés par une fabrique. Cette dernière stocke une tableassociant un descripteur à un identifiant et a son étatinterne. Si l’identifiant n’est pas dans la table, le calculconcret est effectué, sinon on renvoie l’élément déjà calculé.L’état externe est passé à toutes utilisations.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 51 / 99

Page 65: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Poids-mouche (Flyweight) — description

Exemple Un compilateur traduit un code source en code machine. Unedes premières phases consiste à savoir à quoi les identifiantsutilisés dans le source font référence. Ce travail de résolutionpeut-être coûteux en temps et en espace (pour stocker ladescription de l’objet auquel on fait référence). Dans unmême espace de noms, on voudrait ne pas avoir à refairecette résolution plusieurs fois et partager les descriptions.

Problème Comment partager les calculs et le résultat de ces calculs defaçon transparente ?

Solution On coupe l’état des occurrences d’identifiants en état interne(intrinsic state) et externe (extrinsic state). Les identifiantssont créés par une fabrique. Cette dernière stocke une tableassociant un descripteur à un identifiant et a son étatinterne. Si l’identifiant n’est pas dans la table, le calculconcret est effectué, sinon on renvoie l’élément déjà calculé.L’état externe est passé à toutes utilisations.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 51 / 99

Page 66: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Poids-mouche (Flyweight) — UML

http://www.lepus.org.uk/ref/companion/Flyweight.xml

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 52 / 99

Page 67: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Poids-mouche (Flyweight) — en OCaml

Dans les langages fonctionnels, on peut implémenter une partie deflyweight de façon générale pour toute fonction avec lamemoization.

let memoize f =let table = Hashtbl . create 21 in

fun x −>try Hashtbl . f ind xwith Not_found −>

let y = f x inHashtbl . add x y ;y

memoize f calcule une fonction qui exécute f au plus une foispour une certaine valeur d’entrée.

Il est possible de raffiner cette implémentation pour pouvoir« oublier » certains calculs (c.f. weak hashtables).

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 53 / 99

Page 68: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Proxy (Proxy)

Exemple Un système de navigation par GPS charge des imagessatellites de la planète par le réseau, c’est une opérationtrès coûteuse. On veut pourtant voir l’ensemble detoutes ces images comme une unique image enprofitant du fait que le téléchargement d’une sectionn’est nécessaire qu’au moment où cette section esteffectivement affichée.

Problème Comment implémenter l’interface d’une image sansavoir toutes les données de cette image chargées enmémoire.

Solution Une classe WorldImageProxy implémente l’interfaced’une image en chargeant ses attributs de manièreparesseuse lors d’une réception de message nécessitantdes données concrètes.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 54 / 99

Page 69: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Proxy (Proxy)

Exemple Un système de navigation par GPS charge des imagessatellites de la planète par le réseau, c’est une opérationtrès coûteuse. On veut pourtant voir l’ensemble detoutes ces images comme une unique image enprofitant du fait que le téléchargement d’une sectionn’est nécessaire qu’au moment où cette section esteffectivement affichée.

Problème Comment implémenter l’interface d’une image sansavoir toutes les données de cette image chargées enmémoire.

Solution Une classe WorldImageProxy implémente l’interfaced’une image en chargeant ses attributs de manièreparesseuse lors d’une réception de message nécessitantdes données concrètes.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 54 / 99

Page 70: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Proxy (Proxy) — UML

Client

Proxy

DoAction()

RealSubject

DoAction()

<<interface>>

DoAction()

Subject

delegate

http://en.wikipedia.org/wiki/File:Proxy_pattern_diagram.svg

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 55 / 99

Page 71: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Proxy (Proxy) — applicabilité

On peut imaginer beaucoup des types de proxy différents :

proxy virtuel proxy paresseux, comme dans l’exemple du GPS

remote proxy représentants “locales” d’objet accessible à distance(p. ex. RPC, RMI, Web Services, SOAP, etc.)

proxy de protection si un proxy est la seule moyenne pour accéderle sujet réel, le proxy peut être utilisé pour donne degarantie de contrôle d’accès

smart pointer (déjà vu) sont un cas particulier de proxy

memoization proxy . . .

. . . . . .

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 56 / 99

Page 72: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Sommaire

1 Patron de conception à objets

2 Création (Creational Patterns)

3 Structure (Structural Patterns)

4 Comportement (Behavioral Patterns)

5 Les anti-patrons de conception (Anti-patterns)

6 Synthèse

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 57 / 99

Page 73: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Chaîne de responsabilité (Chain of responsibility)

Exemple On veut intégrer un mécanisme de greffons (plugins) aun traitement de texte pour pouvoir rajouterdynamiquement la gestion de certains types decomposants. (Ou encore : on veut ajouter unmécanisme d’aide en ligne du composant plusspécifique au composant plus générique.)

Problème Comment écrire une fois pour toute la fonction quichoisit le bon greffon à utiliser par observation du typedu composant à traiter ?

Solution On se donne un identifiant unique pour les types decomposants à traiter. Cet identifiant va servir demessage de première classe. On définit une interfacepour les greffons contenant une méthoded’interprétation de ces messages. La liste des greffonsest stockée par l’application. Lorsqu’un greffon ne saitpas traiter un message, il le transfère au suivant.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 58 / 99

Page 74: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Chaîne de responsabilité (Chain of responsibility)

Exemple On veut intégrer un mécanisme de greffons (plugins) aun traitement de texte pour pouvoir rajouterdynamiquement la gestion de certains types decomposants. (Ou encore : on veut ajouter unmécanisme d’aide en ligne du composant plusspécifique au composant plus générique.)

Problème Comment écrire une fois pour toute la fonction quichoisit le bon greffon à utiliser par observation du typedu composant à traiter ?

Solution On se donne un identifiant unique pour les types decomposants à traiter. Cet identifiant va servir demessage de première classe. On définit une interfacepour les greffons contenant une méthoded’interprétation de ces messages. La liste des greffonsest stockée par l’application. Lorsqu’un greffon ne saitpas traiter un message, il le transfère au suivant.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 58 / 99

Page 75: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Chaîne de responsabilité (Chain of responsibility) —UML

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 59 / 99

Page 76: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Chaîne de responsabilité (Chain of responsibility) —discussion

une chaîne de responsabilité diminue le couplingexpéditeur/destinataire et donne à plusieursintermédiaires—plus particulièrement à une chaîne de—lapossibilité de prendre en compte le message

la flexibilité en terme des responsabilités des objets augmenteet peut changer au runtime

le patron ne donne pas la garantie qu’un destinataire capable degérer un message existe

ñ il faut donc prévoir un destinataire catch all

les requêtes peuvent être plus compliques que dans l’exemplemontré

ñ p. ex. contenir des paramètres ou être des objets complexes,comme dans le patron. . .

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 60 / 99

Page 77: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Commande (Command)

Exemple Un logiciel de traitement d’image propose un ensemblede filtres à l’utilisateur. On veut donner la possibilité àl’utilisateur de construire ses propres filtres commecombinaison de filtres existants. On veut aussi luidonner la possibilité d’associer son filtre à un boutonde son application.

Problème Comment utiliser des opérations comme des données ?

Solution Il suffit d’implémenter un objet contenant une méthodeexecute. . . On peut alors associer ces fonctions àd’autres objets.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 61 / 99

Page 78: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Commande (Command)

Exemple Un logiciel de traitement d’image propose un ensemblede filtres à l’utilisateur. On veut donner la possibilité àl’utilisateur de construire ses propres filtres commecombinaison de filtres existants. On veut aussi luidonner la possibilité d’associer son filtre à un boutonde son application.

Problème Comment utiliser des opérations comme des données ?

Solution Il suffit d’implémenter un objet contenant une méthodeexecute. . . On peut alors associer ces fonctions àd’autres objets.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 61 / 99

Page 79: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Commande (Command) — UML

basé sur http://thisblog.runsfreesoftware.com/?q=node/75

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 62 / 99

Page 80: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Commande (Command) — discussion

utile pour paramétrer des objets avec des actions qu’il doiventexécuter, typique p. ex. dans les toolkit graphiques

les objets qui encodent les actions peuvent avoir un cycle de viediffèrent du cycle de vie de client, receiver, etc.

l’état gardé par les objets command peut être utiliser poursupporter undo/redo (il faudra pour cela ajouter une méthodeunexecute)

ñ ou encore les objets command peuvent être utiliser pourimplémenter des mécanismes de journaling

ñ potentiellement avec l’aide des méthodes et attribues statiquessur leurs classes d’origine

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 63 / 99

Page 81: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Interpréteur (Interpreter) — description

Exemple Composer les filtres n’est pas suffisant, un utilisateuravancé doit pouvoir programmer ses propres filtres(visuellement ou textuellement).

Problème Comment représenter un langage (syntaxe etsémantique à la fois) à l’aide d’objets ?

Solution Une classe abstraite Expression dont dérive les diversesconstructions du langage.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 64 / 99

Page 82: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Interpréteur (Interpreter) — description

Exemple Composer les filtres n’est pas suffisant, un utilisateuravancé doit pouvoir programmer ses propres filtres(visuellement ou textuellement).

Problème Comment représenter un langage (syntaxe etsémantique à la fois) à l’aide d’objets ?

Solution Une classe abstraite Expression dont dérive les diversesconstructions du langage.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 64 / 99

Page 83: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Interpréteur (Interpreter) — UML

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 65 / 99

Page 84: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Interpréteur (Interpreter) — discussion

il s’agit d’une généralisation du patron Command, pour cas pluscomplexes

ce patron partage beaucoup des caractéristiques (et critiques,comme la sûreté de typage) avec le patron Composite

on utilise le contexte pour stocker les données pas locales,nécessaire pour interpréter le langage

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 66 / 99

Page 85: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Itérateur (Iterator)

Exemple Revenons à notre bibliothèque de dictionnaires. Je veuxproposer un service permettant à un client d’inspecterl’ensemble des couples 〈clé, valeur〉 de mondictionnaire sans divulguer la façon dont celui-ci estimplémenté.

Problème Comment fournir un objet préservant l’encapsulationd’une structure de donnée tout en permettant de laparcourir ?

Solution Un itérateur fournit les méthodes (ou variantes de) :CurrentItem renvoyant l’élément courant.Next renvoyant un itérateur vers l’élément suivant ;IsDone indiquant si il existe un élément qui le suitdans la structure de donnée ;

Une structure de donnée implémente une méthodeiterator renvoyant un nouveau itérateur sur seséléments.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 67 / 99

Page 86: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Itérateur (Iterator)

Exemple Revenons à notre bibliothèque de dictionnaires. Je veuxproposer un service permettant à un client d’inspecterl’ensemble des couples 〈clé, valeur〉 de mondictionnaire sans divulguer la façon dont celui-ci estimplémenté.

Problème Comment fournir un objet préservant l’encapsulationd’une structure de donnée tout en permettant de laparcourir ?

Solution Un itérateur fournit les méthodes (ou variantes de) :CurrentItem renvoyant l’élément courant.Next renvoyant un itérateur vers l’élément suivant ;IsDone indiquant si il existe un élément qui le suitdans la structure de donnée ;

Une structure de donnée implémente une méthodeiterator renvoyant un nouveau itérateur sur seséléments.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 67 / 99

Page 87: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Itérateur (Iterator) — UML

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 68 / 99

Page 88: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Itérateur (Iterator) — discussion

très populaire dans le bibliothèque standard des langages desprogrammation de haut niveau

une abondance des libertés dans la définition d’un itérateur etde sa sémantique :

ñ itérateurs différents peuvent implémenter politique de visitedifférents (p. ex. depth-first vs breadth-first)

ñ est l’itérateur robuste (par rapport aux changements ducollection visitée) ?

ñ l’interface change significativement cas par cas (p. ex. First dansnotre exemple permet de recommencer l’itération)

ñ qui est en contrôle de l’itération ?

le client (comme dans notre exemple) stratégie pulll’itérateur stratégie push, avec colbacks

ñ . . .

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 69 / 99

Page 89: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Médiateur (Mediator) — description

Exemple Une bibliothèque servant à construire des interfacesgraphiques proposent en général des centaines dewidgets différents. Ces widgets communiquent entreeux de façon complexe : asynchrone/synchrone, parbroadcast, par groupes . . .

Problème Comment découpler l’implémentation d’un widget de lafaçon dont il communique avec les autres ?

Solution Ajouter un nouveau object médiateur et définir unnouveau protocole de communication avec lui. Chaquewidget communique seulement avec le médiateur. Lemédiateur s’occupe du routing des messages entrewidgets. Comme conséquence, les widgets parlentseulement avec le médiateur et les interdépendancesentre eux diminuent.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 70 / 99

Page 90: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Médiateur (Mediator) — description

Exemple Une bibliothèque servant à construire des interfacesgraphiques proposent en général des centaines dewidgets différents. Ces widgets communiquent entreeux de façon complexe : asynchrone/synchrone, parbroadcast, par groupes . . .

Problème Comment découpler l’implémentation d’un widget de lafaçon dont il communique avec les autres ?

Solution Ajouter un nouveau object médiateur et définir unnouveau protocole de communication avec lui. Chaquewidget communique seulement avec le médiateur. Lemédiateur s’occupe du routing des messages entrewidgets. Comme conséquence, les widgets parlentseulement avec le médiateur et les interdépendancesentre eux diminuent.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 70 / 99

Page 91: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Médiateur (Mediator) — UML

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 71 / 99

Page 92: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Médiateur (Mediator) — critique

Exemples typiques : MVC généralisées dans des widgetsgraphiques avec logiques de mise à jour très complexes

Ce patron fourni une abstraction protocol as an object

La souplesse des messages implémentés par des données estclaire : on peut reconfigurer, tracer, contrôler, les interactionsentre les objets.

Cependant, remplacer le mécanisme des méthodes par un telsystème n’est pas forcément une bonne idée car on perd alorsles garanties fournies par le typage (statique) des messagesenvoyés entre objets (sans médiation).

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 72 / 99

Page 93: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Memento (Memento)

Exemple Dans un contexte d’accès concurrent à une ressource, ilest parfois utile d’être optimiste : on lance la requêted’accès de façon asynchrone, on continue la partie ducalcul qui ne dépend pas de l’accès et on termine lecalcul une fois que le résultat de la requête est arrivé.Mais que faire lorsque la requête a échoué ? On doit sereplacer dans l’état initial et faire comme si on n’avaitpas continuer ses calculs. . .

Problème Comment restaurer l’état d’un objet ?

Solution Une classe Memento sert à représenter l’état d’un objetUne classe CareTaker sert à stocker ses états. Elle estaggrégée par l’objet qu’on veut être capable derestaurer. Avant une section critique, l’objet se stockesous la forme d’un Memento dans son attribut de typeCareTaker et se restore si la requête a échoué.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 73 / 99

Page 94: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Memento (Memento)

Exemple Dans un contexte d’accès concurrent à une ressource, ilest parfois utile d’être optimiste : on lance la requêted’accès de façon asynchrone, on continue la partie ducalcul qui ne dépend pas de l’accès et on termine lecalcul une fois que le résultat de la requête est arrivé.Mais que faire lorsque la requête a échoué ? On doit sereplacer dans l’état initial et faire comme si on n’avaitpas continuer ses calculs. . .

Problème Comment restaurer l’état d’un objet ?

Solution Une classe Memento sert à représenter l’état d’un objetUne classe CareTaker sert à stocker ses états. Elle estaggrégée par l’objet qu’on veut être capable derestaurer. Avant une section critique, l’objet se stockesous la forme d’un Memento dans son attribut de typeCareTaker et se restore si la requête a échoué.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 73 / 99

Page 95: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Memento (Memento) — UML

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 74 / 99

Page 96: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Memento (Memento) — discussion

Quand on a besoin d’un memento ?

Quand l’interface publique d’un objet n’est pas suffisante à extrairel’état qui nécessite sauvegarde.

Un objet de type memento doit donc exposer deux interfaces destypes différents :

interface restreinte pour le CareTaker, qui ne doit pas pouvoiraccéder à l’état de Originator

interface ouverte pour Originator qui permet l’accès complet aumemento pour restaurer l’état original

Pour obtenir cela, plusieurs trade-off sont à évaluer :

friends en C++

visibilité restreinte à niveau package

casting (p. ex. vers Object en Java) plus downcasting (qui estpas sûr. . . )

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 75 / 99

Page 97: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Memento (Memento) — discussion

Quand on a besoin d’un memento ?

Quand l’interface publique d’un objet n’est pas suffisante à extrairel’état qui nécessite sauvegarde.

Un objet de type memento doit donc exposer deux interfaces destypes différents :

interface restreinte pour le CareTaker, qui ne doit pas pouvoiraccéder à l’état de Originator

interface ouverte pour Originator qui permet l’accès complet aumemento pour restaurer l’état original

Pour obtenir cela, plusieurs trade-off sont à évaluer :

friends en C++

visibilité restreinte à niveau package

casting (p. ex. vers Object en Java) plus downcasting (qui estpas sûr. . . )

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 75 / 99

Page 98: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Memento (Memento) — discussion

Quand on a besoin d’un memento ?

Quand l’interface publique d’un objet n’est pas suffisante à extrairel’état qui nécessite sauvegarde.

Un objet de type memento doit donc exposer deux interfaces destypes différents :

interface restreinte pour le CareTaker, qui ne doit pas pouvoiraccéder à l’état de Originator

interface ouverte pour Originator qui permet l’accès complet aumemento pour restaurer l’état original

Pour obtenir cela, plusieurs trade-off sont à évaluer :

friends en C++

visibilité restreinte à niveau package

casting (p. ex. vers Object en Java) plus downcasting (qui estpas sûr. . . )

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 75 / 99

Page 99: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Observateur (Observer)

Exemple Imaginons l’application d’une séquence de filtres dans unlogiciel de retouche d’images. Pour tenir l’utilisateur aucourant de la progression du calcul, plusieurs objetss’affichent dans son interface : une barre de progression, unpourcentage dans la barre de titre, une icône sur sonbureau. . . Le nombre de ces indicateurs n’est a priori paslimité. Comment s’assurer qu’ils seront tous mis au courantde l’avancement du processus ?

Problème Comment modéliser l’observation de l’état d’un objet par unensemble dynamiquement défini d’autres objets ?

Solution L’objet observé offre une méthode registerObserverpermettant à un observateur de s’enregistrer pour êtreinformé. Pour cela, celui-ci doit proposer une méthodenotifyObservers. A chaque fois qu’il est mis à jour, l’objetobservé itère sur l’ensemble de ses observateurs et lesnotifie de sa modification.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 76 / 99

Page 100: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Observateur (Observer)

Exemple Imaginons l’application d’une séquence de filtres dans unlogiciel de retouche d’images. Pour tenir l’utilisateur aucourant de la progression du calcul, plusieurs objetss’affichent dans son interface : une barre de progression, unpourcentage dans la barre de titre, une icône sur sonbureau. . . Le nombre de ces indicateurs n’est a priori paslimité. Comment s’assurer qu’ils seront tous mis au courantde l’avancement du processus ?

Problème Comment modéliser l’observation de l’état d’un objet par unensemble dynamiquement défini d’autres objets ?

Solution L’objet observé offre une méthode registerObserverpermettant à un observateur de s’enregistrer pour êtreinformé. Pour cela, celui-ci doit proposer une méthodenotifyObservers. A chaque fois qu’il est mis à jour, l’objetobservé itère sur l’ensemble de ses observateurs et lesnotifie de sa modification.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 76 / 99

Page 101: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Observateur (Observer) — UML

http://en.wikipedia.org/wiki/File:Observer.svg

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 77 / 99

Page 102: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Observateur (Observer) — discussion

le diagramme UML ne montre pas comment les observateursaccèdent au subject. Typiquement ils gardent une référenceexplicite au subject

ce patron decouple le subject de la nécessite de connaître lesclasses spécifiques des observateurs : la seule abstractionnécessaire est le type des observateurs

le seule paradigme de communication supporté (nativement)par ce patron est la communication en broadcast ; lescommunications 1-1 ne sont pas supportées

faites attention à (ne pas) changer le subject dans l’exécutionde notify : ça peut générer des autres notifications. . .

le protocole native de ce patron ne dit pas quoi a changé, maisseulement que quelque chose à change, donc les observateursne peuvent pas collecter seulement ce partie (des protocolesplus complexes sont possible)

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 78 / 99

Page 103: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

État (State)

Exemple Revenons maintenant sur le problème des figuresgéométriques atomiques et composites. J’ai décidéd’implémenter le comportement suivant : lorsque lemessage add est envoyé à une figure atomique, elledevient tout simplement composite !

Problème Comment donner l’illusion que le type d’un objet achangé en fonction de son état ?

Solution Une forme stocke un attribut (son état) qui peut être uneforme atomique ou une forme composite. Les formesatomiques et composites ne dérivent plus de la classeShape mais d’une nouvelle classe abstraite RawShape.Le comportement dépend de l’état : lorsque la méthodeadd est appelée et que l’attribut est une formeatomique, on le remplace par une nouvelle formecomposite la contenant ainsi que la nouvelle forme àrajouter.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 79 / 99

Page 104: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

État (State)

Exemple Revenons maintenant sur le problème des figuresgéométriques atomiques et composites. J’ai décidéd’implémenter le comportement suivant : lorsque lemessage add est envoyé à une figure atomique, elledevient tout simplement composite !

Problème Comment donner l’illusion que le type d’un objet achangé en fonction de son état ?

Solution Une forme stocke un attribut (son état) qui peut être uneforme atomique ou une forme composite. Les formesatomiques et composites ne dérivent plus de la classeShape mais d’une nouvelle classe abstraite RawShape.Le comportement dépend de l’état : lorsque la méthodeadd est appelée et que l’attribut est une formeatomique, on le remplace par une nouvelle formecomposite la contenant ainsi que la nouvelle forme àrajouter.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 79 / 99

Page 105: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

État (State) — UML

Context

+request()

state.handle()

State

+handle()

ConcreteStateA

+handle()

ConcreteStateB

+handle()

http://en.wikipedia.org/wiki/File:State_Design_Pattern_UML_Class_Diagram.svg

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 80 / 99

Page 106: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

État (State) — discussion

tous les comportements relatives à un état sont localisés dansun seule objet, correspondant à l’état

avec ce parton les changements d’état deviennent explicitesdans le code : l’attribut state.handle doit changer

les objets de type état peuvent être partager entre contextesdifférentes

ñ éventuellement en s’appuyant sur la distinction entre état interneet externe (intrinsic/extrinsic state) (voir le patron flyweight)

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 81 / 99

Page 107: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Stratégie (Strategy)

Exemple Une intelligence artificielle pour un jeu d’échec s’appuiesur une heuristique, c’est-à-dire une évaluationapproximative de la valeur d’une situation pour lejoueur. Il existe de nombreuses heuristiques possibles.Est-ce à dire qu’il faille créer une sous-classe parheuristique ?

Problème Comment paramétrer une classe par un comportement ?

Solution Un comportement est implémentée par une classe. Lecomportement est donné en argument au constructeur(ou aux autres méthodes quand nécessaire) de la classeà paramétrer. Toutes utilisations de l’heuristique passeà travers la classe comportement.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 82 / 99

Page 108: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Stratégie (Strategy)

Exemple Une intelligence artificielle pour un jeu d’échec s’appuiesur une heuristique, c’est-à-dire une évaluationapproximative de la valeur d’une situation pour lejoueur. Il existe de nombreuses heuristiques possibles.Est-ce à dire qu’il faille créer une sous-classe parheuristique ?

Problème Comment paramétrer une classe par un comportement ?

Solution Un comportement est implémentée par une classe. Lecomportement est donné en argument au constructeur(ou aux autres méthodes quand nécessaire) de la classeà paramétrer. Toutes utilisations de l’heuristique passeà travers la classe comportement.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 82 / 99

Page 109: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Stratégie (Strategy) — UML

http://thisblog.runsfreesoftware.com/?q=node/64

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 83 / 99

Page 110: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Stratégie (Strategy) — discussion

l’interface entre Context et Strategy peut être arbitrairementcomplexe et peut en général échanger information dans lesdeux directions

ñ l’interface doit permettre d’échanger tout information nécessaireà exécuter l’algorithme implémenté par Strategy

des classes des algorithmes similaires peuvent êtrereprésentées avec une hiérarchie des stratégies

ce patron offre une alternative à plusieurs if. . . then. . . else pourparamétrer un comportement

ñ en générale, trop de if. . . then. . . else peut indiquer l’absenced’une hiérarchie des classes appropriée

remarquez encore une fois qu’en présence de fonction depremière classe, ce patron est trivialement implémentable.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 84 / 99

Page 111: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Patron de méthode (Template Method)

Exemple Je souhaite implémenter un algorithme (p. ex. de tri)paramétré par un ensemble d’opération externes, dontexistent plusieurs implémentation possible.Dans le cas générale je souhaite fournir unefonctionnalité complexe qui contient plusieurs trous.

Problème Comment paramétrer une méthode par plusieursfonctionnalités externes ?

Solution J’implémente ma fonctionnalité dans une classe quiappelle des méthodes abstraites. Plusieursconcretisations de la même classe vont fournirinstances de la fonctionnalité abstraite ou les trous sontremplis par des méthodes concrètes.

Encore une fois, il s’agit de programmation d’ordre supérieur, onutilise un objet pour représenter la fonction pris en paramètre.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 85 / 99

Page 112: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Patron de méthode (Template Method)

Exemple Je souhaite implémenter un algorithme (p. ex. de tri)paramétré par un ensemble d’opération externes, dontexistent plusieurs implémentation possible.Dans le cas générale je souhaite fournir unefonctionnalité complexe qui contient plusieurs trous.

Problème Comment paramétrer une méthode par plusieursfonctionnalités externes ?

Solution J’implémente ma fonctionnalité dans une classe quiappelle des méthodes abstraites. Plusieursconcretisations de la même classe vont fournirinstances de la fonctionnalité abstraite ou les trous sontremplis par des méthodes concrètes.

Encore une fois, il s’agit de programmation d’ordre supérieur, onutilise un objet pour représenter la fonction pris en paramètre.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 85 / 99

Page 113: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Patron de méthode (Template Method) — UML

basé sur http://thisblog.runsfreesoftware.com/?q=node/77

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 86 / 99

Page 114: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Patron de méthode (Template Method) — discussion

comme dans le cas du patron stratégie, on peut organiser desfamilles d’implementations des trous avec une hiérarchie declasses

ce patron supporte aussi des mécanismes de hooks, i.e. depoints spécifiques dans l’algorithme, où l’utilisateur peuxajouter des fonctionnalités

ñ dans ce cas on n’utilise pas des méthodes abstraites, mais onutilise de méthodes concrètes dont les implementations pardefault ne font rien. Les classes concrètes font override desimplementations par defaults

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 87 / 99

Page 115: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Visiteur (Visitor)

Exemple Je veux traduire en une multitude de format undocument composé par des instances de ma hiérarchiede formes. Pour des raisons de modularité, il est horsde question d’écrire ce code dans chacune des classes !

Problème Comment étendre fonctionnellement une hiérarchieexistante ?

Solution Un visiteur implémente une méthode par cas de lahiérarchie. Chaque sous-classe de la hiérarchieimplémente une méthode visit qui appelle la méthodedu visiteur correspond à son cas.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 88 / 99

Page 116: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Visiteur (Visitor)

Exemple Je veux traduire en une multitude de format undocument composé par des instances de ma hiérarchiede formes. Pour des raisons de modularité, il est horsde question d’écrire ce code dans chacune des classes !

Problème Comment étendre fonctionnellement une hiérarchieexistante ?

Solution Un visiteur implémente une méthode par cas de lahiérarchie. Chaque sous-classe de la hiérarchieimplémente une méthode visit qui appelle la méthodedu visiteur correspond à son cas.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 88 / 99

Page 117: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Visiteur (Visitor) — UML

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 89 / 99

Page 118: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Visiteur (Visitor) — discussion

prérequis : la hiérarchie de classe originelle est plus stable quel’ensemble d’opérations à effectuer sur elle

ñ Ajouter des nouvelles opérations est simple et possible sanstoucher la hiérarchie de classes originelle

ñ Changer la hiérarchie de classe originelle devient plus difficile,car le type de visiteur doit changer avec conséquences sur tousles visiteurs existants ! (heureusement, le typage statique nousaide)

chaque visiteur concret regroupe ensemble opérations liéesentres eux et les sépare des opérations indépendantes

différence importante avec le patron iterator : un iterateur nepeut pas iterer sur des objets de type différents (il doivent tousavoir la même interface) ; un visiteur n’as pas la mêmerestriction (pourquoi ?)

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 90 / 99

Page 119: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Sommaire

1 Patron de conception à objets

2 Création (Creational Patterns)

3 Structure (Structural Patterns)

4 Comportement (Behavioral Patterns)

5 Les anti-patrons de conception (Anti-patterns)

6 Synthèse

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 91 / 99

Page 120: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Quelques anti-patrons

Il est aussi important de savoir ce qu’il ne faut pas faire !

Abstraction inverse

Action à distance

Ancre de bateau

Attente active

Interblocages et famine

Erreur de copier/coller

Plat de lasagnes

Réinventer la roue carrée

Coulée de lave

Surcharge des interfaces

L’objet divin

. . .

Très connus dans le folklore de langages de programmation àobjets. On en voit seulement quelques exemples. Pour un index àjour, voir http://en.wikipedia.org/wiki/Anti-pattern.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 92 / 99

Page 121: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

L’objet divin

Concevoir un logiciel à objets avec des objets qui font trop dechoses. C’est contraire au principe basique de separation ofconcerns.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 93 / 99

Page 122: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Coulée de lave

Garder du vieux code (non optimale, plein de bugs, etc.) car l’effacerest trop coûteuse. (Application de premature optimization is theroot of all evil au secteur financier de la génie logiciel.)

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 94 / 99

Page 123: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Abstraction inverse

Le client d’une interface a besoin d’une fonctionnalité implémentépar l’objet mais caché.

Résultat : le client re-implémente la même fonctionnalité à l’externe(en utilisant l’interface publique). Le code complet utilise deuximplémentation de la même fonctionnalité à la fois : une interne etune externe.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 95 / 99

Page 124: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Not Invented Here

Ne pas vouloir réutiliser une solution logiciel existante, seulementcar il n’a pas était développée par les utilisateurs finals.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 96 / 99

Page 125: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Cargo Cult Programming

Utiliser beaucoup des patrons, framework, outils, seulement car “ilfaut bien le faire” (est cool, on se sent plus cool à l’utiliser, etc.),sans comprendre les implications—parfois négatives—des cespatrons.

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 97 / 99

Page 126: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Sommaire

1 Patron de conception à objets

2 Création (Creational Patterns)

3 Structure (Structural Patterns)

4 Comportement (Behavioral Patterns)

5 Les anti-patrons de conception (Anti-patterns)

6 Synthèse

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 98 / 99

Page 127: Génie Logiciel Avancé Cours 5 Conception d'un système …zack/teaching/1011/gla/cours-05.pdf ·  · 2016-01-03Sommaire 1 Patron de conception à objets 2 Création (Creational

Synthèse

réutiliser (et adapter !) des procédé d’organisation qui ontfonctionné dans le passé est une bonne démarche pour obtenirune bonne conception à objets

un catalogue très connu des patrons de conceptions est celui duGoF, qui propose trois types des patrons :

ñ creational patternsñ structural patternsñ behavioral patterns

Stefano Zacchiroli (Paris 7) Conception d’un système d’objets 3 mars – 7 avril 2011 99 / 99