Lo stile d'indentazione in programmazione informatica è un insieme di regole per la gestione dell'indentazione dei blocchi di codice. Nella maggior parte dei linguaggi, detti in forma libera, l'indentazione non ha un significato sintattico ma viene usata come notazione secondaria per migliorare la leggibilità del codice, rendendo immediatamente visibile al programmatore la struttura dei blocchi che costituiscono il flusso di esecuzione del programma. Alcuni linguaggi di programmazione, come Python o Haskell, usano l'indentazione a livello sintattico per determinare i blocchi senza l'uso di parentesi (off-side rule), per cui in tali linguaggi l'indentazione non è solo una questione stilistica, ma un elemento sintattico a tutti gli effetti.

Tabulazioni, spazi e ampiezza dell'indentazione L'ampiezza usata nell'indentazione è tipicamente dipendente dallo stile. Agli albori della programmazione era comune l'utilizzo di tabulazioni per indentare il codice, in quanto permetteva di risparmiare caratteri e ridurre la dimensione dei sorgenti. Nei sistemi Unix la tabulazione era tipicamente equivalente a otto caratteri, mentre su Macintosh e Microsoft Windows era tipicamente quattro, creando confusione quando i sorgenti venivano trasferiti e visualizzati su sistemi differenti. Gli editor moderni consentono di impostare l'ampiezza della tabulazione e di formattare tabulazioni e spazi automaticamente secondo le impostazioni.

Il mondo della programmazione è diviso nella scelta tra tabulazioni e spazi, che analogamente alla guerra degli editor costituisce una perenne "guerra di religione". Alcuni programmatori, come Jamie Zawinski"Tabs versus Spaces: An Eternal Holy War." by Jamie Zawinski 2000 sostengono che la scelta degli spazi migliori la portabilità del codice tra ambienti e piattaforme differenti, mentre altri, come gli sviluppatori della piattaforma WordPress, sostengono l'opposto. Nella edizione 2015 del Stack Overflow Developer Survey, il dei partecipanti si è espresso a favore delle tabulazioni, contro il a favore degli spazi.

Aspetti pratici Visibilità dei blocchi I programmatori che fanno affidamento sulle parentesi per trovare a colpo d'occhio i blocchi possono essere penalizzati da stili che collocano le parentesi al termine della istruzione precedente, mentre programmatori che si affidano maggiormente all'indentazione possono preferire questi stili in quanto generano blocchi più compatti verticalmente.

In alcuni casi può diventare difficile mantenere traccia visuale dell'estensione dei blocchi di codice, specie in grandi sezioni di codice con molte istruzioni composite annidate, che generano molti livelli di indentazione, che portano le estremità dei blocchi fuori dal campo visivo dell'editor e fanno perdere l'orientamento. Questo può essere sintomo di scarsa qualità del codice ed eccessiva complessità ciclomatica, da correggere tramite refactoring, scomponendo le funzioni troppo grandi in diverse funzioni più piccole e leggibili. Analogamente, un elevato numero di livelli di indentazione può spostare il codice a destra e renderlo poco leggibile, ed è tipicamente anch'esso sintomo della necessità di refactoring. Ad esempio, il manuale di stile del kernel Linux raccomanda un refactoring quando il codice supera i tre livelli di indentazione.

Un modo per migliorare la leggibilità in alcuni casi consiste nell'aggiungere commenti che specificano a quale istruzione la parentesi chiusa faccia riferimento, con lo svantaggio di dover mantenere però testo duplicato.

for (int i = 0; i < total; i++) { foo(bar); } // For (i)

if (x < 0) { bar(foo); } // If (x < 0)

Molti editor permettono di individuare facilmente le parentesi corrispondenti tramite evidenziazione o animazioni quando si passa il cursore su una parentesi, o colorando differentemente ogni coppia di parentesi corrispondenti. Vim consente, tramite il tasto , di saltare da una parentesi alla sua corrispondente.Linda Lamb, Learning the vi editor. O'Reilly La maggior parte degli editor inoltre supporta il folding dei blocchi, permettendo di mostrarne o nasconderne il contenuto secondo necessità.

Inserimento di istruzioni Alcuni stili prevengono errori in caso di inserimento di istruzioni in posizione errata. Per esempio, inserendo erroneamente una istruzione tra un'istruzione di controllo come for o while e la successiva parentesi graffa di apertura del corrispondente blocco, il risultato è che solo la nuova istruzione viene effettivamente iterata, mentre il blocco viene eseguito solo una volta al termine delle iterazioni.

for (int i = 0; i < 10; i++) whoops(bar); /* Inserimento nella posizione sbagliati, viene ripetuta 10 volte */ { only_once(); /* Questo blocco dovrebbe essere ripetuto 10 volte, ma viene eseguito una volta sola */ } // For (i) <-- Questo commento non è più valido, e diventa ingannevole

Gli stili che collocano le parentesi aperte al termine della riga dell'istruzione di controllo cui fanno riferimento prevengono tale problema.

Strumenti automatici Sono disponibili strumenti per la formattazione automatica del codice secondo le preferenze di indentazione del programmatore, come il comando indent, presente in molti sistemi Unix-like.

Emacs fornisce diversi comandi per gestire l'indentazione, tra i quali l'indentazione automatica quando si inserisce un ritorno a capo (electric indent), la semplice pressione del tasto per indentare la riga corrente, e "M-x indent-region" per indentare ampie porzioni di codice. A seconda delle impostazioni, Emacs può anche sostituire gli spazi di indentazione con tabulazioni, eventualmente seguite da spazi, per ridurre al minimo il numero di caratteri.

Vim permette di definire regole di indentazione specifiche per ogni linguaggio, applicandole poi automaticamente durante la scrittura del codice. Consente inoltre di selezionare l'uso di spazi o di tabulazioni per l'indentazione e di convertire automaticamente una selezione di codice secondo le impostazioni correnti tramite il comando :retab, nonché di riformattare e reindentare una selezione di codice tramite la pressione del tasto in modalità visuale.

La "tabulazione elastica" () è uno stile di tabulazione che consente di mantenere automaticamente allineati interi blocchi di codice quando viene alterato il rientro di una singola linea che fa parte del blocco stesso, e richiede il supporto da parte dell'editor di testo.

Stili di indentazione

Stile K&R Lo stile K&R, che prende il nome da Brian Kernighan e Dennis Ritchie, autori de Il linguaggio C, testo considerato di fatto il più importante riferimento per la programmazione in C, è comunemente usato nella programmazione in tale linguaggio e nei suoi derivati. Il libro in realtà non specifica un proprio stile esplicitamente, ma lo segue coerentemente. Una nota specifica:

La parentesi graffa di apertura del corpo di una funzione si trova sulla riga successiva allheader della funzione, sullo stesso livello di indentazione dellheader, mentre per i blocchi si trova sulla stessa linea dell'istruzione cui fa riferimento, preceduta da uno spazio. Le rispettive parentesi di chiusura si trovano su una nuova riga, allo stesso livello di indentazione della parentesi di apertura corrispondente o della relativa istruzione. Nel caso la parentesi chiusa sia seguita da una keyword o , quest'ultima si trova sulla stessa riga.

