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

Design Patterns Discussion :

Switch Case joli ou pas ?


Sujet :

Design Patterns

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut Switch Case joli ou pas ?
    Bonjour,

    Je me pose des questions sur la forme switch / case, et je cherche un modèle de conception OO qui la remplace.

    J'ai essayé celui du visiteur, mais, s'il est très éléguant, je le trouve finalement peut intuitif à la relecture.

    Il y a des choses comme Strategy, State, Bridge, mais j'ai l'impression que ils ne sont pas fait pour ça ; en fait, dans tous ces patterns, il me semble que le choix du traitement est fait par le contexte, donc par... un switch case.

    Qu'en pensez-vous ?... Que faites-vous ?...

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 113
    Par défaut
    Bonjour,

    bien vu la notion de "joli" !

    On peut toujours remplacer un switch ou un if par un appel de methode (methode virtuelle, liaison dynamique).

    du genre, pour l'affichage d'un nombre entier dans plusieurs formats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    print (entier i, entier format) {
       switch (format) {
          case DECIMAL :
             printf("%d", i);
             break;
          case HEXA :
             printf("%xd", i);
             break;
          case BINAIRE :
    ...
    peut devenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    object_formater.print(i);
    tout depend de la classe de object_formater (Abstract_Formater, dont héritent Decimal_Formater, Hexa_Formater, ...).

    C'est beaucoup plus "joli", au sens OO du terme...
    mais beaucoup plus lourd !

    Le pattern visiteur est un moyen de "rester a peu prêt objet" en délégant des comportements a des classes externes. Utile mais attention a ne pas exporter trop de responsabilités.

    En resume :
    faire du joli dans les grandes lignes (surtout en début d'analyse), puis dans les détails ne pas hésiter a faire "crade". (attention quand même a rester "joli" dans l'ensemble).

    Alex

  3. #3
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Ouais c'est un peu la conclusion à laquelle j'étais arrivé, mais enfin tu m'avoueras que c'est un peu bizarre...

    Il n'y a donc aucun pattern OO qui soit vraiment satisfaisant, à l'usage je parle (et non à la théorie), par rapport au switch case ?

    Certes l'idée du formatter est pas mal, mais elle t'oblige à créer une classe par comportement, et par type. Si je veux qu'un véhicule respecte les feux, par exemple, alors je dois créer une classe pour chaque couleur du feu et chaque véhicule... et avec ça je ne suis nullement certain que chaque véhicule se comportera correctement, puisque chacun peut écrire ce qu'il veut dans l'implémentation...

    Quand à celui du visiteur, comme tu dis, il ne faut pas qu'il y ait trop de responsabilités, sinon cela devient incompréhensible..

    Bref, pas d'autres idées ?... on continue les switch cases, en les matinant de quelques Strategy et Visitor pour faire intello ?...

  4. #4
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Tu peux aussi parfois remplacer le switch par une structure telle que celle-ci :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(AbstractObject object : objects){
       if(object.test(a)){
          objet.doSomething();
       }
    }

    Par contre, ça oblige à voir une classe abstraite ou une interface et souvent de nombreux sous types. J'utilise régulièrement cette structure, mais c'est vrai que c'est parfois un peu lourd de créer une nouvelle arborescence de classes juste pour un switch, alors j'en laisse tout de même quelques-uns.

Discussions similaires

  1. switch case, include : ne fonctionne pas
    Par FraK dans le forum Langage
    Réponses: 13
    Dernier message: 02/07/2008, 11h50
  2. switch case pour deux variable en meme temps
    Par petitours dans le forum C
    Réponses: 3
    Dernier message: 06/11/2005, 19h20
  3. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37
  4. probleme gestion condition switch - case
    Par DarkMax dans le forum Langage
    Réponses: 5
    Dernier message: 07/09/2005, 14h25
  5. [Language] aide sur les switch case
    Par pouss dans le forum Langage
    Réponses: 3
    Dernier message: 05/04/2005, 11h34

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