web-dev-qa-db-fra.com

Maintenance sage, est-ce que «autre tandis que» sans les accolades intervenants considérés comme sûrs?

Est else while Sans les accolades intervenantes considérées comme une maintenance "sûre" sage?

L'écriture if-else code sans accolades comme ci-dessous ...

if (blah)
    foo();
else
    bar();

... Pays un risque car le manque d'accolades facilite la modification de la signification du code par inadvertance.

Cependant, est inférieur à risque?

if (blah)
{
    ...
}
else while (!bloop())
{
    bar();
}

Ou est else while Sans accolades intervenantes considérées comme "sûre"?

26
user541686

Cela me rappelle ce code:

if ( ... ) try {
..
} catch (Exception e) {
..
} else {
...
}

Chaque fois que vous combinez deux types de blocs, oubliez les accolades et non plus d'indentation, vous créez un code très difficile à comprendre et à entretenir.

57
Sulthan

Je voudrais Méthode d'extraction et faites-la

if ( blah )
{
    ...
}
else
{
   newMethod();
}

Voir l'approche "méthode d'extraction" expliquée à catalogue de refactoring Site:

Vous avez un fragment de code qui peut être regroupé.

Tournez le fragment en une méthode dont le nom explique le but de la méthode.

void printOwing() {
    printBanner();

    //print details
    System.out.println ("name:    " + _name);
    System.out.println ("amount    " + getOutstanding());
}

 http://www.refactoring.com/catalog/arrow.gif

void printOwing() {
    printBanner();
    printDetails(getOutstanding());
}

void printDetails (double outstanding) {
    System.out.println ("name:    " + _name);
    System.out.println ("amount    " + outstanding);
}
6
user470365

Qu'est-ce qui a tellement mal avec les accolades que tant de gens essaient d'éviter de les écrire?

Quel problème fait exactement else while résoudre ?

Les accolades sont bon marché et bon, et ils rendent l'intention de code évidente et plaine par opposition à intelligente et spirituelle.

Citant la philosophie UNIX:

Règle de clarté: la clarté est meilleure que l'intelligence.

Étant donné que la maintenance est si importante et si chère, écrivez des programmes comme si la communication la plus importante qu'ils effectuent ne sont pas à l'ordinateur qui les exécute, mais aux êtres humains qui liront et maintiennent le code source à l'avenir (y compris vous-même).

2
Tulains Córdova

J'ai toujours mis des accolades, juste parce que vous pourriez ajouter une autre ligne lorsque vous vous êtes pressé, indentez-le, oubliez les accolades et grattez votre tête ce qui se passe. Je garde le support d'ouverture sur la même ligne, mais cela n'a pas d'importance. Je les deux cas, il vaut mieux les avoir.

if(blah) {
    foo();
}
else {
    bar();
}
2
Tsvetomir Dimitrov

Il n'y a rien de mal à

if (blah)
    foo();
else
    bar();

juste comme s'il n'y a rien de mal avec

if (blah) foo(); else bar();

dans les bonnes circonstances (votre situation peut varier, mais ce style particulier est mieux utilisé lorsque vous avez beaucoup de code répétitif - alors la vue de chaque ligne est plus importante que l'indentation stylistique)

Mais si vous choisissez une façon, conservez-y - la cohérence est roi. Donc, votre deuxième exemple est très mauvais, car l'expression IF avait des crochets pour sa déclaration, la déclaration tandis que la déclaration doit être à l'intérieur des supports de la clause d'enseigne, non pas à l'extérieur.


en outre, j'ai déjà vu ce code:

if (x) foo()
{
  bar();
}

et il a été écrit par la norme de codage Nazi lui-même (qui a insisté sur des supports pour tout).

1
gbjbaanb

Les IDes modernes peuvent facilement être configurés pour reformater (y compris l'élimination ou l'ajout d'accolades inutiles) et/ou réindentifier le code sur la sauvegarde d'un fichier. Ainsi, votre exemple ressemblerait automatiquement par exemple

if (blah) {
  blub();
} else
  while (!bloop()) {
    bar();
  }

L'indentation rend toujours la nidification facilement visible, même sans accolades non ccessioires. Donc, si vous parvenez à appliquer tels IDE Paramètres, je ne vois aucun risque.

Personnellement, je trouve du code qui omet les accolades et les chevrefreaux beaucoup plus lisibles car cela évite l'encombrement:

if (blah) blub();
else while (!bloop()) bar();

Mais bien sûr, de nombreux développeurs sont très heureux de discuter de telles choses pour toujours et une journée.

1
Hans-Peter Störr