int main(int argc, char *argv[]) { ... while (x == y) { something(); somethingelse();

if (some_error) { do_correct(); } else { continue_as_usual();

finalthing(); ... }

Stile kernel Lo stile kernel è una variante del K&R usata estensivamente nei sorgenti del kernel Linux. Linus Torvalds raccomanda fortemente ai contributori di attenersi a esso. Una descrizione dettagliata dello stile (che non riguarda solo l'indentazione, ma copre anche le convenzioni per la scelta degli identificatori, commenti e altri aspetti) è disponibile su kernel.org.

Lo stile impiega tabulazioni (di lunghezza pari a otto caratteri) per l'indentazione. Le parentesi graffe aperte nelle definizioni di funzione si collocano su una nuova riga, mentre in tutti gli altri casi, ad esempio nei blocchi, si trovano sulla stessa riga di apertura dell'istruzione, precedute da uno spazio. Le label di uno sono allineate con il blocco che le racchiude. Un blocco costituito da una singola riga non deve essere racchiuso da parentesi graffe ma, nel caso un altro ramo della stessa istruzione lo richieda (ad esempio in un ), allora tutti i rami devono essere racchiusi da parentesi graffe. La lunghezza delle righe è limitata a ottanta caratteri.

int power(int x, int y) { int result;

if (y < 0) { result = 0; } else { for (result = 1; y; y--) result *= x;

return result; }

1TBS I sostenitori di questo stile si riferiscono talvolta a esso come the one true brace style (abbreviato in 1TBS o OTBS). La differenza principale con lo stile K&R consiste nel fatto che le parentesi graffe non vengono omesse nei blocchi costituiti da una sola riga. I sorgenti del kernel Unix adottano questo stile.

In questo stile, i costrutti che permettono l'inserimento di nuove righe di codice sono su righe separate, mentre quelli che lo proibiscono sono sulla stessa riga, in modo che l'inserimento di una nuova riga in qualsiasi posizione sia "sicuro", ovvero l'inserimento accidentale in una posizione indesiderata conservi comunque la coerenza tra flusso di esecuzione e indentazione.

//... if (x < 0) { puts("Negative"); negative(x); } else { puts("Non-negative"); nonnegative(x);

Sebbene i programmi Java siano usualmente formattati secondo altri stili, esiste una certa quantità di codice Java formattato secondo varianti minori dello stile K&R (con la parentesi aperta sulla stessa riga nelle dichiarazioni di classi e metodi), principalmente per via delle guide linea stilistiche originariamente specificate da Sun Microsystems e adottate in buona parte della Java Class Library. È anche uno stile popolare in ActionScript e JavaScript, insieme allo stile Allman.

Stroustrup Lo stile Stroustrup è un adattamento fatto da Bjarne Stroustrup dello stile K&R per il linguaggio C++, impiegato nei suoi libri Programming: Principles and Practice using C++ e The C++ Programming Language.

A differenza dell'originale, Stroustrup non posiziona l'else sulla stessa riga della parentesi di chiusura che lo precede:

if (x < 0) { puts("Negative"); negative(x); } else { puts("Non-negative"); nonnegative(x); }

Stroustrup estende lo stile K&R per le classi, senza indentare le label , e analoghe. Mentre la parentesi di apertura del corpo di una funzione si trova sulla stessa riga dellheader, nel caso di una classe si trova sulla riga seguente. Inoltre, funzioni molto brevi possono essere scritte in un'unica riga.

class Vector { public: Vector(int s) :elem(new double[s]), sz(s) { } // Construct a Vector double& operator[](int i) { return elem[i]; } // Element access: subscripting int size() { return sz; } private: double elem[lowast]; // Pointer to the elements int sz; // The number of elements

Stile Allman

Lo stile Allman prende il nome da Eric Allman. È anche noto come "stile BSD" perché Allman scrisse molte utility per BSD Unix, ma differisce dallo stile BSD KNF. Le parentesi graffe di apertura associate a una istruzione di controllo del flusso si trovano su una nuova riga, allo stesso livello di indentazione dell'istruzione, mentre le istruzioni nel blocco hanno un livello maggiore di indentazione.

while (x == y) { something(); somethingelse(); }

finalthing();

Questo stile è analogo a quello usato comunemente in Pascal e Transact-SQL, dove le parentesi sono ovviamente sostituite dalle keyword begin e end.

(* Esempio di indentazione Allman in Pascal *) procedure dosomething(x: integer, y: integer) begin while x = y do begin something; somethingelse end end