Outils pour utilisateurs

Outils du site


lang:recommandation:condition

Réduire le nombre de if/switch

Code différent si un paramètre est différent

Dans ce cas, il faut séparer le code en deux fonctions.

  • Avant :
public static void createFile(String name, String contents, boolean temporary) {
  if(temporary) {
    // save temp file
  } else {
    // save permanent file
  }
}
  • Après :
public static void createFile(String name, String contents) {
  // save permanent file
}
 
public static void createTemporaryFile(String name, String contents) {
  // save temp file
}

Polymorphisme

  • Avant :
public class Bird {
  public double getSpeed() {
    switch (type) {
      case EUROPEAN:
        return getBaseSpeed();
      case AFRICAN:
        return getBaseSpeed() - getLoadFactor();
      case NORWEGIAN_BLUE:
        return isNailed ? 0 : getBaseSpeed();
      default:
        return 0;
    }
  }
}
  • Après :
public abstract class Bird {
  public abstract double getSpeed();
}
 
public class EuropeanBird extends Bird {
  public double getSpeed() {
    return getBaseSpeed();
  }
}
 
public class AfricanBird extends Bird {
  public double getSpeed() {
    return getBaseSpeed() - getLoadFactor();
  }
}
 
public class NorwegianBird extends Bird {
  public double getSpeed() {
    return isNailed ? 0 : getBaseSpeed();
  }
}

Pattern Command / Abstract factory

Il est possible d'appliquer différents patterns pour éviter les conditions.

Seven Ways to Refactor Java switch Statements Archive du 10/11/2017 le 02/03/2020

On crée la même classe partout et on met dans une instance composite la méthode à exécuter. Si la méthode à exécuter peut varier dans le temps, on peut aussi mettre les différentes méthodes à exécuter dans une map. C'est plus rapide et plus facile à lire qu'un switch.

  • État : c'est comme le pattern command mais c'est après chaque modification de l'état que la classe command est automatiquement remplacée par la nouvelle classe.

Préférer une liste vide à un null

  • Avant :
public void example() {
  sumOf(null);
}
 
public static int sumOf(List<Integer> numbers) {
  if(numbers == null) {
    return 0;
  }
 
  return numbers.stream().mapToInt(i -> i).sum();
}
  • Après :
public void example() {
  sumOf(new ArrayList<>());
}
 
public static int sumOf(List<Integer> numbers) {
  return numbers.stream().mapToInt(i -> i).sum();
}

Combiner les conditions

  • Avant :
public boolean horrible(boolean foo, boolean bar, boolean baz) {
  if (foo) {
    if (bar) {
      return true;
    }
  }
 
  if (baz) {
    return true;
  } else {
    return false;
  }
}
  • Après :
public boolean horrible(boolean foo, boolean bar, boolean baz) {
  return foo && bar || baz;
}
lang/recommandation/condition.txt · Dernière modification : 2020/03/03 14:44 de root