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 :

[Principe de programmation] switch / case


Sujet :

Design Patterns

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Hong-Kong

    Informations forums :
    Inscription : Mai 2003
    Messages : 50
    Points : 56
    Points
    56
    Par défaut [Principe de programmation] switch / case
    Ma question de concerne pas vraiment les Design Patterns ni une méthode mais je ne vois pas ou l'a poster mieux qu'ici.

    Voilà, je voudrais savoir s'il est possible d'optimiser ce genre d'algorithmes :

    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
    switch (var)
    {
      case 1:
      switch (subvar)
      {
        case a:
          process a1;
        case b:
          process b1;    
        case c:
          process c1;
      }
      case 2:
      switch (subvar)
      {
        case a:
          process a2;
        case b:
          process b2;    
        case c:
          process c2;
      }
      case 3:
      switch (subvar)
      {
        case a:
          process a3;
        case b:
          process b3;    
        case c:
          process c3;
      }
    }
    Le code est assez simple ici mais il faut l'imaginer plus complexe. Avec plus de case et avec plus de niveau de switch. J'ai le cas avec 3 variables. Selon qu'elles prennent les valeurs 1, 2, 3 ou a, b, c ou alpha, beta, charlie j'ai des processus différents à réaliser. Est il possible d'optimiser celà d'une autre manière que vie une série de switch / case ?

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

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Oui, tu peux l'optimiser et faire ça de manière bien plus propre. Tu peux pas exemple utiliser une "Chain of responsability" avec une Factory :

    Code Java : 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
    public class ProcessFactory {
    	private ArrayList<Process> processses = null;
     
    	public ProcessFactory(){
    		super();
     
    		processses = new ArrayList<Process>();
     
    		processses.add(new ProcessC1());
    		processses.add(new ProcessC2());
    		processses.add(new ProcessC3());
    		processses.add(new ProcessC4());					processses.add(new ProcessC5(6));					processses.add(new ProcessC5(22));
    	}
     
    	public Process getProcess(int var, int subvar){
    		for(Process process : processses){
    			if(process.canDo(var, subvar)){
    				return process;
    			}
    		}
     
    		return null;
    	}
    }

    Ensuite, il suffit que tes process implémentent tous une interface process avec une canXXX et tu pourras ensuite facilement l'utiliser :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    new ProcessFactory().getProcess(var, subvar).launch();

    Là le code est en Java, mais tu dois pouvoir adapter ça à tous les langages.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Si tu écris cela en C, la méthode évoquée un peu plus haut risque de te causer pas mal de developpement pour l'adapter !!

    De façon plus simple, tu peux remplacer les switch imbriqués par des appels à des fonctions

    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
    switch (var)
    {
      case 1:
      fonctionSwitch1(...)
      case 2:
      fonctionSwitch2(...)
      case 3:
      fonctionSwitch3(...)
    }
    
    fonctionSwitch1(...){
       switch (subvar)
      {
        case a:
          process a1;
        case b:
          process b1;    
        case c:
          process c1;
      }
    }
    
    etc...
    En faisant cela tu risques de pouvoir factoriser du code. Cela améliore la lisibilité du code et du coup il est plus facile à maintenir.
    Optimiser est difficile car tu sera obligé à un moment ou un autre de faire ces tests. Si cela n'est n'est avec un switch, ça sera avec un if/else etc...

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

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    C'est clair que si tu codes en C, la façon de faire que je t'ai donnée ne vas pas être possible, le C n'étant pas orienté objet

    Je ne vois alors que la solution de rhadamanthe.

    Ah ces langages non-orientés objets

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

    c'est le genre de chose qui se fait tres bien avec des tableaux de pointeurs sur fonctions

    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
    /* exemple limite a 2 indices, reduits a un tableau a 1 dimension pour faire simple */
    
    #include <stdio.h>
                                                                                                                                                                                                         
    typedef void (*T_F)();
                                                                                                                                                                                                         
    /* les fonctions a appeler en fonction des parametres */
    void f1a () { printf("f1a\n"); }
    void f1b () { printf("f1b\n"); }
    void f2a () { printf("f2a\n"); }
    void f2b () { printf("f2b\n"); }
                                                                                                                                                                                                         
    static T_F functions[4] = { &f1a, &f1b, &f2a, &f2b } ;
                                                                                                                                                                                                         
    /* usage: a.out 1|2 a|b */
    int main(int argc, char** argv) {
                                                                                                                                                                                                         
       /* bidouille sur les agruments pour cet exemple */
       if (argc < 2) return -1;
       int v1 = (argv[1][0] -1) & 1;
       int v2 = (argv[2][0] -1) & 1;
       int index = (v1 << 1) | v2;
       /* printf ("%d, %d, %d\n", v1, v2, index); */
    
       /* ici la partie interessante */
       T_F f = functions[index];
       (*f)();
    
       return 0;
    }
    Alex.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Le problème avec la méthode des pointeurs de fonction, c'est qu'il n'est pas certain du tout que l'index soit si simple à déterminer.

    Si pour chaque valeur de son switch il doit déterminer la correspondance en indice, cela risque d'etre vite laborieux. (maintenir un tableau des correspondances, pire, faire un hachage...)

    Tant qu'a faire les tests, autant appeler directement la fonction qui va bien je pense.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Hong-Kong

    Informations forums :
    Inscription : Mai 2003
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Merci pour toutes vos réponses. j'ai trouvé celà fort intéressant. Je développe en C#. Je peux donc choisir l'option orienté objet en évitant les pointeurs. La solution de wichtounet semble tout à fait appropriée à mes besoins.

    C'est incroyable. Je peux réduire tout mes switch/case, if/else en un unique if. C'est évidement beaucoup plus propre.

    Celà me fait penser à un une remarque que j'ai lu il y a un petit temps. Est il vrai qu'un bon programme orienté objet (voir pur objet) devrait comporter un minimum (voir aucune) d'alternatives ?

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

Discussions similaires

  1. [Language]Probleme de switch case
    Par nana1 dans le forum Langage
    Réponses: 20
    Dernier message: 17/11/2005, 00h49
  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