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 elsebloc 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 elsebloc?
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' oropé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 ifbloc 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 elsebloc était présent, celui qui a ajouté la nouvelle condition serait obligé d'aller déplacer le contenu du elsebloc (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 ifcontraint 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 ifbloc pour appliquer une contrainte qui doit être logiquement satisfaite pour tout le code suivant, comme un contrôle nul (ou tout autre garde) .
elseclause (à 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.
