web-dev-qa-db-fra.com

La déclaration «si» devrait-elle toujours avoir une clause «sinon»?

Il peut s'agir d'un argument religieux, mais il a été débattu ad-nauseum ici dans mon travail de savoir si toutes les déclarations IF devraient inclure une clause ELSE - même si la clause ELSE ne contient qu'un commentaire indiquant qu'elle a été `` intentionnellement laissée en blanc ''.

J'ai entendu des arguments des deux côtés: le camp "pour" - garantit que les codes ont réellement déterminé si la condition nécessite une clause ELSE le camp "contre" - le code est plus difficile à lire, ajoute trop de bruit

Je suis intéressé par tout autre point de vue car je dois résoudre ce débat avec une réponse qui satisferait les deux parties.

Merci de votre aide.

BTW: J'ai cherché dans StackOverflow une réponse à cette question et je n'ai pas pu en trouver une. S'il y en a un, il suffit d'inclure un lien vers celui-ci et de le fermer. Merci.

60
Jack

Cela me semble inutile de taper ... et une cause possible de confusion. Si vous n'en avez pas besoin, ne le mettez pas!

136
jldupont

Non. Si vous n'avez pas besoin d'exécuter de code du côté else, vous n'avez pas besoin d'une clause else.

46
Robert Harvey

Il est clair par les réponses ici que personne ne sent qu'un autre inutilisé est nécessaire. Je n'ai jamais entendu ni lu une telle chose. La question la plus importante devant vous est de traiter avec des collègues/développeurs qui croient d'une manière ou d'une autre catégoriquement que c'est la façon dont If Then doit être utilisé.

Il semble que vous ne soyez pas la personne la plus âgée dans ce scénario, vous ne pouvez donc pas simplement le décréter. Je suggère de demander aux parties "vides d'autre" de montrer où un tel processus est suggéré dans un livre (les blogs ne comptent pas) sur le développement. Mieux encore, dans 3 livres sur le développement. J'ai lu ma part de livres de programmation dans tous les langages de programmation depuis 1982 et je n'ai jamais vu une telle suggestion.

De cette façon, vous ne leur dites pas qu'ils ont tort qu'ils pourraient prendre personnellement. Au lieu de cela, vous êtes prêt à accepter un tel poste, mais souhaitez voir de la documentation. Il leur incombe de trouver la preuve. Soit ils le trouvent, soit ils doivent argumenter que chaque livre de programmation jamais écrit est faux alors qu'ils sont les seuls à avoir raison.

Bonne chance.

32
dredful

La règle d'or: mettez-le si cela rend votre code plus clair et plus facile à comprendre, et laissez-le autrement. Un programmeur expérimenté sera en mesure de faire ces jugements au cas par cas.

15
Tim

Parlez-vous des langues dérivées d'ALGOL?

Dans LISP, je dirais oui: chaque FI devrait avoir une clause else. Sinon, vous devez utiliser QUAND.

14
Ken

Comme vous le dites, cela peut être une question de style, mais je ne rêverais pas de mettre des blocs else vides dans mon code simplement parce que "chaque bloc if devrait en avoir un". À mon avis, cela n'ajoute rien d'autre que quelques caractères supplémentaires dans le code et un point de plus (de très peu de valeur) pour passer du temps lors des révisions de code.

11
Fredrik Mörk

J'ai tendance à utiliser les instructions "early if" comme moyen de réduire le niveau des accolades imbriquées (ou indentation en Python) comme ceci:

if (inParam == null) {
  return;
}

if (inParam.Value < 0) {
  throw new ArgumentException(...,...);
}
// Else ... from here on my if statements are simpler since I got here.

Bien sûr, .Net 4.0 a maintenant des contrats de code, ce qui est génial! Mais, la plupart des langages ne l'ont pas encore, donc les "ifs précoces" (faute d'un meilleur terme) sont excellents précisément parce qu'ils éliminent un certain nombre de clauses else et des ifs imbriqués. Je ne pense pas qu'il soit avantageux d'avoir une clause else dans les langages de haut niveau ... diable, même en Assemblée! L'idée est: si vous avez vérifié et n'avez pas sauté, alors la condition était fausse et nous pouvons continuer. Est logique pour moi ...

EDIT: Consultez également cet article pour voir pourquoi les clauses else ne sont pas d'une grande utilité: http: // www.codinghorror.com/blog/2006/01/flattening-arrow-code.html

8
Hamish Grubijan

