Spazi o tabulazioni?

Cosa usare nel mio codice sorgente?

Scritto da Roberto Rossi il 11-2019

Oggi parliamo di come scrivere il codice sorgente. In particolare vorrei affrontare un tema un po "spinoso", l'uso degli spazi e delle tabulazioni.

Cerchiamo di capire cosa sia meglio utilizzare durante la scrittura dei nostri software, qualsiasi sia il linguaggio che utilizziamo (o quasi).

La differenza tra uno spazio e una tabulazione

Uno spazio. Il "carattere" spazio è... un singolo spazio. Tutti, scrivendo qualsiasi tipo di testo abbiamo usato gli spazi.

Gli spazi hanno una caratteristica molto interessante. La loro dimensione, rispetto agli altri caratteri, è costante.

Ad esempio. Supponiamo di avere la frase "Hello World" e supponiamo di utilizzare Notepad (Blocco Note) come editor di testo. Questa frase contiene uno singolo spazio. Per via del fatto che il nostro spazio ha una dimensione costante rispetto al resto del testo ciò che vedremo ha un aspetto costante.

Se io aggiungessi uno spazio in più tra le due parole l'aspetto del testo cambierebbe in modo assolutamente prevedibile, la distanza tra le parole, semplicemente, raddoppierebbe.

Ecco "Hello  World" con due spazi.

Come vedremo più avanti questo comportamento, costante e prevedibile, ci tornerà utile.

Ma veniamo al carattere tabulazione (⭾).

Il carattere tabulazione è un carattere speciale che permette di inserire uno spazio(non un carattere spazio) variabile per gestire l'incolonnamento del testo.

Facciamo un esempio per chiarire meglio. Supponiamo di stabilire che un carattere di tabulazione valga 3 caratteri normali(spazi compresi). In questo modo, nel nostro testo, ogni 3 caratteri verrà posizionata una tabulazione.

Osserviamo la linea che segue, nella quale le tabulazioni sono settate per utilizzare 3 spazi/caratteri e dove vengono rappresentate, per comodità, con delle frecce(normalmente una tabulazione appare come uno spazio vuoto):

Cosa c'è di diverso rispetto a i normali spazi singoli visti in precedenza? Essendo colonne fisse non tutte le tabulazioni hanno la stessa larghezza, infatti la quarta tabulazione occupa uno spazio diverso rispetto a tutte le altre.

La larghezza massima che occupa una tabulazione dipende dall'impostazione dell'editor di testo, il programma, che stiamo utilizzando.

Cosa usare? Spazi o tabulazioni?

La risposta a queste domande, per quando mi riguarda, è semplice e definitiva. Utilizzare sempre e solo spazi singoli!

E ora vediamo il perchè. Perchè bisogna usare gli spazi e mai le tabulazioni?

Iniziamo dicendo che, praticamente, tutti gli editor di testo utilizzati da chi sviluppa software consentono l'uso di testi a spaziatura fissa. Ciò significa che tutti i caratteri scritti avranno la stessa larghezza, quindi la dimensione orizzontale di "W" sarà uguale a quella di "i".

L'uso di una spaziatura fissa facilita molto gli allineamenti e gli incolonnamenti a prescindere da tabulazioni e spazi.

Fatta questa premessa parliamo di spazi.

Vediamo un esempio di codice sorgente scritto utilizzando solo spazi (solo singoli caratteri spazio), senza caratteri tabulazione:

Solo spazi

Cos'ha di speciale questo codice? Ci sono alcune osservazioni da fare:

  1. Semplicemente osservando il testo si può facilmente capire che ogni livello di indentazione, ogni livello di incolonnamento, ogni rientro, è formato da 4 spazi.
  2. Se aprissi questo codice con un editor di testo diverso da quello usato nell'esempio la forma, la struttura e gli allineamenti del testo non cambierebbero. Questo indipendentemente dalla configurazione dell'editor stesso.
  3. Se volessi incolonnare diversamente il testo dovrei solamente aggiungere o togliere spazi (i singoli caratteri spazio).

Il punto 1 è molto importante in quanto ci permette di avere un'idea dello standard di indentazione utilizzato da chi sviluppa il software che stiamo osservando e ci consente di proseguire allo stesso modo mantenendo una organizzazione ordinata del codice.

L'importanza del punto 2 è evidente. Perchè mai usando un editor diverso o una configurazione differente dovrei trovarmi una disposizione del testo diversa? Questo creerebbe solo confusione, soprattutto nel caso in cui il codice venga modificato e/o verificato da altri, magari su altri sistemi operativi e/o con altri editor di testo.

