2008-12-04 6 views
1

Si j'ai quelque chose comme une boucle ou un ensemble d'instructions if/else, et que je veux retourner une valeur depuis le nid (voir ci-dessous), est la meilleure façon de le faire affecter la valeur à un champ ou une propriété et retourner cela?Question rapide sur le retour d'une instruction imbriquée

Voir ci-dessous:

bool b; 

public bool ifelse(int i) 
{ 
if(i == 5) 
{ 
b = true; 
} 

else 
{ 
b = false; 
} 
return b; 
} 
+0

Wow code horrible débutant :) Cela faisait un moment que je voyais quelque chose qui impliquait quelque chose de si simple –

+0

duplication possible de [Si une fonction n'a qu'une seule déclaration de retour ?] (http://stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement) –

Répondre

0

Oui, c'est un bon style.

L'alternative (ce qui serait mauvaise) serait de le faire:


public bool ifelse(int i) 
{ 
    if(i == 5) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

La raison de multiples points de retour sont considérés comme mauvais style est que, en particulier pour les méthodes plus grandes, il peut être difficile de garder une trace du flux de programme dans une méthode, car il pourrait sortir à tout point. Cela peut être un cauchemar à déboguer. Si vous avez une variable de retour que vous affectez cependant, vous pouvez regarder cette variable et savoir exactement quand elle sera retournée (à partir d'un seul endroit).

Ce n'est pas toujours le cas, comme tous les points de style dans la programmation il y a des bons côtés à et mauvais côtés.

+0

Avoir de longues méthodes est considéré comme mauvais style de toute façon. Habituellement, ne devrait pas avoir des méthodes plus d'environ une page. Plus long et ils devraient être refactorisés pour les rendre plus courts. Il y a des moments qui ne sont pas possibles, mais ce n'est presque jamais le cas. – DaEagle

+0

D'accord, mais c'est une méthode très courte. Où voulez-vous dessiner la ligne? Un 3ème, 4ème ou 5ème point de retour? Peut-être même un 16? C'est une chose subjective (le style est toujours) et cela dépend aussi des circonstances. Je pense que 2 points de retour sont ok dans la bonne situation, mais plus que cela devient indéfinissable –

+0

Toute limite numérique sur les retours au-dessus de 1 conduira à un code de sortie précoce méchant "if (this || that || theother) return false;", au lieu d'avoir trois lignes distinctes de sortie précoce pour les trois choses qui peuvent causer une sortie anticipée. Je préférerais de loin maintenir ce dernier que le premier. –

7

Qu'en est-

return i == 5; 
+0

Je pense que cela n'aurait pas illustré le "style de programmation" question qu'il essayait de augmenter, mais +1 pour la réponse la plus optimisée. –

+0

la réponse la plus optimisée aurait été "return true"; parce que l'OP utilisé le classique "if (i = 5)" vs "if (i == 5)" (fixe) – BCS

+0

J'ai remarqué que :) Je pensais que parce que la langue n'a pas été spécifiée, je ne serais pas accroché là-dessus! – DaEagle

6

Il y a plusieurs points de vue à ce sujet. Je pense que la plupart des gens (y compris moi) ont tendance à préférer revenir dès que vous avez une réponse et qu'il n'y a plus de travail à faire. Certaines personnes diront que vous devriez seulement revenir à la dernière déclaration d'une méthode. Cependant, cela peut rendre les choses plus compliquées dans certaines situations.

Allant par ce que je l'ai suggéré, votre exemple serait plus court et plus simple:

public bool ifelse(int i) 
{ 
if(i == 5) 
{ 
return true 
} 
return false 
} 
+0

+1 pour répondre à la question générale. –

0

Je dirais que si vous devez revenir en général que d'une méthode en deux endroits - à proximité du début (comme dans la garde conditions) et près de la fin; Si la méthode a une longueur quelconque, vous devez utiliser une variable temporaire comme vous l'avez mentionné, sinon les personnes lisant le code peuvent avoir plus de mal à le suivre.

5

Si b n'est utilisé que pour calculer la valeur de retour de votre méthode, vous devez alors en faire une variable locale (définie dans la méthode).

public bool ifelse(int i) 
{ 
    bool b; 
    /* 
    Some code to calculate b 
    */ 
    return b; 
} 

Comme d'autres l'ont suggéré, si votre méthode est simple j'éviter d'utiliser une variable temporaire et tout à fait revenir dès qu'il le résultat est connu. Une règle générale consisterait à utiliser la méthode la plus facile à lire.

+0

+1 ici. Les variables doivent avoir la plus petite portée nécessaire. – Jimmy

0

Comme nous l'avons souligné, avoir plus d'une instruction de retour a pour inconvénient de les trouver difficiles. OTOH dans certains cas, la logique supplémentaire nécessaire pour échapper à cette déclaration de retour est pire que le problème que le style résout.

Le problème majeur que je suis conscient de plusieurs retours est que vous pouvez rapidement oublier de faire un peu de nettoyage ou un traitement similaire à un nouveau point de retour. À mon humble avis ceci est tout aussi un problème avec le formulaire de retour unique, car le chemin d'échappement doit se rappeler d'inclure ce code et aucun autre code. Une solution à ceci, disponible dans quelques langages comme C#, est le bloc finally ou c'est plus net le scope statement comme démontré here.(OK, je vais obtenir de ma boîte à savon maintenant)

Questions connexes