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 :

Choix de design pour UndoManager


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut Choix de design pour UndoManager
    Bonjour,

    Je suis en train de réaliser une librairie d'UndoManager (du moins je commence :p), le principe est de gérer deux stacks, une pour les undos, l'autre pour les redos. Jusqu'à présent j'avais pensé à quelque chose du style :

    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
    25
    26
    27
    28
    29
    30
    31
     
     
    class UndoManager {
     
        std::stack<UndoRedo*> m_undo_stack;
        std::stack<UndoRedo*> m_redo_stack;
     
    };
     
    class UndoRedo {
     
        public:
     
            virtual void undo() =0;
            virtual void redo() =0;
     
    };
     
    template <class UndoFunctor, class RedoFunctor>
    class UndoItem : public UndoRedo {
     
        private:
            UndoFunctor m_undo;
            RedoFunctor m_redo;
     
        public:
     
            virtual void undo(); //appel m_undo()
            virtual void redo(); //appel m_redo()
     
    };
    Bref somme toute quelque chose de relativement simple. En farfouillant un peu sur le net, je suis tombé sur un article décrivant une implémentation d'undoManager de la manière suivante :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    template <class F>
    class UndoRedo {
     
        private:
            F f;
     
        public:
     
            void undo() { f.undo(); }
            void redo() { f.redo();}
     
    };
     
    template <class F>
    class UndoManager {
     
        std::stack<UndoRedo<F> > m_undo_stack;
        std::stack<UndoRedo<F> > m_redo_stack;
     
    };
     
    class UndoAction {
     
        public:
     
           virtual void undo() =0;
           virtual void redo() =0;
     
    };
     
    template <class UndoFunctor, class RedoFunctor>
    class Concrete UndoAction : public UndoAction {
     
    //identique à UndoItem du design précédent
     
    };
     
    //Instanciation de l'undomanager :
    UndoManager<UndoAction> manager;
    Je ne comprends pas l'intérêt de rajouter une indirection supplémentaire. Dans le premier design, on a une interface pour les undo, et une class d'implémentation paramétrée pas les deux types de functors utilisés.

    Dans le second cas, on paramètre une classe d'UndoAction par une interface UndoRedo, implémentée par la classe concrète du design précédent.

    Y'a-t-il un réel intérêt à faire cela ?

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ta version est plus cohérente avec ce qu'est un undo/redo, à savoir un pattern command. Je te conseille de rester sur ton idée

  3. #3
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Il vaut toujours mieux aller au plus simple. Si ton design te conviens pour l'utilisation que tu en auras, garde le. En réalité, les deux versions sont équivalentes. Dans un cas, il s'agit de polymorphisme d'inclusion (héritage de UndoRedo), dans l'autre cas, de généricité (paramétrage de UndoRedo par une classe disposant de l'interface adéquate).

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    La deuxième solution utilise également le polymorphisme, et je ne vois pas l'intérêt d'une class template UndoRedo, puisque le paramètre est ici une interface, que l'on pourrait donc utiliser de manière directe. Disons que je ne vois pas en quoi le premier design est moins générique que le second, dans tous les cas mon interface doit disposer de méthodes Undo et Redo.

    Merci pour vos réponses :p

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Dans le second cas, les pbjets que tu vas stocker n'héritent pas forcément de ta classe abstraite, ils peuvent simplement fournir une interface avec redo et undo.

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Ok, donc intéressant si on souhaite implémenter les undo actions avec d'autres moyens que des foncteurs.

    Merci beaucoup :p

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/03/2011, 15h11
  2. [Observateur] existe-t-il un package proposant ce design pour C# ?
    Par sopi dans le forum Design Patterns
    Réponses: 1
    Dernier message: 25/05/2005, 20h48
  3. [Choix de langage] Pour un convertisseur de fichiers
    Par FredBe dans le forum Langages de programmation
    Réponses: 28
    Dernier message: 13/12/2004, 17h22
  4. Choix du langage pour un logiciel de cryptage ?
    Par Paul-- dans le forum Langages de programmation
    Réponses: 15
    Dernier message: 22/09/2004, 18h27
  5. Choix de technologies pour mon application
    Par Franco dans le forum Java EE
    Réponses: 5
    Dernier message: 21/10/2003, 14h10

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