201 votes

Les accolades sont-elles nécessaires dans les déclarations d'une ligne en JavaScript ?

J'ai entendu dire une fois que laisser les accolades dans les déclarations d'une ligne pouvait être nuisible en JavaScript. Je ne me souviens plus du raisonnement et une recherche sur Google n'a pas été très utile.

Y a-t-il quelque chose qui fasse que ce soit une bonne idée d'entourer toutes les déclarations entre accolades en JavaScript ?

Je pose la question, car tout le monde semble le faire.

6 votes

Remarque : seule la première déclaration prend en charge la portée, même si vous avez plusieurs déclarations sur une ligne, il ne s'agit donc pas de "déclarations d'une ligne" mais plutôt d'une seule déclaration.

2 votes

Vous pensez peut-être au problème décrit dans cette réponse

0 votes

@Blorgbeard : non, j'ai en fait répondu à cette réponse il y a un moment.

239voto

Josh K Points 11621

No

Mais ils sont recommandés. Si jamais vous élargissez la déclaration, vous en aurez besoin.

C'est parfaitement valable

if (cond) 
    alert("Condition met!")
else
    alert("Condition not met!")

Cependant, il est fortement recommandé de toujours utiliser des accolades, car si vous (ou quelqu'un d'autre) étendez un jour la déclaration, elles seront nécessaires.

Cette même pratique se retrouve dans tous les langages de style syntaxique C avec accolades. Le C, le C++, le Java et même le PHP supportent tous les déclarations d'une ligne sans accolades. Vous devez réaliser que vous ne faites qu'économiser deux personnages et avec les styles d'attelles de certaines personnes, on ne gagne même pas une ligne. Je préfère un style d'entretoise complet (comme les suivants), donc il a tendance à être un peu plus long. Le compromis est très bien trouvé avec le fait que la lisibilité du code est extrêmement claire.

if (cond) 
{
    alert("Condition met!")
}
else
{
    alert("Condition not met!")
}

41 votes

+1, réponse informative. Personnellement, je n'ai jamais trouvé utile de faire cette chose "recommandée". Je n'ai jamais codé en python, donc je ne me contente pas d'insérer des choses et de m'attendre à ce que l'indentation compte. Si j'ajoute une déclaration, j'ajoute également des accolades. Toujours. Je ne me souviens pas d'une seule fois où ça m'a fait mal. Pas en C, pas en C#, pas en JavaScript.

18 votes

@Kirk : Douglas Crockford le recommande. Je suis d'accord pour dire que c'est une décision personnelle subjective mais quand on travaille en groupe, il est plus facile de simplement taper les accolades.

2 votes

Je devrais peut-être ajouter que j'ai commencé à utiliser des accolades partout puisque c'est ainsi que le code est censé se présenter sur mon lieu de travail. Et puisque c'est "recommandé", il est peut-être préférable de pratiquer ce que la plupart des gens font plutôt que de suivre son propre chemin juste parce que ça marche pour soi.

105voto

Rudu Points 8641

Il y a un aspect de lisibilité - en ce sens que lorsque vous avez des déclarations composées, cela peut devenir très confus. L'indentation aide mais ne signifie rien pour le compilateur/interprète.

var a;
var b;
var c;

//Indenting is clear
if (a===true)
  alert(a); //Only on IF
alert(b); //Always

//Indenting is bad
if (a===true)
  alert(a); //Only on IF
  alert(b); //Always but expected?

//Nested indenting is clear
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
alert (b); //Always

//Nested indenting is misleading
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
  alert (b); //Always but expected as part of first if?

//Compound line is misleading
//b will always alert, but suggests it's part of if
if (a===true) alert(a);alert(b); 
else alert(c); //Error, else isn't attached

Et puis il y a un aspect extensible :

//Problematic
if (a===true)
  alert(a);
  alert(b); //We're assuming this will happen with the if but it'll happen always
else       //This else is not connected to an if anymore - error
  alert(c);

//Obvious
if (a===true) {
  alert(a); //on if
  alert(b); //on if
} else {
  alert(c); //on !if
} 