Per quanto riguarda il punto 3, per quale motivo dovrei usare caratteri diversi per rappresentare degli spazi vuoti? Non basta un solo carattere? Uno solo per qualsiasi tipo di spazio.

Ma facciamo finta che tutto ciò non mi convinca. Facciamo finta che a me piacciano le tabulazioni.

Vediamole queste tabulazioni. Ecco lo stesso codice sorgente precedente con le tabulazioni:

Solo spazi

E' uguale? Si è proprio uguale. Sostituendo gli spazi ed inserendo le tabulazioni apparentemente ottengo la stessa cosa.

E qui nasce il primo problema. Guardando il testo è impossibile capire dove sono i singoli spazi(se ci sono) e dove sono state investite le tabulazioni. Ciò mi impedisce di capire cosa usare. Proprio per risolvere questo problema molti editor di testo permettono di vedere le tabulazioni, ad esempio sotto forma di frecce:

Solo spazi

A questo punto qualcuno potrebbe pensare che il vederle o meno non ha alcuna importanza. Be, è un errore. L'importanza di capire se vengano usate tabulazioni o spazi è vitale, infatti è indispensabile per comprendere come poter aggiungere o modificare il codice sorgente.

E qui arriviamo a un fatto importantissimo. Cosa succede se si mischiano tabulazioni e spazi? Diciamo subito che succede un casino. Alla lunga, il testo in un file misto spazi/tabulazioni diventerà sempre più difficile da allineare.

Esempi

Ma facciamo qualche esempio per capire le difficoltà che si incontrano nell'uso delle tabulazioni.

Partiamo guardando il nostro sorgente iniziale, con tante "belle" tabulazioni, con l'editor di testo configurato per rappresentare una tabulazione come 4 spazi:

Solo spazi

Fino qui tutto bene.

Portiamo ora il nostro sorgente in un editor configurato con le tabulazioni rappresentate come 3 spazi:

Solo spazi

Cosa vediamo? Alla riga 54 il nome della variabile makeReadKey non è piu allineato con la variabile sulla riga precedente, allo stesso modo le linee 73 e 74 non sono più allineate correttamente alla linea 72.

Nonostante il programma scritto continui a funzionare, quello che sto guardando non è quello che è stato scritto inizialmente.

Ma andiamo avanti. Proviamo a vedere il nostro sorgente in un editor configurato con le tabulazioni rappresentate come 2 spazi:

Solo spazi

Anche in questo caso abbiamo un problema alla linea 54 e abbiamo il problema sulle linee 73 e 74. A ciò si aggiunge un disallineamento dei caratteri "=" tra la linea 69 e la 70.

Se in una di queste situazioni, il programmatore di turno non si accorgesse della presenza delle tabulazioni e aggiungesse degli spazi singoli per correggere gli allineamenti? Sul suo editor tutto funzionerebbe... ma poi... si aggiungerebbe disordine al disordine... casino!

Ovviamente, questo effetto è tanto più grave quanto più è lungo e complesso il codice sorgente.

Quali sono le mie conclusioni?

Direi che le conclusioni sono ovvie.

Per evitare qualsiasi tipo di problema legato a configurazioni, interpretazioni, sviste, la soluzione più conveniente è quella di usare sempre e solo singoli spazi, dimenticandosi delle tabulazioni.

Un sorgente formattato usando gli spazi arriverà a chiunque sempre con la stessa forma, sempre con gli stessi allineamenti. A quel punto proseguire il lavoro altrui(ma anche il nostro) sarà molto più semplice e sicuro.

E se qualcuno ancora non è convinto, sappiate che non sono l'unico ad avere una predilezione per gli spazi al posto delle tabulazioni.

Nella Google C++ Style Guide troviamo:

"Do not use tabs in your code."

Nella C# Coding Conventions di Microsoft troviamo:

"tabs saved as spaces"

Se poi osserviamo le statistiche di 400.000 repositories su GitHub vedremo come l'uso degli spazi sia prevalente.

Credo non ci sia altro da aggiungere. O no?

Per qualsiasi commento non esitate a scrivermi.

Riferimenti

Il file utilizzato negli esempi è scaricabile cliccando qui.

L'editor di testo utilizzato in questa articolo è SciTE.

Ecco alcuni articoli sull'argomento:

Licenza di questo articolo

Autore : Roberto Rossi

Licenza Creative Commons
Questo articolo è distribuito con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.