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 :

[conception] pattern state


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut [conception] pattern state
    Bonjour,

    voilà, je vois partout le pattern state implémenté ainsi:
    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
    class AbstractState {
    public:
       virtual void DoSomething() = 0;
    };
     
    class ConcreteState1 : public AbstractState {
    public:
       void DoSomething() { /* implémentation */ }
    };
     
    class ConcreteState2 : public AbstractState {
    public:
       void DoSomething() { /* implémentation */ }
    };
     
    class MyObject {
    private:
       AbstractState * m_state;
     
    public:
       void ChangeState( AbstractState * newState ) { 
    	   delete m_state; 
    	   m_state = newState; 
       }
     
       void DoSomething() { m_state->DoSomething(); }
    };
    Seulement, dans certains cas cette façon de faire ne me convient pas, à cause du fait que quand on change d'état (fonction ChangeState dans mon exemple), il faut allouer un nouvel état et désallouer l'ancien. C'est un cas que j'ai rencontré récemment qui m'a fait penser à cela: une classe qui change souvent d'état, et dont les états possèdent des données => beaucoup d'allocation/désallocations qui, de plus, sont coûteuses.

    Du coup, j'ai modifié le pattern comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // les classes AbstractState et ConcreteStateN ne changent pas
     
    class MyObject {
    private:
    	AbstractState * m_state;
    	ConcreteState1 m_state1;
    	ConcreteState2 m_state2;
     
    public:
    	void GoToState1() { m_state = &m_state1; }
    	void GoToState2() { m_state = &m_state2; }
     
    	void DoSomething() { m_state->DoSomething(); }
    };
    Seulement, je n'ai vu cette implémentation nulle part. Et pourtant je lis beaucoup de code ces derniers temps. Je me demande donc s'il n'y aurait pas un problème que je n'ai pas vu et qui fait ce ma méthode est très mauvaise.

    Voilà, donc c'est pour savoir: qu'en pensez-vous?

  2. #2
    screetch
    Invité(e)
    Par défaut
    Il n'y a aucun problème avec ca et c'est comme ca que chacun devrait faire a mon avis =)
    [EDIT] parler sans reflechir c'est mal... ca consomme plus de mémoire comme ca.
    Dernière modification par screetch ; 18/02/2009 à 17h59.

  3. #3
    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 ne connais pas cette façon de faire. Quand j'ai besoin d'une machine à état, j'en suis resté à la bonne vieille méthode avec une matrice d'états/transitions (sauf si le nombre d'états devient trop grand, auquel cas la matrice se transforme en fonction avec switch et if imbriqués).

    J'imagine que le bénéfice de coder comme ça, c'est que tu peux rajouter des états sans toucher au code de ta classe MyObject (je n'en vois pas d'autres, et je vois plutôt plein d'inconvénients). Là, en mettant des membres dans ta classe, tu perds ce bénéfice. Du coup, autant revenir à la matrice d'états/transitions

  4. #4
    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
    En cherchant un peu sur le net, j'ai trouvé quelques conseils sur le pattern state qui peuvent répondre en partie à ta question :
    1/ Un état ne devrait pas contenir de variables membres : seul le comportement change,
    2/ Les états devraient être des singletons (en cohérence avec précédent) : ce qui évite ces allocations/destructions répétitives.

    Dans ton exemple, le problème que je vois, c'est que dès que tu auras un certaine nombre d'état tu vas être tenté de refaire un switch pour positionner ton état courant...

  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
    Quand tu instancies MyObject, il faut que tu initialises tous les états. Après j'ai envie de dire, ça dépend combien tu as d'états et surtout est-ce que tu vas tous les "utiliser" plusieurs fois (plusieurs boucles en fait)?
    Il faut quand même t'assurer que c'est moins coûteux comme ça...

    Si c'est pour tourner "longtemps", alors oui dans ton implémentation tu vas consommer plus de mémoire, mais tu iras plus vite!

  6. #6
    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
    A part à rendre ça un peu plus générique, je pense que c'est pas mal

  7. #7
    screetch
    Invité(e)
    Par défaut
    au pire du pire, avec une tonne de méta prog et une lisibilité réduite, tu peux avoir un buffer contenant assez de place pour le plus gros des états et faire un placement new.
    tes états contiennent ils des variables ?

  8. #8
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    En cherchant un peu sur le net, j'ai trouvé quelques conseils sur le pattern state qui peuvent répondre en partie à ta question :
    1/ Un état ne devrait pas contenir de variables membres : seul le comportement change,
    2/ Les états devraient être des singletons (en cohérence avec précédent) : ce qui évite ces allocations/destructions répétitives.
    Yop,

    tu saurais retrouver l'endroit où tu as lu ça? J'ai pas mal cherché mais je ne trouve rien de tel :/

  9. #9
    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
    Citation Envoyé par r0d Voir le message
    Yop,

    tu saurais retrouver l'endroit où tu as lu ça? J'ai pas mal cherché mais je ne trouve rien de tel :/
    Non
    Sinon, il y a le tutoriel sur le pattern Etat de Pierre Caboche

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    okay merci

Discussions similaires

  1. cas d'étude: pattern state
    Par r0d dans le forum C++
    Réponses: 33
    Dernier message: 11/10/2013, 13h46
  2. Réponses: 0
    Dernier message: 04/02/2013, 14h45
  3. Combinaison de plusieurs etats avec le pattern State
    Par papaetoo dans le forum Design Patterns
    Réponses: 0
    Dernier message: 18/08/2009, 11h16
  4. [DESIGN J2ME] Utilisation du pattern STATE ?
    Par BerBiX dans le forum Java ME
    Réponses: 0
    Dernier message: 04/12/2008, 15h55

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