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

C++ Discussion :

Tutoriel design pattern decorateur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut Tutoriel design pattern decorateur
    A la fin du tutoriel, il y a cette citation:

    En pratique, on chaîne souvent les constructions comme suit, bien que cela puisse réduire la lisibilité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BaseAliment *c= new  DecorateurGout( *(new Aliment(1.5,"Gauffre")),0.2,"Sucre") ;
    Mais je suis chagriné par le 2e new (new Aliment). Il a été alloué dynamiquement, mais ayant aucune référence sur le pointeur, comment peut-on le détruire?

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Par défaut
    Pour le détruire, trois solutions:
    • Gérer la mémoire dans les Décorateurs.
    • Utiliser un smart pointer.
    • Utiliser un ramasseur de miette.


    En réalité, je pense (sans aucune certitude), que la mémoire doit être gérée dans les Décorateurs. En effet, une même variable pointe sur un nouvel objet à chaque ajout de décorateur. Le dernier objet créé (un décorateur en principe) se doit de détruire l'objet le précédent pour assurer une certaine transparence dans la gestion de la mémoire.

    En conclusion le constructeur de la classe Decorateur devrait se définir ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Decorateur::Decorateur(BaseAliment& base,double prix,const std::string& name):
    BaseAliment(prix,name),m_base(base)
    {
        delete base;
    }
    Mais ça reste risqué et celui qui utilise l'objet à plutôt intérêt à bien connaître son fonctionnement.
    De mon côté, ce qui me rend septique sont les performances de ce patron ?

    Edit: Mon exemple au dessus n'est pas valide, j'avais mal compris le fonctionnement et j'ai trop rapidement vus qu'il y avait utilisation d'un constructeur de copie au lieu d'une relation explicite par pointeur.

  3. #3
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    J'ai oublié le lien : http://come-david.developpez.com/tut...=Decorateur#LV

    En occurence, c'est aucun des 2 premières solutions.

    La 1e, gérer ça par la classe elle-même, je ne vois pas comment (comment savoir si l'objet fourni en paramètre a été construit statiquement ou dynamiquement?). Puis dans l'exemple, il y a aucun delete d'ailleurs.

    La 2e solution non plus, vu qu'il s'agit d'un pointeur classique.

    Je ne connais pas le ramasse-miette, mais je ne pense pas non plus en occurence ...

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Je confirme, le code d'exemple fuit sa mémoire comme ça ne devrait pas être permis (j'ai envie de dire que c'est une adaptation trop rapide d'un code java ou c#).

    Après, je ne connais pas ce pattern, donc je ne sais pas qui est censé géré la durée de vie des objets.

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    L'objectif de ce tutoriel était clairement de faire découvrir les DPs avec application en C++, l'accent a donc plus été mis sur l'aspect conception que sur la justesse du code C++.

    Toutefois, l'auteur prendra vos remarques en compte afin de faire une mise à jour, sans problème.

    En n'oubliant pas que les DPs, particulièrement en C++ grâce à la généricité, doivent être réutilisables, que proposeriez-vous pour régler le soucis ?

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    À mon avis, il faut gérer la durée de vie des objets dans le décorateur (et donc, stocker un pointeur plutôt qu'une reférence, et deleter m_base dans le destructeur de Decorateur). Je ne vois pas trop comment on peut s'en sortir autrement sinon.

    Ensuite, soit :
    - spécifier que l'objet BaseAliment doit avoir été alloué avec ::new
    - fournir une méthode statique Create(...) dans chacune des classes, et des constructeurs protégés (mieux)

  7. #7
    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
    Si je comprend bien le pattern, il s'agit d'une composition. Donc, Decorateur devrait avoir un pointeur intelligent sur m_base; non?

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

Discussions similaires

  1. tutoriel design pattern (UML)
    Par Firas_tn dans le forum Design Patterns
    Réponses: 1
    Dernier message: 02/10/2007, 22h22
  2. Design Pattern : Tutoriels à télécharger
    Par Matthieu Brucher dans le forum Design Patterns
    Réponses: 0
    Dernier message: 06/07/2007, 11h43
  3. [Décorateur] [Java] Design Pattern Decorateur
    Par dralou dans le forum Design Patterns
    Réponses: 4
    Dernier message: 11/11/2006, 11h35
  4. Réponses: 8
    Dernier message: 30/09/2006, 05h18

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