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 :

[LEGACY CODE] Conseil architecture basée sur des set/get


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Points : 46
    Points
    46
    Par défaut [LEGACY CODE] Conseil architecture basée sur des set/get
    Bonjour,

    Je reviens vers vous car je me trouve face à ceci: (j'ai réduis le tout au fond du problème, il y a des raccourcis mais mon souci est bien évoqué ici )

    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
    class App {
    	void setFirst(bool value) {
    		drawFirst = _value;
    	}
    	bool getFirst() {
    		return drawFirst;
    	}
    	void setLast(bool value) {
    		drawLast = _value;
    	}
    	bool getLast() {
    		return drawLast;
    	}
    	void setMiddle(bool value) {
    		drawMiddle = _value;
    	}
    	bool getMiddle() {
    		return drawMiddle;
    	}
    	<autres fonctions >
    private:
    	bool drawFirst;
    	bool drawLast;
    	bool drawMiddle;
    	<autres données >
     
    	void draw();
    	void drawFirstlayer();
    	void drawLastlayer();
    	void drawMiddleLayer();
    	<autres fonctions >
    };
    drawFirst, drawLast , drawMiddle ne sont que des indicateurs boolean qui indiquent si on doit tracer ou non des plans. Pour tracer ces plans, l'application applique dont la fonction draw qui récapitule --en gros-- tout cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void App::draw()
    {
    	if (drawFirst)
    		drawFirstLayer;
    	if (drawMiddle)
    		drawMiddleLayer;
    	if (drawLast)
    		drawLastlayer;
    }
    et il y a aussi, ailleurs dans le code, les fameux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app->setFirst(!app->getFirst());

    Aussi pour les yeux de tous, et pour les miens, je souhaite me prendre un peu de mon temps pour modifier cela. Mes collègues refusent d'y toucher car "ca marche".
    Oui c'est bien le cas, ca marche. Mais si je les laisse faire j'aurais bientôt plus de set/get que d'autres fonctions dans le soft. ()

    Je sais pertinemment que je dois penser : qu'offre la classe ?

    Je pourrais remplacer par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	void setFirst(bool value) {
    		drawFirst = _value;
    	}
    	bool getFirst() {
    		return drawFirst;
    	}
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	void showFirst() {
    		drawFirst = true;
    	}
    	void hideFirst() {
    		drawFirst = false;
    	}
    	void toggleFirst() {
    		drawFirst = !drawFirst;
    	}
    J'ai plus de fonctions qui offrent un service. Mais sur mon exemple, je passe du couple get/set à un trio.
    Non pas que je déteste les trios, mais c'est encore plus long qu'avant et je me retrouve encore avec une multitude de copier/coller de fonctions et en faisant cela je n'ai pas l'impression de faire du C++

    Alors je pourrais écrire trois fonctions génériques genre:

    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
     
    enum class APP_VALUE : char {NONE, FIRST_LAYER, LAST_LAYER, MIDDLE_LAYER};
     
    void show(APP_VALUE LayerValue) {
    	switch(Layervalue) {
    		case FIRST_LAYER: drawFirst = true;
    		case LAST_LAYER: drawLast = true;
    		case MIDDLE_LAYER : drawMiddle = true;
    		default : break;
    	}
    }
     
    void hide(APP_VALUE LayerValue); //pareil : construction identique
     
    void toggle(APP_VALUE LayerValue); // pareil : construction identique
    Je me retrouve avec 3 fonctions au lieu de 9. Je ne sais pas comment qualifier cette modification. J'ai encore pas l'impression de faire du C++

    Si je prend mon problème d'un point de vue plus global:
    Si j'applique le principe de la responsabilité unique, je devrais découper App au moins en deux entitées : App et AppDraw
    donc toutes les fonctions draw disparaissent dans appDraw, je gagne en clarté et ma classe App ne s'occupe plus que d'un truc. (que doit afficher App ??)

    Maintenant, en amont, je regarde qui appelle ma classe App.
    Il s'agit d'une seule classe AppEvent qui gère les évents liées à App.

    Un truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum class APP_VALUE : char {NONE, FIRST_LAYER, LAST_LAYER, MIDDLE_LAYER};
    existe déjà

    Donc tous les get/set ne servent qu'à une seule chose : donner à AppEvent le bon nom de la fonction à appeler.

    On peut alors passer toute la classe App en friend class AppEvent, mais j'ai toujours pas l'impression de faire du C++

    Aussi comment puis je modifier intelligemment ma classe App ?
    J'ai malheureusement aussi la contrainte que je ne peux pas repenser à zéro le soft de A à Z, ni même localement : mes collègues et mon patron y sont hostiles car "ça marche".
    Or je souhaite bouger les choses. Que feriez vous à ma place ?

    En vous remerciant par avance !


    Cordialement,

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Salut

    Je trouve carrément mieux les show/hide/toggle. La sémantique est bien plus claire et évite les codes obscures comme set(!get().

    Une solution est de faire une liste de layers. Ca sera d'ailleurs pratique si d'aventure tu devais en avoir 4 ou 5 un jour. Et ça évite les multiplications de fonctions. Ta technique avec l'enum est presque équivalente.

    Donc tous les get/set ne servent qu'à une seule chose : donner à AppEvent le bon nom de la fonction à appeler.
    Ca fait un peu table de correspondance tout ça. Pourquoi pas mapper un event à une fonction de dessin (les lambas peuvent t'aider).

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Perso je miserais sur du void show(layer, bool); parce que si tu proposes que show/hide, tu vas te retrouver avec des check true/false dans tout le code appelant, ce qui est lourd.
    Quand tu voudras ajouter ou supprimer des layers, ce sera plus simple.
    Et proposer un vrai toggle parce que l'écriture set(!get) me fait vraiment du mal.
    Aussi, un peu de const-correctness ne ferait pas de mal.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre du Club
    Profil pro
    Enseignant
    Inscrit en
    Septembre 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 43
    Points : 46
    Points
    46
    Par défaut
    Merci à tous pour vos précieux conseils !
    Je sais quoi faire

    Cordialement,

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 14/09/2006, 16h43
  2. Réponses: 1
    Dernier message: 01/09/2006, 08h10
  3. [MFC]Application basée sur des boites de dialogue
    Par -=Spoon=- dans le forum MFC
    Réponses: 2
    Dernier message: 24/08/2005, 11h55
  4. analyse "périodes" basées sur des dates.
    Par Yorglaa dans le forum Oracle
    Réponses: 7
    Dernier message: 22/12/2004, 11h39

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