Disons que j'ai du code en C avec à peu près cette structure:
switch (something)
{
case 0:
return "blah";
break;
case 1:
case 4:
return "foo";
break;
case 2:
case 3:
return "bar";
break;
default:
return "foobar";
break;
}
Maintenant, évidemment, les break
s ne sont pas nécessaires pour que le code fonctionne correctement, mais cela ressemble à une mauvaise pratique si je ne les mets pas là.
Qu'est-ce que tu penses? Est-ce bien de les supprimer? Ou les conserveriez-vous pour une "exactitude" accrue?
c
switch-statement
correctness
houbysoft
la source
la source
continue
ougoto
- il est idiomatique de les utiliser à la place debreak
.Je prendrais une approche complètement différente. Ne retournez pas au milieu de la méthode / fonction. Au lieu de cela, mettez simplement la valeur de retour dans une variable locale et envoyez-la à la fin.
Personnellement, je trouve ce qui suit plus lisible:
la source
Personnellement, je supprimerais les retours et garderais les pauses. J'utiliserais l'instruction switch pour attribuer une valeur à une variable. Puis renvoyez cette variable après l'instruction switch.
Bien que ce soit un point discutable, j'ai toujours pensé qu'une bonne conception et une bonne encapsulation signifiaient une entrée et une sortie. Il est beaucoup plus facile de garantir la logique et vous ne manquez pas accidentellement le code de nettoyage basé sur la complexité cyclomatique de votre fonction.
Une exception: le retour anticipé est acceptable si un paramètre incorrect est détecté au début d'une fonction - avant que des ressources ne soient acquises.
la source
switch
, mais pas nécessairement le meilleur en général. Eh bien, disons que l'instruction switch à l'intérieur d'une fonction précède 500 autres lignes de code qui ne sont valides que dans certains castrue
. Quel est l'intérêt d'exécuter tout ce code supplémentaire pour les cas qui n'ont pas besoin de l'exécuter; n'est-il pas préférable de justereturn
à l'intérieurswitch
pour cescase
sGardez les pauses - vous êtes moins susceptible de rencontrer des problèmes si / lorsque vous modifiez le code plus tard si les pauses sont déjà en place.
Cela dit, beaucoup (y compris moi) considèrent comme une mauvaise pratique de revenir du milieu d'une fonction. Idéalement, une fonction doit avoir un point d'entrée et un point de sortie.
la source
Retirez-les. Il est idiomatique de revenir à partir d'
case
instructions, et c'est du bruit de «code inaccessible» autrement.la source
Je les supprimerais. Dans mon livre, un code mort comme celui-là devrait être considéré comme une erreur car il vous oblige à faire une double prise et à vous demander "Comment pourrais-je exécuter cette ligne?"
la source
J'écrirais normalement le code sans eux. OMI, le code mort a tendance à indiquer une négligence et / ou un manque de compréhension.
Bien sûr, j'envisagerais également quelque chose comme:
Edit: même avec le post édité, cette idée générale peut bien fonctionner:
À un moment donné, en particulier si les valeurs d'entrée sont clairsemées (par exemple, 1, 100, 1000 et 10000), vous voulez plutôt un tableau épars. Vous pouvez l'implémenter sous forme d'arbre ou de carte raisonnablement bien (bien que, bien sûr, un commutateur fonctionne toujours dans ce cas également).
la source
Je dirais les supprimer et définir un défaut: branche.
la source
Ne serait-il pas préférable d'avoir un tableau avec
et faire
return arr[something];
?S'il s'agit de la pratique en général, vous devez conserver les
break
instructions dans le commutateur. Dans le cas où vous n'avez pas besoin dereturn
déclarations à l'avenir, cela réduit le risque de passer à la suivantecase
.la source
Pour "l'exactitude", les blocs à entrée unique et à sortie unique sont une bonne idée. Du moins, ils l'étaient quand j'ai obtenu mon diplôme en informatique. Donc je déclarerais probablement une variable, lui assignerais dans le commutateur et retournerais une fois à la fin de la fonction
la source
C'est bien de les supprimer. L'utilisation
return
est exactement le scénario oùbreak
ne doit pas être utilisé.la source
Intéressant. Le consensus de la plupart de ces réponses semble être que la
break
déclaration redondante est un fouillis inutile. D'un autre côté, j'ai lu labreak
déclaration dans un interrupteur comme la «clôture» d'une affaire.case
les blocs qui ne se terminent pas par unbreak
ont tendance à me sauter dessus comme une chute potentielle à cause de bugs.Je sais que ce n'est pas comme ça quand il y a un
return
au lieu d'unbreak
, mais c'est ainsi que mes yeux `` lisent '' les blocs de boîtier dans un commutateur, donc je préférerais personnellement que chacuncase
soit associé à unbreak
. Mais de nombreux statisticiens ne se plaignent dubreak
aprèsreturn
être superflu / injoignable, et apparemment je semblent être en minorité de toute façon.Alors, débarrassez-vous de ce qui
break
suit areturn
.NB: tout cela ne tient pas compte du fait que la violation de la règle d'entrée / sortie unique est une bonne idée ou non. Pour ce qui est de cela, j'ai un avis qui change malheureusement selon les circonstances ...
la source
Je dis de les supprimer. Si votre code est tellement illisible que vous devez y insérer des pauses `` pour être du bon côté '', vous devriez reconsidérer votre style de codage :)
De plus, j'ai toujours préféré ne pas mélanger les pauses et les retours dans l'instruction switch, mais plutôt m'en tenir à l'un d'entre eux.
la source
Personnellement, j'ai tendance à perdre le par
break
. L'une des sources de cette habitude est peut-être la programmation des procédures de fenêtre pour les applications Windows:Personnellement, je trouve cette approche beaucoup plus simple, succincte et flexible que de déclarer une variable de retour définie par chaque gestionnaire, puis de la renvoyer à la fin. Compte tenu de cette approche, les
break
s sont redondants et devraient donc disparaître - ils ne servent à rien (syntaxiquement ou visuellement IMO) et ne font que gonfler le code.la source
Je pense que les * break * s sont là pour un but. Il s'agit de maintenir vivante «l'idéologie» de la programmation. Si nous devons simplement «programmer» notre code sans cohérence logique, il vous sera peut-être lisible maintenant, mais essayez demain. Essayez de l'expliquer à votre patron. Essayez de l'exécuter sur Windows 3030.
Bleah, l'idée est très simple:
/ * Juste une question mineure. Combien de café avez-vous bu en lisant ce qui précède? IT casse parfois le système * /
la source
Code de sortie à un moment donné. Cela offre une meilleure lisibilité du code. L'ajout d'instructions de retour (sorties multiples) entre les deux rendra le débogage difficile.
la source
Si vous avez le type de code "recherche", vous pouvez empaqueter la clause switch-case dans une méthode par elle-même.
J'en ai quelques-uns dans un système "hobby" que je développe pour le plaisir:
(Ouais. C'est l'espace GURPS ...)
Je suis d'accord avec d'autres pour dire que vous devriez dans la plupart des cas éviter plus d'un retour dans une méthode, et je reconnais que celle-ci aurait pu être mieux implémentée en tant que tableau ou autre. Je viens de trouver que switch-case-return est une correspondance assez facile avec une table de recherche avec une corrélation 1-1 entre l'entrée et la sortie, comme la chose ci-dessus (les jeux de rôle en sont pleins, je suis sûr qu'ils existent dans d'autres "entreprises" également): D
D'un autre côté, si la clause case est plus complexe ou que quelque chose se passe après l'instruction switch, je ne recommanderais pas d'utiliser return dedans, mais plutôt de définir une variable dans le commutateur, de la terminer par une pause et de retourner la valeur de la variable à la fin.
(D'un autre côté ... vous pouvez toujours refactoriser un commutateur dans sa propre méthode ... Je doute que cela ait un effet sur les performances, et cela ne me surprendrait pas si les compilateurs modernes pouvaient même le reconnaître comme quelque chose qui pourrait être incorporé ...)
la source