Considérez ce morceau de code:
if (x == 1)
{
throw "no good; aborting" ;
}
[... more code ...]
Considérez maintenant ce code:
if (x == 1)
{
throw "no good; aborting" ;
}
else
{
[... more code ...]
}
Les deux cas fonctionnent exactement de la même manière. Le premier cas présente l'avantage de ne pas avoir à "encapsuler" le reste du code dans un else
. La seconde a l'avantage de suivre la pratique d'avoir explicitement un else
pour tous if
.
Quelqu'un peut-il fournir des arguments solides en faveur de l'un plutôt que de l'autre?
coding-style
exceptions
rlandster
la source
la source
else
semble bidon. Assez souvent, il n'y a tout simplement rien à mettre dans leelse
bloc, sauf si vous vous penchez en arrière.if
besoinelse
. Le dernier programmeur qui a travaillé sur notre base de code a suivi cela de manière rigide ( enfin, parfois ... c'est un peu schizophrène ). En conséquence, nous avons beaucoup deelse { /* do nothing */ }
blocs entièrement dénués de sens qui jonchent le code ...Réponses:
Vous ne devez pas ajouter
else
après lesif
branches qui interrompent inconditionnellement le flux de contrôle , telles que celles contenant unthrow
ou unreturn
. Cela améliorerait la lisibilité de votre programme en supprimant le niveau d'imbrication inutile introduit par laelse
branche.Ce qui semble plus ou moins correct avec un seul
throw
devient vraiment moche lorsque plusieurs lancers consécutifs sont inversés:Cet extrait fait la même chose, mais il semble beaucoup mieux:
la source
else if
.if
teste une seule condition et la traite si la condition est vraie, et à moins qu'il ne se passe quelque chose d'autre si la condition est fausse, leselse if
s ne sont pas nécessaires. Nous avons un terme dans mon bureau pour le code comme le premier extrait de dasblinkenlight: " machines pachinko ."else
.J'appellerais la pratique «explicite autrement» que vous appelez un anti-modèle, car elle obscurcit le fait qu'il n'y a pas de code spécial dans le cas contraire de votre if.
La lisibilité / maintenabilité est généralement améliorée lorsque vous n'avez pour la plupart que des constructions de flux de code nécessaires et que vous les minimisez. Cela signifie des elses redondants et si ceux qui ajouteront une portée à une fonction entière rendent le suivi et la maintenance plus difficiles.
Dites par exemple que vous avez cette fonction:
Maintenant, l'exigence vient que pendant la configuration, vous devez également spécifier le type / index de type de l'oblogon, il existe plusieurs étendues que quelqu'un pourrait placer ce code et se retrouver avec un code invalide, c'est-à-dire
Comparez cela à si le code d'origine a été écrit avec des constructions de flux de contrôle minimales nécessaires et minimisées à cela.
Il serait désormais beaucoup plus difficile de mettre accidentellement quelque chose dans la mauvaise portée ou de finir par des ballonnements gonflés, ce qui entraînerait une duplication à long terme de la croissance et du maintien de cette fonction. De plus, il est évident quels sont les flux possibles via cette fonction, de sorte que la lisibilité est améliorée.
Je sais, l'exemple est un peu artificiel, mais j'ai vu plusieurs fois
Donc, je pense que formaliser ces règles sur les constructions de flux de contrôle peut aider les gens à développer l'intuition nécessaire pour sentir quelque chose lorsqu'ils commencent à écrire du code comme ça. Ensuite, ils commenceront à écrire ..
la source