Pourquoi éviter les tabulations?

« Tabs and spaces have different semantic meanings. Spaces mean "I am indenting this code" while tabs mean "I am a monster" » – Leon Bambrick (source)

Tel que mentionné dans l'article expliquant comment choisir une police pour le code, il est important de faire en sorte que la disposition du code reflète sa structure, d'où l'importance de l'indentation et du respect des standards de votre école ou de votre entreprise.

On me demande fréquemment pourquoi je demande aux gens d'éviter les tabulations dans le code et d'utiliser des espaces pour appliquer les règles de disposition et d'indentation. La raison est très simple : les tabulations ne sont pas fiables pour cette tâche.

En effet, dans un monde idéal, chaque tabulation sur une ligne d'un programme serait le signe d'un niveau hiérarchique :

En pratique, le sens donné à une tabulation varie fortement d'un éditeur à l'autre, et la disposition du code en souffre énormément lorsque le code écrit avec un outil de développement est consulté avec un autre. Ceci s'applique aussi au niveau du courriel et d'opérations de mise en forme avec un éditeur de documents.

Ce problème est plus apparent encore lorsque le code comprend des opérations sur plusieurs lignes (comme l'affichage à droite) et est disposé de manière manuelle.

La ligne débutant par cout se place habituellement bien avec une tabulation, mais la disposition des lignes subséquentes nécessite un peu de positionnement manuel.

//
// Exemple 0
//
#include <iostream>
int main() {
   using namespace std;
   cout << "Bonjour "
        << "les amis"
        << endl;
}

Ne se fier que sur des tabulations rend la disposition de l'exemple 0 impossible à réaliser de manière générale. La tabulation place cout à l'équivalent de 3 espaces de la marge de gauche, mais les les lignes qui suivent sont placées à l'équivalent de 5 espaces de la première tabulation.

Une tabulation équivalente à 3 espaces donnerait plutôt le code de l'exemple 1.

//
// Exemple 1
//
#include <iostream>
int main() {
   using namespace std;
   cout << "Bonjour "
      << "les amis"
      << endl;
}

Cette situation est très dépendante de l'opération initiale. Une addition sur plusieurs lignes avec des noms de variables un peu longs entraînerait un besoin complètement différent du point de vue de la disposition du code.

Le code de l'exemple 2, proposé à droite, montre l'impact de cette situation. Avec des tabulations, le concept de disposition respectant la hiérarchie du code devient impossible. Notez d'ailleurs que cin et cout ne comportent pas le même nombre de lettres, ce qui met en relief la difficulté d'appliquer une disposition correcte du code à l'aide de tabulations seulement.

//
// Exemple 2
//
#include <iostream>
int main() {
   using std::cin;
   int resultat,
       operandeA,
       operandeB;
   cin >> operandeA
       >> operandeB;
   resultat = operandeA +
              operandeB;
}

Une stratégie pour s'en sortir avec des tabulations seules tout en maintenant la structure hiérarchique est d'appliquer une disposition arborescente comme celle proposée dans l'exemple 3, à droite.

Cette stratégie, bien qu'il soit possible de l'appliquer de manière raisonnée et raisonnable, ne plaira pas à toutes ou à tous. Se voir imposer une stratégie de disposition pour la seule raison du choix de la tabulation plutôt que des espaces constituera sans doute un irritant aux yeux de plusieurs.

//
// Exemple 3
//
#include <iostream>
int main() {
   using namespace std;
   int resultat,
       operandeA,
       operandeB;
   cout
      << "Bonjour "
      << "les amis"
      << endl;
   cin
      >> operandeA
      >> operandeB;
   resultat =
      operandeA +
      operandeB;
}

Certains éditeurs de code disposent le code pour vous à l'aide de ce qu'ils appellent une tabulation intelligente. C'est une idée fort sympathique, mais qui a le grave problème de ne pas donner le même résultat d'un éditeur à l'autre (par définition) et, par conséquent, de nous laisser avec le problème original.

Le résultat de cette variation est que du code indenté à l'aide de tabulations hérite d'une disposition dont la valeur est strictement locale. C'est une mauvaise stratégie pour demander de l'aide ou migrer d'un outil à l'autre.

Lectures complémentaires

Quelques liens pour enrichir le propos.


Valid XHTML 1.0 Transitional

CSS Valide !