IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Pattern Composite et templates


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut Pattern Composite et templates
    Je me suis replongé dans l'article de David Come sur les design patterns en C++, pour voir ce que je peux en tirer avec le C++11.

    L'auteur nous décrit plusieurs patterns, dont le Composite.
    De celui-ci en particulier, il dit qu'il ne se prête pas à la réalisation template.

    Hors, j'ai ce code dans mon projet actuel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <vector>
    #include <functional>
    #include <initializer_list>
     
    template <class A>
    class Composite: public A {
    	public:
    		explicit Composite(){}
    		explicit Composite(std::initializer_list<A*> elements):elements(elements){}
     
    		~Composite() {for(A* a: elements) delete a;}
     
    		Composite& add(A* a) { elements.push_back(a); return *this; }
     
    	private:
            	std::vector<A*> elements;
    	protected:
    		void iterate(std::function<void(const A*)> const& f) const {
    			for(const A* a : elements) f(a);
    		}
    		void iterate(std::function<void(A*)> const& f){
    			for(A* a : elements) f(a);
    		}
    };
    Ce qui permet d'avoir, par exemple, ce genre d'usage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    stuct Base{
    		virtual std::string content() const = 0;
    };
     
    class Leaf : public Base{
    	private:
    		std::string name;
    	public:
    		explicit Leaf(const std::string& name):name(name){}
    		std::string content() const {return name;}
    };
     
    class Node : public Composite<Base>{
    	public:
    		Node(std::initializer_list<Base*> elements):Composite<Base>(elements){}
     
    		std::string content() const {
    			std::ostringstream oss;
    			oss<<"[ ";
    			iterate( [&oss](const Base* b){oss<<(b->content())<<' ';} );
    			oss<<']';
    			return oss.str();
    		}
    };
    Qu'en pensez-vous? Est-ce vraiment utile?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par leternel Voir le message
    Qu'en pensez-vous?
    Que la classe Composite ressemble plus à un conteneur. Une surcouche à std::vector en quelque sorte.

    Citation Envoyé par leternel Voir le message
    Est-ce vraiment utile?
    Quelle est la responsabilité de composite qui la distingue d'un conteneur ? Ou en d'autre termes, j'ai le sentiment qu'une surcouche a été rajoutée mais avec une faible valeur ajoutée.

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Le pattern composite est essentiellement de grouper plusieurs elements, et de se comporter comme l'un d'eux.

    en gros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Composite<Bidule>: public Bidule{
        container<Bidule> contenu;
     
        //pour toute fonction f de bidule, 
        f = for (auto c : contenu) c.f
    };
    Dans les interfaces graphiques, par exemple, un panneau contenant des boutons est un ComposantGraphique, comme chacun des boutons.

    Dessiner le panneau appelle (entre autre) le dessin de chaque bouton.

    Il s'agit de mapper chaque fonction de l'interface sur l'ensemble des contenus.

    La classe que j'ai trouvé me semble n'être qu'un utilitaire, qui aurai d'ailleurs du être templaté aussi sur le type de conteneur.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    @3DArchi: Ça ajoute une notion d'arborescence: Le composite peut contenir des (pointeurs vers) des objets de différents types d'une hiérarchie, y compris son propre type.

    C'est très utilisé en Interface Utilisateur Graphique (javax.swing.JComponent, System.Windows.Forms.Control, etc.)

    Par contre, ça nécessite du downcasting dès que tu veux accéder à des propriétés particulières d'un objet d'une classe dérivée. Je dirais que cette approche fais très "Java", bien qu'elle n'y soit pas limitée.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    J'avais cru comprendre que ce fil s'interrogeait sur l'incidence éventuelle de la nouvelle norme C+11 sur les design patterns en général, mais j'ai dû mal saisir le sens du titre du fil...
    Il s'agit apparemment d'une question sur un certain design pattern, et indépendamment de la nouvelle norme, non ?

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    initialement, je projetais de mettre à jour ma manière de réaliser les différents patterns en profitant des fonctionnalités du C++11.
    Je suis retourné sur les articles de développez.com abordant le sujet, et je soulevai le problème présent.

    De toutes façons, les patterns sont des concepts, indépendants de la norme et même du langage.

    Cela dit, je vais renommer le sujet, le titre "Composite et template" étant plus adapté.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pattern visiteur et template
    Par coda_blank dans le forum C++
    Réponses: 7
    Dernier message: 24/10/2011, 20h26
  2. Héritage (pattern Composite)
    Par Ploupi dans le forum Langage
    Réponses: 4
    Dernier message: 21/09/2011, 10h36
  3. Pattern Composite en C++
    Par snakico dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2010, 20h41
  4. Persistence d'un pattern "composite" avec JDO
    Par Yomhgui dans le forum Persistance des données
    Réponses: 1
    Dernier message: 21/12/2008, 22h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo