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 :

[Pattern Command] Lien à mettre à jour


Sujet :

C++

  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut [Pattern Command] Lien à mettre à jour
    Bonjour à tous !

    J'utilise le DP Command pour éxécuter des actions à appliquer à une image. Par exemple CommandRotate, CommandTranslate, etc...
    En stockant une MacroCommand (à base de std::list<Command*> par exemple ), j'obtiens donc une liste d'instructions à appliquer à mon image.

    Problème : lorsqu'on utilise le pattern Command, on lie une commande à un objet par référence. Je voudrais pouvoir changer cette référence, notamment pour l'utilisation d'un film, et non plus d'une seule image.

    Changer l'interface Commande serait-il une bonne solution ? :koin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Command {
    virtual void Execute() = 0;
    virtual void Cancel() {}
    virtual void Update(vigra::UInt16Image &) {}
    };
    Qu'en pensez vous ? Choquant pour une interface Command ?


  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par poukill Voir le message
    Choquant pour une interface Command ?
    Oui il y a un ; en trop !!

    Plus sérieusement tu fais ce que tu veux avec tes commandes, y'a peu de chances que la police des design patterns t'attrape !

    Encore plus sérieusement peux-tu donner un exemple d'implémentation ? Notamment de Update() puisque j'imagine que c'est là que se résoud cette histoire de référence ?

    MAT.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    En fait, j'aimerais changer le récepteur de la commande (ici m_Image). Car s'il s'agit d'un film et non plus d'une image, alors j'aurai besoin de mettre à jour mon image à l'image courante du film...

    Voici une classe concrète en exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class CommandRotate : public Command {
    public :  
        virtual void Update(vigra::UInt16Image & image) { m_Image = image;} // Mise à jour de l'image
        virtual void Execute() { Rotate(m_Image); }
     
    private :
        vigra::UInt16Image & m_Image;
    };
    Je fais ça au feeling, ça m'a l'air pas mal.
    Après il existe peut être une astuce que je ne connais pas, ou que sais-je ...

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Ok, le Update prend l'image en argument, j'avais un peu peur d'un truc "subtil" dans les implémentations pour aller chercher les informations à mettre à jour.
    Donc ça combine un observateur et une commande, oui, pourquoi pas.

    En tous cas j'aurais tendance à dire que ça parait suffisamment simple pour se lancer là-dedans et voir plus tard si des problèmes surviennent.

    MAT.

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Oui c'est ça Observateur + Command en fait !
    Ok super il n'y a plus qu'à retrousser les manches alors...

    pour ton aide !

  6. #6
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Au fait, le pattern Command, c'est un nom sophistiqué pour désigner une fonction.

    Tu pouvais tout simplement utiliser également boost::function .
    Le problème de l'update se résoud avec boost::bind.

  7. #7
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Tu pouvais tout simplement utiliser également boost::function .
    Non, car je veux pouvoir cumuler des commandes. Et avoir une MacroCommand qui possède une liste de Command tout en étant une Command elle-même c'est très intéressant. Ça me fait un endroit pour tout stocker...
    Citation Envoyé par HanLee Voir le message
    Le problème de l'update se résoud avec boost::bind.
    Effectivement, là je suis complètement d'accord...

  8. #8
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par poukill Voir le message
    Non, car je veux pouvoir cumuler des commandes. Et avoir une MacroCommand qui possède une liste de Command tout en étant une Command elle-même c'est très intéressant. Ça me fait un endroit pour tout stocker...

    Effectivement, là je suis complètement d'accord...
    Ben MacroCommand = liste de boost::function.

    C'est la même chose.

  9. #9
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Oui j'avais fait ça avant, j'en étais pas particulièrement content... Mais bon ce sont deux solutions qui se valent...

    Merci pour tes suggestions en tout cas !

  10. #10
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Je n'arrive pas à résoudre le problème du Update():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Command {
    public:
    	Command() {}
    	virtual ~Command() {}
     
    	virtual void Execute() = 0 ;
    	virtual void Reset() {}
    	virtual void Update(vigra::UInt16Image & image) {} // prend un paramètre ici, je n'en voudrai pas !!! :-)
    };
    Avec ici un exemple de classe fille :
    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
     
    class CommandRotateImage : public Command
    {
    public:
    	explicit CommandRotateImage(vigra::UInt16Image & image): m_Image(image) {}
    	virtual ~CommandRotateImage(void) {}
     
    	virtual void Execute() {
    		m_Image = Rotate(m_Image);
    	}
    	virtual void Update(vigra::UInt16Image & image) {m_Image = image; }
     
    protected:
    	vigra::UInt16Image & m_Image;
    };
    Comment faire arriver à supprimer les paramètres de Update() avec boost::bind? Il faut bien que je remplisse m_Image, membre de la classe !

    Je vois pas, si un esprit clair passe par là, qu'il n'hésite pas !

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Si m_Image est une référence, outre que ça ne va pas compiler dans l'implémentation actuelle de Update, tu n'as pas réellement besoin de mettre à jour la variable.
    En fait tu n'as même pas besoin d'Update du tout si le code en reste là (i.e. si tu ne réalises aucun traitement dans l'implémentation d'Update).

    Sinon accessoirement il manque un explicit devant le constructeur de CommandRotateImage et il y a un ; en trop à droite de Reset dans Command.

    MAT.

  12. #12
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Si m_Image est une référence, outre que ça ne va pas compiler dans l'implémentation actuelle de Update, tu n'as pas réellement besoin de mettre à jour la variable.
    Ca compile. J'utilise ce code depuis quelques jours et il marche ! Mais bon comme j'ai Visual y'a surement un truc que je dois pas respecter mais quoi ? Si tu pouvais expliquer,

    Sinon, j'ai besoin de mettre à jour ma variable membre m_Image, car l'image ici est une image d'un film. Donc lorsque je lance le film, je voudrai appliquer mes Commandes à chaque image, sans recréer mes commandes bien sûr. C'est pourquoi j'ai décidé de créer un Update() !

    J'espère t'avoir éclairé de ma maigre lanterne sur mon problème !

  13. #13
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Hmm ok ça compile parce que tu as un opérateur d'affectation dans vigra::UInt16Image, au temps pour moi !

    Mais est-ce vraiment ce que tu veux faire ? C'est vraiment voulu que m_Image soit stockée en tant que référence ?

    MAT.

  14. #14
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    (je me réponds à moi-même )

    Bon oui en fait il faut que ça soit une référence pour pouvoir faire le Rotate, ok.

    Mais du coup je pense qu'il faut dégager le Update de là, il ne sert à rien vu qu'il ne met pas à jour d'état dans les commandes.
    Si l'image est mise à jour "dans le dos" des commandes ça fonctionnera aussi bien. A la limite si c'est la commande qui décide de refaire un Rotate consécutivement à chaque mise à jour, tu peux justement retirer le paramètre et laisser juste l'appel comme notification.

    MAT.

  15. #15
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Vraiment merci MAT ! J'y avais pas pensé...
    Merci beaucoup !

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

Discussions similaires

  1. [2.x] Mettre à jour SF2 sans ligne de commande
    Par Alex94 dans le forum Symfony
    Réponses: 6
    Dernier message: 15/11/2011, 14h09
  2. [XL-2003] mettre à jour des lien hypertext
    Par ninikosim dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 11/04/2011, 11h16
  3. [CS4] Mettre à jour les liens après avoir renommé un fichier
    Par Totila dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 06/02/2009, 15h09
  4. [MySQL] Mettre à jour BDD à partir d'un lien généré
    Par fabiofabio dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/01/2008, 06h46
  5. Mettre à jour les liens des graphiques d'Excel dans Powerpoint
    Par illight dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/06/2007, 15h17

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