Notre code doit ĂȘtre aussi propre et lisible que possible.
Câest en fait un art de la programmation â prendre une tĂąche complexe et la coder de maniĂšre correcte et lisible par lâhomme. Un bon style de code aide grandement Ă cela.
Une chose Ă aider est le bon style de code.
Syntaxe
Voici un aide-mémoire avec quelques rÚgles suggérées (plus de détails ci-dessous) :
Discutons maintenant des rÚgles et de leurs raisons en détail.
Rien nâest figĂ© ici. Ce sont des prĂ©fĂ©rences de style, pas des dogmes religieux.
Accolades
Dans la plupart des projets JavaScript, les accolades sont Ă©crites sur la mĂȘme ligne que le mot clĂ© correspondant, et non sur la nouvelle ligne, dans un style dit «égyptien». Il y a aussi un espace avant un crochet dâouverture.
Comme ceci :
if (condition) {
// fait ceci
// ...et cela
// ...et cela
}
Une construction sur une seule ligne, comme if (condition) doSomething(), est un cas important. Devrions-nous utiliser des accolades ?
Voici les variantes annotées pour que vous puissiez juger de leur lisibilité :
- đ Les dĂ©butants font parfois cela. Câest une mauvaise pratique ! Les accolades ne sont pas nĂ©cessaires :
if (n < 0) {alert(`Power ${n} is not supported`);} - đ Lorsque vous nâutilisez pas dâaccolades, Ă©vitez de passer pas Ă la ligne car il est facile de se tromper :
if (n < 0) alert(`Power ${n} is not supported`); - đ Ne pas utiliser dâaccolade sur une seule ligne, est acceptable tant que cela reste court :
if (n < 0) alert(`Power ${n} is not supported`); - đ Voici une bonne maniĂšre de faire :
if (n < 0) { alert(`Power ${n} is not supported`); }
Pour un code tres court, une ligne est autorisée, par exemple if (cond) return null. Mais la variante numéro 4 est généralement plus lisible.
Longueur de la ligne
Personne nâaime lire une longue ligne horizontale de code. La meilleure pratique est de la scinder.
Par exemple :
// les guillemets backtick ` permettent de scinder la chaĂźne de caractĂšres en plusieurs lignes
let str = `
ECMA International's TC39 is a group of JavaScript developers,
implementers, academics, and more, collaborating with the community
to maintain and evolve the definition of JavaScript.
`;
Et pour les déclarations if :
if (
id === 123 &&
moonPhase === 'Waning Gibbous' &&
zodiacSign === 'Libra'
) {
letTheSorceryBegin();
}
La longueur de ligne maximale est convenue au niveau de lâĂ©quipe. Câest gĂ©nĂ©ralement 80 ou 120 caractĂšres.
Indentations
Il existe deux types dâindentations :
-
Un retrait horizontal : 2 ou 4 espaces.
Une indentation horizontale est faite en utilisant 2 ou 4 espaces ou le symbole horizontal de tabulation (touche Tab). Lequel choisir est une vieille guerre sainte. Les espaces sont plus communs de nos jours.
Un des avantages des espaces sur les tabulations est quâils permettent des configurations de retrait plus flexibles que le symbole tabulation.
Par exemple, nous pouvons aligner les arguments avec la parenthĂšse dâouverture, comme ceci :
show(parameters, aligned, // 5 espaces Ă gauche one, after, another ) { // ... } -
Un retrait vertical: lignes vides pour fractionner le code en blocs logiques.
MĂȘme une seule fonction peut souvent ĂȘtre divisĂ©e en blocs logiques. Dans lâexemple ci-dessous, lâinitialisation des variables, la boucle principale et le retour du rĂ©sultat sont fractionnĂ©s verticalement :
function pow(x, n) { let result = 1; // <-- for (let i = 0; i < n; i++) { result *= x; } // <-- return result; }InsĂ©rez une nouvelle ligne oĂč cela aide Ă rendre le code plus lisible. Il ne devrait pas y avoir plus de neuf lignes de code sans indentation verticale.
Un point-virgule
Un point-virgule doit ĂȘtre prĂ©sent aprĂšs chaque dĂ©claration. MĂȘme si cela pourrait Ă©ventuellement ĂȘtre ignorĂ©.
Il y a des langages oĂč le point-virgule est vraiment optionnel. Il est donc rarement utilisĂ©. Mais dans JavaScript, il y a peu de cas oĂč un saut de ligne nâest parfois pas interprĂ©tĂ© comme un point-virgule. Cela laisse place Ă des erreurs de programmation. Plus dâinformations Ă ce sujet dans le chapitre Structure du code.
Si vous ĂȘtes un programmeur JavaScript expĂ©rimentĂ©, vous pouvez choisir un style de code sans point-virgule comme StandardJS. Autrement, il est prĂ©fĂ©rable dâutiliser des points-virgules pour Ă©viter les piĂšges possibles. La majoritĂ© des dĂ©veloppeurs mettent des points-virgules.
Niveaux dâimbrications
Il ne devrait pas y avoir trop de niveaux dâimbrication.
Par exemple, dans une boucle, câest parfois une bonne idĂ©e dâutiliser la directive âcontinueâ pour Ă©viter une imbrication supplĂ©mentaire.
Par exemple, au lieu dâajouter un if imbriquĂ© conditionnel comme ceci :
for (let i = 0; i < 10; i++) {
if (cond) {
... // <- un autre niveau d'imbrication
}
}
Nous pouvons écrire :
for (let i = 0; i < 10; i++) {
if (!cond) continue;
... // <- pas de niveau d'imbrication supplémentaire
}
Une chose similaire peut ĂȘtre faite avec if/else et return.
Par exemple, les deux constructions ci-dessous sont identiques.
Le premier :
function pow(x, n) {
if (n < 0) {
alert("Negative 'n' not supported");
} else {
let result = 1;
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
}
Et ceci :
function pow(x, n) {
if (n < 0) {
alert("Negative 'n' not supported");
return;
}
let result = 1;
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
Le second est plus lisible, parce que le âcas marginalâ de n < 0 est traitĂ© tĂŽt. Une fois la vĂ©rification effectuĂ©e, nous pouvons passer au flux de code âprincipalâ sans avoir besoin dâimbrication supplĂ©mentaire.
Placement des fonctions
Si vous Ă©crivez plusieurs fonctions âhelperâ (auxiliaires) et le code pour les utiliser, il existe trois façons de les placer.
-
Déclarez les fonctions au-dessus du code qui les utilise :
// fonctions declarations function createElement() { ... } function setHandler(elem) { ... } function walkAround() { ... } // le code qui les utilise let elem = createElement(); setHandler(elem); walkAround(); -
Le code dâabord, puis les fonctions
// le code qui utilise les fonctions let elem = createElement(); setHandler(elem); walkAround(); // --- fonctions helper --- function createElement() { ... } function setHandler(elem) { ... } function walkAround() { ... } -
Mixte : une fonction est dĂ©crite lĂ oĂč elle a Ă©tĂ© utilisĂ©e pour la premiĂšre fois.
La plupart du temps, la deuxiÚme variante est préférée.
Câest parce quâen lisant du code, nous voulons dâabord savoir ce quâil fait. Si le code commence en premier, il devient clair dĂšs le dĂ©but. Ensuite, nous nâaurons peut-ĂȘtre pas besoin de lire les fonctions du tout, surtout si leur nom dĂ©crit ce quâelles font rĂ©ellement.
Guides de style
Un guide de style contient des rĂšgles gĂ©nĂ©rales sur âcomment Ă©crireâ du code. Exemple : les quotes Ă utiliser, le nombre dâespaces pour indenter, la longueur de ligne maximale, etc. Beaucoup de petites choses.
Lorsque tous les membres dâune Ă©quipe utilisent le mĂȘme guide de style, le code est uniforme. Peu importe qui lâa Ă©crit, câest toujours le mĂȘme style.
Bien sĂ»r, une Ă©quipe peut toujours Ă©crire son propre guide de style, mais cela nâest gĂ©nĂ©ralement pas nĂ©cessaire. Il existe de nombreux guides existants Ă choisir.
Par exemple :
- Google JavaScript Style Guide
- Airbnb JavaScript Style Guide
- Idiomatic.JS
- StandardJS
- (il y en a plus)
Si vous ĂȘtes un dĂ©veloppeur novice, commencez par le cheatsheet au dĂ©but de ce chapitre. Ensuite, vous pouvez parcourir dâautres guides de style pour trouver plus dâidĂ©es et dĂ©cider lequel vous prĂ©fĂ©rez.
Linters automatisés
Les linters sont des outils permettant de vĂ©rifier automatiquement le style de votre code et de formuler des suggestions dâamĂ©lioration.
Ce qui est gĂ©nial avec eux, câest que la vĂ©rification du style trouve Ă©galement des bugs, comme une faute de frappe dans une variable ou un nom de fonction. En raison de cette fonctionnalitĂ©, lâutilisation dâun linter est recommandĂ©e mĂȘme si vous ne souhaitez pas vous en tenir Ă un âstyle de codeâ particulier.
Voici quelques linters bien connus :
- JSLint â lâun des premiers linters.
- JSHint â plus de paramĂštres que JSLint.
- ESLint â probablement le plus rĂ©cent.
Tous peuvent faire le travail. Lâauteur utilise ESLint.
La plupart des linters sont intĂ©grĂ©s aux Ă©diteurs: il suffit dâactiver le plug-in dans lâĂ©diteur et de configurer le style.
Par exemple, pour ESLint, vous devez procéder comme suit :
- Installer Node.js.
- Installer ESLint avec la commande
npm install -g eslint(npm est un gestionnaire de paquets JavaScript). - Créez un fichier de configuration nommé
.eslintrcdans la racine de votre projet JavaScript (dans le dossier contenant tous vos fichiers). - Installez / activez le plug-in pour votre Ă©diteur qui sâintĂšgre Ă ESLint. La majoritĂ© des Ă©diteurs en ont un.
Voici un exemple de .eslintrc:
{
"extends": "eslint:recommended",
"env": {
"browser": true,
"node": true,
"es6": true
},
"rules": {
"no-console": 0,
"indent": 2
}
}
Ici, la directive "extends" indique que nous nous basons sur lâensemble de paramĂštres âeslint:recommendedâ, puis nous spĂ©cifions les nĂŽtres.
Il est aussi possible de tĂ©lĂ©charger des ensembles de rĂšgles de style Ă partir du Web et de les Ă©tendre. Voir http://eslint.org/docs/user-guide/getting-started pour plus de dĂ©tails sur lâinstallation.
De plus, certains IDE prennent en charge le linting nativement, ce qui peut Ă©galement ĂȘtre bien, mais pas aussi ajustables que ESLint.
Résumé
Toutes les rÚgles de syntaxe de ce chapitre et les guides de style visent à améliorer la lisibilité, elles sont donc toutes discutables.
Lorsque nous pensons Ă Ă©crire du âmeilleurâ code, les questions que nous devrions nous poser sont les suivantes : âQuâest-ce qui rend le code plus lisible et plus facile Ă comprendre ?â et âQuâest-ce qui peut nous aider Ă Ă©viter les erreurs ?â. Telles sont les principales choses Ă garder Ă lâesprit lors du choix et du dĂ©bat sur les styles de code.
Lisez les guides de style pour connaßtre les derniÚres idées à ce sujet et suivez celles que vous trouvez les meilleures.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâŠ)