Voici un exemple très simplifié . Ce n'est pas nécessairement une question spécifique à la langue, et je vous demande d'ignorer les nombreuses autres façons dont la fonction peut être écrite et les modifications qui peuvent y être apportées. . La couleur est d'un type unique
string CanLeaveWithoutUmbrella()
{
if(sky.Color.Equals(Color.Blue))
{
return "Yes you can";
}
else
{
return "No you can't";
}
}
Beaucoup de gens que j'ai rencontrés, ReSharper, et ce type (dont le commentaire m'a rappelé que je cherchais à poser cette question depuis un moment) recommanderaient de refactoriser le code pour supprimer le else
bloc en laissant ceci:
(Je ne me souviens pas de ce que la majorité a dit, je n'aurais peut-être pas demandé cela autrement)
string CanLeaveWithoutUmbrella()
{
if(sky.Color.Equals(Color.Blue))
{
return "Yes you can";
}
return "No you can't";
}
Question: Y a - t-il une augmentation de la complexité introduite en n'incluant pas le else
bloc?
J'ai l'impression que les else
États déclarent plus directement l'intention, en déclarant que le code dans les deux blocs est directement lié.
De plus, je trouve que je peux éviter des erreurs subtiles de logique, en particulier après des modifications de code à une date ultérieure.
Prenons cette variante de mon exemple simplifié (en ignorant le fait que l' or
opérateur étant donné qu'il s'agit d'un exemple volontairement simplifié):
bool CanLeaveWithoutUmbrella()
{
if(sky.Color != Color.Blue)
{
return false;
}
return true;
}
Quelqu'un peut désormais ajouter un nouveau if
bloc basé sur une condition après le premier exemple sans reconnaître immédiatement correctement que la première condition place une contrainte sur sa propre condition.
Si un else
bloc était présent, celui qui a ajouté la nouvelle condition serait obligé d'aller déplacer le contenu du else
bloc (et si d'une manière ou d'une autre ils le masquent, l'heuristique montrera que le code est inaccessible, ce qui n'est pas le cas dans le cas où l'un en if
contraint un autre) .
Bien sûr, il y a d'autres façons de définir l'exemple spécifique de toute façon, qui empêchent toutes cette situation, mais ce n'est qu'un exemple.
La longueur de l'exemple que j'ai donné peut fausser l'aspect visuel de cela, alors supposez que l'espace occupé par les crochets est relativement insignifiant pour le reste de la méthode.
J'ai oublié de mentionner un cas dans lequel je suis d'accord avec l'omission d'un bloc else, et c'est lorsque j'utilise un if
bloc pour appliquer une contrainte qui doit être logiquement satisfaite pour tout le code suivant, comme un contrôle nul (ou tout autre garde) .
else
clause (à mon goût, il sera encore plus lisible en omettant les parenthèses inutiles. Mais je pense que l'exemple n'est pas bien choisi, car dans le cas ci-dessus, j'écrirais return sky.Color == Color.Blue
(sans if / else). Un exemple avec un type de retour différent de bool rendrait probablement cela plus clair.