Remplacer les conditions imbriquées par des clauses de garde.
Vous avez un groupe de conditions imbriquées et il est difficile de déterminer le flux normal d'exécution du code.
Isolez toutes les vérifications spéciales et les cas limites dans des clauses distinctes et placez-les avant les vérifications principales. Idéalement, vous devriez obtenir une liste « plate » de conditions, les unes après les autres.
##Example
public double getPayAmount() {
double result;
if (isDead){
result = deadAmount();
}
else {
if (isSeparated){
result = separatedAmount();
}
else {
if (isRetired){
result = retiredAmount();
}
else{
result = normalPayAmount();
}
}
}
return result;
}public double getPayAmount() {
if (isDead){
return deadAmount();
}
if (isSeparated){
return separatedAmount();
}
if (isRetired){
return retiredAmount();
}
return normalPayAmount();
}##Why Refactor
Repérer la « condition infernale » est assez facile. Les indentations de chaque niveau d'imbrication forment une flèche pointant vers la droite, en direction de la douleur et du malheur :
if () {
if () {
do {
if () {
if () {
if () {
...
}
}
...
}
...
}
while ();
...
}
else {
...
}
}
Il est difficile de comprendre ce que fait chaque condition et comment, car le flux « normal » d'exécution du code n'est pas immédiatement évident. Ces conditions trahissent une évolution chaotique, chaque condition ayant été ajoutée comme une rustine, sans réflexion sur l'optimisation de la structure d'ensemble.
Pour simplifier la situation, isolez les cas particuliers dans des conditions distinctes qui mettent immédiatement fin à l'exécution et renvoient une valeur nulle si les clauses de garde sont vraies. En somme, votre mission ici est d'aplatir la structure.
##How to Refactor
Essayez de débarrasser le code de ses effets de bord — Séparer la requête de la modification peut être utile à cette fin. Cette solution sera nécessaire pour le réagencement décrit ci-dessous.
-
Isolez toutes les clauses de garde qui mènent à la levée d'une exception ou au retour immédiat d'une valeur depuis la méthode. Placez ces conditions au début de la méthode.
-
Une fois le réagencement terminé et tous les tests passés avec succès, voyez si vous pouvez utiliser Consolider une expression conditionnelle pour les clauses de garde qui mènent aux mêmes exceptions ou valeurs de retour.