Réduire le nombre de if/switch

Anti-If: The missing patterns Archive du 09/06/2016 le 02/03/2020

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

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

public static void createFile(String name, String contents, boolean temporary) {
  if(temporary) {
    // save temp file
  } else {
    // save permanent file
  }
}
public static void createFile(String name, String contents) {
  // save permanent file
}
 
public static void createTemporaryFile(String name, String contents) {
  // save temp file
}

Polymorphisme

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;
    }
  }
}
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.

Préférer une liste vide à un null

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

Combiner les conditions

public boolean horrible(boolean foo, boolean bar, boolean baz) {
  if (foo) {
    if (bar) {
      return true;
    }
  }
 
  if (baz) {
    return true;
  } else {
    return false;
  }
}
public boolean horrible(boolean foo, boolean bar, boolean baz) {
  return foo && bar || baz;
}