====Réduire le nombre de if/switch====
[[https://code.joejag.com/2016/anti-if-the-missing-patterns.html|Anti-If: The missing patterns]] {{ lang:recommandation:condition:anti-if_the_missing_patterns_2020-03-02_19_26_37_.html |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.
* 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.
[[https://www.developer.com/java/data/seven-ways-to-refactor-java-switch-statements.html|Seven Ways to Refactor Java switch Statements]] {{ lang:recommandation:condition:seven_ways_to_refactor_java_switch_statements_-_developer.com_2020-03-02_20_46_42_.html |Archive du 10/11/2017 le 02/03/2020}}
* [[helloworld:design_pattern:command|Command]] : cette méthode est proche du paragraphe [[lang:recommandation:condition#polymorphisme|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''.
* [[helloworld:design_pattern:etat|État]] : c'est comme le pattern [[helloworld:design_pattern:command|command]] mais c'est après chaque modification de l'état que la classe command est automatiquement remplacée par la nouvelle classe.
* [[helloworld:design_pattern:fabrique_abstraite|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 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 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;
}