L'idée est que si vous avez toujours les crochets, vous savez que vous pouvez insérer d'autres déclarations à l'intérieur de ce bloc.

7 votes

C'est pourquoi nous devrions toujours l'utiliser en une seule phrase : if (a===true) alert(a); . Maintenant c'est clair !

1 votes

L'utilisation de parenthèses à gauche et à droite rend les conditionnels plus clairs. Pour les rêveurs parmi nous, on parle aussi de l'oiseau volant à gauche et à droite.

0 votes

TOUJOURS UTILISER L'INDENTATION AUTOMATIQUE, LES GENS

72voto

peawormsworth Points 156

La question porte sur les déclarations sur une seule ligne. Pourtant, les nombreux exemples fournis montrent des raisons de ne pas omettre les accolades pour les déclarations sur plusieurs lignes. Il est tout à fait possible de ne pas utiliser d'accolades sur une ligne, si c'est le style de codage que vous préférez.

Par exemple, la question demande si cela est acceptable :

 if (condition) statement;

Il ne demande pas si cela est correct :

 if (condition)
   statement;

Je pense qu'il est préférable de ne pas utiliser de parenthèses, car cela rend le code plus lisible, avec moins de syntaxe superflue.

Mon style de codage consiste à ne jamais utiliser de parenthèses, sauf si le code est un bloc. Et de ne jamais utiliser plusieurs instructions sur une même ligne (séparées par des points-virgules). Je trouve cela facile à lire et clair et je n'ai jamais de problèmes de portée sur les instructions "if". Par conséquent, l'utilisation de parenthèses sur une seule déclaration de condition if nécessiterait 3 lignes. Comme ceci :

 if (condition) {
   statement;
 }

Il est préférable d'utiliser une instruction if d'une ligne car elle utilise moins d'espace vertical et le code est plus compact.

Je n'obligerais pas les autres à utiliser cette méthode, mais elle fonctionne pour moi et je ne pourrais pas être plus en désaccord avec les exemples fournis sur la façon dont l'omission des parenthèses entraîne des erreurs de codage/de cadrage.

2 votes

J'ai toujours pensé qu'il fallait toujours inclure un appareil dentaire... mais j'y repense maintenant. Tu as le airbnb un guide de style à vos côtés !

1 votes

Pourtant, vous oubliez que la plupart des formateurs de code le transforment en format à deux lignes et que vous vous retrouvez avec un code problématique. L'argument de l'espace vertical est tout simplement stupide. La lisibilité l'emporte toujours, et les écrans d'aujourd'hui sont énormes.

1 votes

Les deux lignes ajoutées pour chaque parenthèse, pour entourer vos déclarations d'une ligne, ne sont pas un coût important comparé aux dommages potentiels qui peuvent être causés par un développeur - même très prudent - qui maintient votre code. Vous pouvez être vous-même un grand développeur avec des compétences mythiques, mais vous ne pouvez pas supposer que vos collègues le sont. KISS, enveloppez les choses dans un contexte et rendez les choses aussi faciles que possible pour les autres ou vous finirez par avoir des problèmes.

7voto

Chris Lercher Points 22134

En plus de la raison mentionnée par @Josh K (qui s'applique également à Java, C, etc.), un problème particulier en JavaScript est le suivant insertion automatique du point-virgule . D'après l'exemple de Wikipedia :

return
a + b;

// Returns undefined. Treated as:
//   return;
//   a + b;

Donc, cela peut aussi donner des résultats inattendus, si on l'utilise comme ça :

if (x)
   return
   a + b;

Ce n'est pas vraiment mieux d'écrire

if (x) {
   return
   a + b;
}

mais peut-être qu'ici l'erreur est un peu plus facile à détecter ( ?)

0 votes

Tous ces exemples me semblent horribles, à moins que les auteurs soient temporaires et payés à la ligne ou jusqu'à ce que ça marche.

6voto

pault Points 21

C'est une question de style, mais les accolades bouclées sont bonnes pour prévenir d'éventuelles d'autres qui pendent .

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