2016-09-23 4 views
2

Je souhaite refactoriser le code Java qui ressemble à ceci. a, b, c et d sont des drapeaux booléens.Conditionnels basés sur plusieurs indicateurs

if(a && b && c && d) doA(); 
else if (a && b && c && !d) doB(); 
else if (a && b && !c && d) doC(); 
else if (!a && !b && c && d) doD(); 

et ainsi de suite, pour les 16 combinaisons. Y a-t-il un meilleur moyen? J'ai considéré une carte avec les valeurs comme références de méthode mais former les clés reste un mystère.

+2

Ceci est étrange * de toute façon *, mais un code plus substantiel en plus de 'a',' b', 'c' et' d' irait plus loin dans le sens d'une solution idéale. Vous voudriez également nous montrer les combinaisons possibles et les chaînes d'action que vous avez. C'est peut-être long, mais si vous cherchez une solution solide, nous, les répondants, devons avoir une bonne compréhension de votre problème. – Makoto

+0

S'il n'y a pas d'effets secondaires, vous pouvez utiliser des masques de bits. – Andrey

+0

Merci @Makoto mais les combinaisons sont comme je l'ai dit: toutes les 16 façons de combiner 4 bits. 0000, 0001, 0010, 0011, 0100, 0101, etc. jusqu'à 1111. Il n'y a aucune raison de taper tout cela. Ce qui se passe dans les appels de méthode spécifiques associés à chaque combinaison, si c'est ce que vous entendez par "chaînes d'actions", n'est pas pertinent pour le problème. – KevinRethwisch

Répondre

2

Créer matrice de fonction,

public class FunctionTypes { 
    public void func() {} 
} 

    ..... 

    FunctionTypes[] functions = new FunctionTypes[] { 
      new FunctionTypes() { 
       public void func() { f1(); } 

       public void f1() { 
        // handle case #1 
       } 
      }, 
      new FunctionTypes() { 
       public void func() { f2(); } 

       public void f2() { 
        // handle case #2 
       } 
      }, 
      new FunctionTypes() { 
       public void func() { f3(); } 

       public void f3() { 
        // handle case #3 
       } 
      }, 
      new FunctionTypes() { 
       public void func() { f4(); } 

       public void f4() { 
        // handle case #4 
       } 
      }, 
      .... 
     }; 

    // invoke case #0 
    functions[0].func(); 

    // invoke case #1 
    functions[1].func(); 

index pour sélectionner les bits d'utilisation de a, b, c, d

index = 0; 
    index |= a; 
    index |= b << 1; 
    index |= c << 2; 
    index |= d << 3; 

comme s'ils comptent tous les 16 cas. Ou vous pouvez hériter de 16 sous-classes différentes d'une classe principale et remplacer une méthode dans chaque sous-classe différente et sélectionner des instances de ces classes en utilisant un tableau de classe supérieure. Peut-être que la mise en place d'une interface pourrait être meilleure.

Je ne sais pas si la carte de java a un temps d'accès O (n * logn) mais l'accès au tableau est O (1).