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
- Command : cette méthode est proche du paragraphe Polymorphisme.
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
.
- Fabrique abstraite : utilisable si le switch est pour l'allocation d'une ressource.
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