Lorsque l'on fait du traitement de texte il n'est pas rare d'utiliser l'indentation pour mieux organiser son contenu et permettre un meilleur compréhension visuelle de la structure du document. Ce procédé typologique sera aussi utile en programmation pour simplifier la compréhension. Par exemple ce code HTML est difficilement lisible sans indentation :
<section>
<h1>Ceci est un titre</h1>
<ul>
<li><strong>PHP</strong>, PSR "Code MUST use 4 spaces for indenting."</li>
<li><strong>JavaScript</strong>, Prettier 2 espaces</li>
<li><strong>Python</strong>, PEP8 "Use 4 spaces per indentation level."</li>
<li><strong>Golang</strong>, Tab</li>
<li><strong>Makefile</strong>, Tab</li>
</ul>
<p class="small">
<a href="http://www.opimedia.be/DS/languages/tabs-vs-spaces/">The Bible of Tabs vs Spaces Holy War</a>
</p>
</section>
Et avec l'indentation les choses sont plus simples à comprendre avec une relation parent / enfant plus simple à établir.
<section>
<h1>Ceci est un titre</h1>
<ul>
<li><strong>PHP</strong>, PSR "Code MUST use 4 spaces for indenting, not tabs."</li>
<li><strong>JavaScript</strong>, Prettier 2 espaces</li>
<li><strong>Python</strong>, PEP8 "Use 4 spaces per indentation level."</li>
<li><strong>Linux kernel</strong>, <a href="https://www.kernel.org/doc/html/v4.10/process/coding-style.html">8 espaces</a></li>
<li><strong>Golang</strong>, Tab</li>
<li><strong>Makefile</strong>, Tab</li>
</ul>
<p class="small">
<a href="http://www.opimedia.be/DS/languages/tabs-vs-spaces/">The Bible of Tabs vs Spaces Holy War</a>
</p>
</section>
Cela est aussi vrai lorsque l'on écrit des algorithme en permettant de mieux différencier les blocs (boucles, conditions, fonctions...)
// Sans indentation
for(let i = 0; i < 8; i++) {
for(let j =0; j < 8; j++) {
if((i + j) % 2 === 0) {
console.log({i, j})
}
}
}
// Avec
for(let i = 0; i < 8; i++) {
for(let j =0; j < 8; j++) {
if((i + j) % 2 === 0) {
console.log({i, j})
}
}
}
Mais se pose la problématique du caractère à utiliser pour cette indentation.
Tabulation
Dans un logiciel de traitement de texte le caractère de tabulation permet de faire avancer le curseur jusqu'à une position déterminée. Aussi, il semble logique d'utiliser ce même caractère pour représenter un niveau d'indentation dans notre code.
Mais dans notre code source il n'existe pas de taquets de tabulation et les éditeurs doivent faire un choix sur la taille occupée par le caractère de tabulation. Aussi, un code n'aura pas forcément la même apparence en fonction de l'éditeur utilisé. Cela veut aussi dire que l'on ne peut pas utiliser ce caractère pour gérer l'alignement et il faudra alors utiliser des espaces.
On se retrouve à devoir combiner sur une même ligne des tabulations (pour l'indentation) et des espaces (pour l'alignement).
Espaces
Afin d'éviter ce mélange tabulations / espaces et pour assurer un rendu consistant du code certains développeurs ont choisi d'utiliser plusieurs espaces pour gérer un niveau d'indentation.
Cette approche permet d'avoir un rendu constant et évite de devoir jongler entre plusieurs caractères pour l'indentation et l'alignement, mais a aussi plusieurs inconvénients.
- Il faut utiliser plusieurs caractères pour créer un niveau d'indentation (les éditeurs permettent de le faire automatiquement en appuyant sur la touche Tab)
- Augmente le poids des fichiers sources (peu problématique avec la taille des systèmes de stockage actuels)
- La taille fixe des espaces pose des problèmes d'accessibilité
- On ne peut pas personnaliser le rendu en fonction de ses préférences (ce qui est possible avec une tabulation)
- Sur les claviers brailles, un niveau d'indentation consomme plus de caractères
Quoi choisir ?
Les 2 approches ont donc des avantages et des inconvénients significatifs et il n'est pas facile de trancher entre ces 2 solutions, ce qui mène très souvent à beaucoup de discussion qui ne mènent que rarement à un consensus. Heureusement pour nous, la plupart des langages de programmation disposent de conventions qui vont nous imposer un choix et permette une meilleure cohérence dans les pratiques de développement. Pour en citer quelques-unes :
- PHP, Le PSR indique "Code MUST use 4 spaces for indenting, not tabs."
- JavaScript, le formatteur de code Prettier utilise 2 espaces par défaut
- Python, PEP8 indique "Use 4 spaces per indentation level."
- Linux kernel, 8 espaces
- Golang, le formateur force l'utilisation de tabulation
Comme on peut le voir les conventions changent en fonction du langage mais rassurez-vous, vous n'aurez pas à les retenir car les éditeurs sont aujourd'hui assez intelligents pour adapter leur méthode d'indentation en se basant sur le type de fichier que vous éditez. Aussi, lorsque vous éditez un fichier PHP par exemple, la touche Tab
ajoutera automatiquement 4 espaces, mais si vous êtes sur un fichier Golang cela ajoutera une tabulation.