Dans de nombreux langages de programmation où l'on pratique l'indentation de blocs de code, comme le C++, le PHP ou le Cobol Vénusien, deux écoles s'affrontent quant à la manière de matérialiser ces indentations : ceux qui indentent avec une succession d'espaces, et ceux qui indentent à l'aide de tabulations. J'appartiens à cette dernière catégorie pour différentes raisons que j'expose ici.
Quand je place une tabulation en début d'un bloc de code, c'est un moyen pour moi de signifier que j'ai une indentation, tout en faisant abstraction de la manière d'afficher cette indentation. J'aurai le respect d'une relation simple : une indentation <--> une tabulation. Je n'aurai pas gérer des fractions d'indentation qui n'ont pas de sens. Je réserve ça à l'ascii-art ^^
Quand on écrit ou quand on lit du code, comment traverser un ou plusieurs niveaux d'indentation à l'aide du clavier ?
Avec un code à espaces, je vais devoir:
Au niveau de la réflexion, et au niveau du geste, il y aura cette perte de temps. Un désagrément faible, certes, mais pourquoi passer par là quand il y a plus direct ? Avec des tabulations, je n'ai pas à déterminer le nombre d'espaces par indentation.
Indépendamment de la représentation qu'en faisait l'auteur, si ce dernier souhaitait signifier deux niveaux d'indentation, il aura mis deux tabulations, et moi je n'aurai qu'à appuyer deux fois sur ma touche fléchée. Je consacre ainsi mon temps, mes neurones et mes articulations à des tâches plus nobles.
Et pour supprimer un ou plusieurs niveaux d'indentation ? Les remarques sont les mêmes que pour traverser du code, mais cette fois-ci en prenant en compte les touches Suppr et Backspace. Suppr, Suppr, Suppr, Suppr, Suppr, Suppr... Backspace, Backspace, Backspace... Zzz... Ai-je pensé à payer mon 3e tiers ?
Certains préfèrent une largeur de 3 EM, d'autres de 4, d'autres de 8... En utilisant des tabulations, je respecte le choix de chaque utilisateur de mon code, qui pourra configurer son éditeur de texte avec sa largeur préférée. En utilisant des espaces, j'imposerais mon choix aux autres, provoquant chez eux frustration, colère et empoisonnement à l'arsenic. On avance plus vite avec une équipe vivante.
En utilisant des espaces, on se retrouve souvent dans le code avec des blocs alignés sur rien, ou des blocs utilisant d'autres nombres d'espaces par indentation (exemple de copier coller d'un code tiers). La perte d'homogénéité sera moins probable avec des tabulations, puisqu'il n'y a aucune chance de placer un bloc sur des fractions d'indentation.
À noter que je ne parle dans ce billet que des indentations de blocs. Je ne parle pas des autres types d'alignements qui ne sont là que pour décorer. À ce titre, l'espace peut être utilisé puisqu'on entre alors dans un domaine purement visuel et non plus sémantique.
En aparté, j'aimerais revenir sur le point « respect des choix de l'utilisateur ». J'entends souvent les partisans de l'indentation par espace défendre leur choix pour exactement cette même raison. On entre alors dans un débat impliquant des aspects liés à la personnalité :
On sort du cadre de l'informatique, pour rejoindre des concepts plus généraux. On ne peut plus se baser ni sur sur logique ni sur la technique, on rentre dans une sphère purement subjective. Dans cette sphère là, j'ai appris à laisser le choix aux gens. J'aime que ma tabulation fasse 4 EM de large mais peu m'importe si Riri, Fifi ou Jean-Pierre utilisent 8 EM. Tout le monde y gagne.
Voilà pourquoi les deux méthodes d'indentation continuent d'exister, une part du choix se basant sur des aspects purement subjectifs.
Quand j'ai débuté à programmer réellement, à la bonne époque de l'assembleur 680x0 sur Amiga, j'avais l'habitude de faire mes indentations à l'aide d'espaces. C'est un programmeur plus expérimenté que moi, avec lequel j'échangeais des disquettes par la poste (pas d'Internet à l'époque !), qui avait l'habitude d'utiliser des tabulations. Pris de curiosité, j'ai commencé à gouter à cette méthode d'indentation, et pour toutes les raisons que j'évoque dans ce billet, je ne suis plus jamais revenu en arrière :)