Exiger un else pue. Utilisez-le en cas de besoin. Tous les programmeurs comprennent la construction et l'implication d'un else manquant. C'est comme un commentaire inutile qui fait écho au code. C'est tout simplement stupide IMO.

8
spender

Non. Les conditions de garde sont un excellent exemple. Vous pouvez imbriquer le reste de la logique de la méthode dans des clauses else, mais cela pourrait devenir très rapidement très laid.

6
peacedog

"garantit que les codes ont effectivement permis de déterminer si la condition requiert une clause ELSE"

Cela n'est pas plus vrai que d'exiger une clause catch dans chaque méthode garantit que toutes les exceptions possibles ont été correctement gérées.

6
Michael Petrotta

SQL Server 2000, 2005 au moins.

IF 1 = 1
BEGIN
    PRINT 'doing something productive'
END
ELSE
BEGIN
    --Just sitting here
END


Msg 102, Level 15, State 1, Line 8
Incorrect syntax near 'END'.

Vous devez avoir une déclaration significative, ce qui signifie une assignation fictive ou un retour de données au client. Je suppose que je pourrais utiliser WAITFOR DELAY ...

4
gbn
if (thereIsSomeThingToDoInTheElse)
{
    putAnElseClause();
}
else
{
    // intentionally left blank
}
4
JoelFan

Avoir un "autre" avec juste une ligne vide d'un commentaire de code peut généralement signifier que le développeur a réfléchi à la condition et a une meilleure idée du chemin d'exécution réellement pris à un moment donné. Tous les compilateurs récents supprimeront le "else" et le commentaire, donc vous ne ralentissez pas l'exécution du logiciel.

À moins que je ne lise mal les autres réponses, il semble que la plupart des gens s'opposent au temps qu'il faut pour déclarer leurs pensées dans le code et préfèrent simplement le faire.

3
Snowy

Le if de Haskell est toujours ternaire. Le reste est donc obligatoire.

3
Hai

il y a beaucoup de "mots" qui vous indiquent le chemin de la programmation comme DRY

dans ce cas, j'utiliserais YAGNI .. tu ne vas pas en avoir besoin ..

donc après cela, vous ne devriez pas écrire le reste.

de toute façon, à mon avis, il est plus difficile de lire et de comprendre le code .. plus vous écrivez, plus il est difficile de comprendre le code

edit: voici les liens que vous avez demandés: http://en.wikipedia.org/wiki/YAGNIhttp://en.wikipedia.org/wiki/Don%27t_repeat_yourself =

2
Dimitri

Si votre code est suffisamment complexe pour que cela devienne un problème, vous devriez probablement repenser votre approche du problème. Décomposez ce que vous faites en petites fonctions plus simples où il devrait être incroyablement évident de savoir ce que font les instructions if.

Si vous ne pouvez pas le décomposer en fonctions plus petites, ou si vous vous trouvez en imbriquer plus d'une instruction if dans une autre, l'utilisation d'instructions if pour votre logique conditionnelle ne convient probablement pas. Considérez des commutateurs, des tables de recherche (si la seule différence entre vos conditions est la valeur d'une constante) ou des tables de décision à la place.

Si vous avez déjà fait tout cela, alors vous chicanez sur quelque chose de si incroyablement trivial que cela ne vaut pas la peine de discuter.

2
Breton

L'une des rares situations possibles où cela pourrait être une bonne idée est celle où vous avez plusieurs instructions if imbriquées, mais moins de clauses else. La langue spécifiera à quelle if la else correspond, mais cela peut ne pas toujours être clair pour le lecteur. Bien sûr, lorsque vous mettez du contenu entre accolades, l'imbrication sera évidente, il n'y a donc aucune ambiguïté. Cela en fait un peu un cas artificiel, mais qui mérite peut-être d'être mentionné. De plus, si votre code est aussi compliqué, il existe probablement une façon plus claire de l'écrire.

2
Tim

Il existe des situations où l'utilisation d'un élément de syntaxe facultatif lorsqu'il n'est pas nécessaire peut améliorer la lisibilité ou empêcher de futures erreurs. Un cas typique sont les crochets autour des conditions d'une phrase:

Faire

if(foo){
    bar
}

au lieu de

if(foo)
    bar

pourrait éventuellement empêcher

if(foo)
    bar
    dot

Je ne peux pas vraiment penser à une langue que je connais où l'omission d'un inutile else peut conduire à des erreurs potentielles: -?

1
Álvaro González