Stéphane GOBRON HES SO HE Arc ISIC 2015 Où en sommes nous? Plan de cours Ch.1 : OO Rappels Ch.2 : Etude de cas => le bridge DP Ch.3 : Conceptualisation, Singleton et Composite DPs Ch.4 : Decorator, State, Prototype, Proxy et Builder DPs Ch. 5 : Abstract factory, Observer, Commande, Memento et Iterator DPs Mots clés du cours
Un peu d histoire Définition Pourquoi les patterns? Analogie Découvrir un pattern? Classification «patron de conception» Définition de «pattern» Formalisme GoF 23 design patterns Pattern Singleton Pattern Composite Tête la première, E. Freeman & E. Freeman, Edition O REILY Un peu d histoire Quelques personnes fondatrices du domaine Christopher Alexander Père du Pattern Language movement in computer science late 70 s Ward Cunningham late 80 s a commencé a expérimenter avec l'idée d'appliquer des pattern à la programmation : formalisme primaire Rien à voir avec le Gang of four chinois (1966 76) Erich Gamma, Ph. D. thesis, early 90 s Gamma, Helm, Johnson, Vlissides «Gang of Four» GoF mid 90 s
Définition Patron en couture Un patron décrit un problème récurrent, souvent rencontré, et ensuite propose un principe de solution pour ce problème Seul un principe de solution est présenté de manière à pouvoir utiliser le patron des centaines de fois sans pour autant faire la même chose à chaque fois [C. Alexander] Un pattern Pattern «design» Patrons de conception Pourquoi les patterns Présenter une solution à un problème récurrent qui survient souvent dans le développement logiciel C. Alexander était avant tout un architecte! Les croisements d autoroute : 1 min pour les dessiner LA SOLUTION regarder sur le Web! problèmes complexes mais connus Les architectes ne réinventent rien Ils suivent et adaptent un pattern
Pourquoi les patterns? Permet d assurer des qualités essentielles du développement logiciel : Réutilisation Extensibilité Maintenance Montée en charge volume d utilisation Efficacité Pourquoi les patterns? Permet de capturer des structures et des dynamiques de qualité afin de favoriser leurs réutilisations AbstractService service Client Proxy Service 1 1 service service Bien concevoir, ici le pattern Proxy Se documenter! l expérience des experts Se référer
Analogie 1. Règles 2. Principes généraux aide à paramétrer une stratégie de base 3. Etudes de cas permet de connaître le résultat des stratégies des experts Conception logicielle 1. Connaître les règles Algorithme Langages Structures de données 2. Connaître les principes Décomposition OO 3. Etudier les patterns Comprendre Mémoriser Appliquer Jeu d échec Mouvements Poids des pièces Règle principale, coincer le roi => but du jeu Poids relatif des pièces Positionnement Comprendre Mémoriser Appliquer Découvrir un pattern? Créer ou découvrir? Observer un problème Etudier différentes solutions Identifier un Pattern Documenter le Pattern S exercer! l expérience personnelle On ne crée pas un pattern On le découvre en l étudiant Pratique durant ce cours Mais surtout après ce cours avec l expérience accumulée
Classification «objet» «Idiomes» Spécifiques à un langage, un système ou un outil Définissent les aspects statiques et dynamiques d une solution qui est récurrente «Patterns d architecture» Sous systèmes, relations entre ss, guidelines, «Patterns d optimisation» Documenter les erreurs et les mauvaises solutions «Patterns d analyse» «Patterns organisationnels» Trois types de «Patrons de conception» Patron de création «Creational» «Creational» Facilitent la création des objets Patron de structure «Structural» Patrons de comportement «Behavioural» «Structural» Facilitent la composition des objets et des classes «Behavioural» Facilite la distribution des responsabilités
Définition de «Patterns» Des catalogues individuels ne suffisent pas Un langages commun est nécessaires Pas de standard pour la description d un patterns Plusieurs formalismes existent Le formalisme le plus utilisé est celui du GoF dans sa version 2 Nom Classification Objet Motivation Applicabilité Structure Participants Collaborations Conséquences Implémentation Exemple de code Utilisation connues Patterns liés Formalisme GoF Pour définir un Design Pattern officiel, on doit pouvoir définir un formalisme sous forme de champs qui classifie d une façon unique les propriétés de ce DP Nom et classification Possibilité d avoir plusieurs noms Objectif Que fait le pattern Connu encore sous Autre nom connu option Motivation problème de conception traité explication de la solution Applicabilité / cas d utilisation Situations où le patron peut être utilisé Structure Représentation graphique UML
Formalisme GoF Propriétés suite Participants Classes/objets participants et leurs responsabilités Collaborations Interactions entre participants Définissent les responsabilités Conséquences Effets, contraintes, avantages obtenus Implémentation Suggestions, techniques Exemple de code Exemple de code pour l implémentation du patron 23 patterns GoF Trois catégories Creational Structural Behavioral Les patterns en gras seront détaillés 23 mars : intervenant 4 mai : super équipe {2,3 18 mai: super équipe {1,5 1 er juin : super équipe {4,6 Class Scope Object Purpose Creational Structural Behavioral Factory ch4. Method Singleton ch2 Builder ch3 Prototype ch3 Abstract Factory ch4. Adapter. Interpreter. Template Method. Adapter Bridge ch1 Composite ch2 Decorator ch3. Facade Proxy ch3. Chain of Responsibility Command ch5. Iterator. Mediator Memento ch5. Flyweight Observer (callback I) ch5 State ch3. Strategy (callback II). Visitor
Concept Solution potentielle Principe Exemple de code Déclinaison Structure générale du DP Quite a unique object Le pattern Singleton Concept Nous voulons assurer l unicité des instances pour une classe donnée Implémentation que nous voulons éviter Exemples Une connexion unique Un protocole unique Une fenêtre principale unique. Implémentation avec le pattern singleton
Le pattern Singleton Solution potentielle 1 ère solution Bien entendu, ici, radis est un objet déclaré en global En C++, il est possible de déclarer un objet global, celui ci pouvant être visible partout dans le programme! Le pattern Singleton Principe Constructeur non accessible Une méthode de remplacement pour la construction La méthode de construction assure le test d existence Un attribut permettant d assurer le test d existence Note importante : ce DP est tellement surutilisé et statistiquement mal déployé que certains souhaitent le voir disparaitre des DPs officiels
Le pattern Singleton Exemple de code Indices : Attention aux pièges #ifndef CSINGLETON_H #define CSINGLETON_H class CSingleton { private: static CSingleton* single; CSingleton() { /*private constructor*/ int myvalue; public: static CSingleton* getinstance(); void setvalue( int value ); void printvalue(); void deleteinstance(); ~CSingleton() {; ; #endif // CSINGLETON_H csingleton.h #include "../include/csingleton.h" #include <iostream> using namespace std; CSingleton* CSingleton::single = 0; CSingleton* CSingleton::getInstance() { if(!single ) { single = new CSingleton(); return( single ); else { return single; void CSingleton::deleteInstance() { if( single ) delete( single ); void CSingleton::setValue( int value ) { if( single ) myvalue = value; else cout << " single does not exist"; csingleton.cpp void CSingleton::printValue() { if( single ) cout << "Value: " << myvalue; #include "../include/csingleton.h" int main(void) { CSingleton *sc1, *sc2; sc1->setvalue( 123 ); /!\ non sc1->printvalue(); sc1 = CSingleton::getInstance(); sc1->setvalue( 234 ); sc1->printvalue(); En 5 min : que fait ce main? sc2 = CSingleton::getInstance(); sc2->setvalue( 345 ); sc2->printvalue(); sc1->printvalue(); sc1->deleteinstance(); sc2->deleteinstance(); return( 0 ); /!\ non main.cpp Le pattern Singleton Déclinaisons Le Pattern «Singleton» peut se décliner aussi à un nombre constant d instanciation E.g. 1. Limiter le nombre d instance à une certaine valeur Une classe connexion qui ne permet de créer que cinq instances au maximum pour des raisons de performance 2. Créer des instances différentes par alternance Un objet Personne pour lequel seules deux classes dérivées existent, Homme et Femme, avec la spécification supplémentaire que l on souhaite créer une série de couple une fois un homme et une fois une femme par alternance
Le pattern Singleton Déclinaisons On peut passer à la passer à la douane avec dans sa valise un maximum de 2 bouteilles d alcool Modifier le code C++ précédant pour obtenir un «Singleton» 2 fois instanciable! Indice! La consommation d alcool est mauvaise pour la santé c est une règle Le pattern Singleton Structure générale du DP Les astuces Constructeur privé Un pointeur static sur une instance unique à construire A toute requête de construction, si l instance n existe pas, la construire Pour toute autre requête de construction: renvoyer l adresse existante
3.3 «Composite» des collections bien gérées Concept exemple Définition Exemple Structure générale du DP Petit exercice Présentation du Labo 2 http://www.ivanaborovnjak.com/project/box in a box/ 4.1 «Composite» Concept exemple Qu est ce qu une boite? c est un objet qui contient quelque chose Il existe de nombreux types de boites http://www.curtis.lassam.net/ Récurrence du concept Mais une boîte peut alors elle même contenir une autre voir plusieurs autres boîtes
4.1 «Composite» Definition Patron de type Structure Organiser / compose les objets en structures arborescentes pour représenter des hiérarchies toutparties Les composites permettent aux clients de manipuler les objets composés et les objets individuels uniformément acomposite aleaf aleaf aleaf acomposite aleaf aleaf 4.1 «Composite» Exemple d application Des objets graphiques simples ou groupés Des collections d éléments Des composants multimédia Dessin dans un dessin de dessin Exemple : objets graphiques 1..n
4.1 «Composite» Structure générale du DP Prêtons attention à la différence entre Manipuler ces objets d un façon simple, «Un peu comme des poupées russes» «Component» : virtuel et «Composite» : concret 1..n Notez aussi que la «feuille» se défini au travers du fait qu elle ne peut pas avoir d enfants 4.1 «Composite» Petit exercice Trouver ce que ce code C++ fait! #include "myheader.h" int main() { Composite containers[4]; for (int i = 0; i < 4; i++) for (int j = 0; j < 3; j++) containers[i].add(new Leaf(i *3+j)); for (i = 1; i < 4; i++) containers[0].add(&(containers[i])); for (i = 0; i < 4; i++) { containers[i].traverse(); cout << endl; #include <vector> #include <iostream> using namespace std; class Component { public: virtual void traverse() = 0; ; 0 1 2 3 4 5 6 7 8 9 10 11 3 4 5 6 7 8 9 10 11 Solution class Leaf: public Component { int value; public: Leaf(int val) { value = val; void traverse() { cout << value << ' '; ; class Composite: public Component { vector < Component * > children; public: void add(component *ele) { children.push_back(ele); void traverse() { for (int i = 0; i < children.size(); i++) children[i]->traverse(); ;
Labo Labo 2 Mini projet comportant les patterns «Singleton» et «Composite» Thème «les fratals» Vous avez le choix du sujet précis mais devez justifier ce choix, i.e. les patterns doivent être consistants De plus, aucune équipe ne peut faire la même chose, vous devez donc avoir l autorisation du professeur avant d attaquer l implémentation En C++ sous CodeBlock Indices! Dans votre rapport vous devez montrer clairement l utilité des deux patterns Principe général http://mathworld.wolfr am.com/fractal.html Exemple graphique du fractal Mandelbrot Merci! Questions? Au prochain cour Chapitre 4 Du Decorator au Builder DPs Decorator DP State DP Prototype DP Proxy DP Builder DP Tête la première, E. Freeman & E. Freeman, Edition O REILY