111 votes

Instruction Switch avec retours -- correction du code

Disons que j'ai un code en C avec approximativement 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, le break 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'en pensez-vous ? Est-il possible de les supprimer ? Ou les conserveriez-vous pour plus de "correction" ?

172voto

kgiannakakis Points 62727

Retirer le break déclarations. Elles ne sont pas nécessaires et peut-être que certains compilateurs émettront des instructions "Code non atteignable" avertissements.

2 votes

Il en va de même avec d'autres déclarations inconditionnelles de saut de contrôle, comme continue o goto - il est idiomatique de les utiliser à la place des break .

41voto

Chris Lively Points 59564

J'adopterais une approche totalement différente. Ne faites pas de RETOUR 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 que le texte suivant est plus lisible :

String result = "";

switch (something) {
case 0:
  result = "blah";
  break;
case 1:
  result = "foo";
  break;
}

return result;

0 votes

+1 parce que je ferais la même chose et que je ne comprends pas pourquoi quelqu'un dévaloriserait cette solution. Je n'aime pas avoir un code qui saute.

27 votes

La philosophie "One Exit" a du sens en C, où vous devez vous assurer que les choses sont nettoyées correctement. Si l'on considère qu'en C++ vous pouvez être sorti de la fonction à tout moment par une exception, la philosophie de la sortie unique n'est pas vraiment utile en C++.

34 votes

En théorie, c'est une excellente idée, mais elle nécessite souvent des blocs de contrôle supplémentaires qui peuvent nuire à la lisibilité.

7voto

Amardeep Points 10417

Personnellement, j'enlèverais les retours et garderais les ruptures. J'utiliserais l'instruction switch pour attribuer une valeur à une variable. Puis je renverrais cette variable après l'instruction switch.

Bien que ce point soit discutable, j'ai toujours pensé qu'une bonne conception et une encapsulation signifient une entrée et une sortie. Il est beaucoup plus facile de garantir la logique et vous ne manquez pas accidentellement du code de nettoyage basé sur la complexité cyclomatique de votre fonction.

Une exception : Le retour anticipé est acceptable si un mauvais paramètre est détecté au début d'une fonction, avant que des ressources ne soient acquises.

1 votes

Cela pourrait être bon pour ce cas particulier switch mais pas nécessairement le meilleur en général. Disons que l'instruction switch à l'intérieur d'une fonction précède 500 autres lignes de code qui ne sont valables que dans certains cas. true . 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 juste return à l'intérieur de la switch pour ceux case s ?

7voto

Stephen Points 16714

Enlevez-les. Il est idiomatique de revenir de case et sinon c'est un bruit de "code inaccessible".

4voto

Paul R Points 104036

Conservez les ruptures - vous risquez moins d'avoir des problèmes si vous modifiez le code ultérieurement si les ruptures sont déjà en place.

Cela dit, beaucoup (y compris moi) considèrent comme une mauvaise pratique le fait de revenir du milieu d'une fonction. Idéalement, une fonction devrait avoir un point d'entrée et un point de sortie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X