Molti linguaggi di programmazione hanno l'istruzione goto, definito "salto nel codice", oppure "salto verso un'etichetta".
L'uso di goto è una pessima abitudine di programmazione! Rende spesso illeggibile l'algoritmo, non crea una visione chiara. Deriva da vecchi standard di programmazione (fonte), in particolare:
Questa pratica riduce la leggibilità del codice sorgente e rende più complessa la manutenzione del codice. Per questa ragione l'istruzione goto è ormai deprecata come tecnica di sviluppo.
Chi lavora nel campo della programmazione, sa bene (e dovrebbe sapere 😁 ) quanto sia importante rispettare determinati standard, convenzioni, anche per una questione di leggibilità (te stesso che prendi in mano il codice a distanza di tempo, dopo mesi, oppure a maggior motivo se devono leggerlo altre persone). Ah tranquilli, pur sapendolo, nemmeno io rispetto sempre queste convenzioni!
Non a caso, viene definito in modo ironico e dispregiativo il termine "spaghetti code":
Spaghetti code è un termine dispregiativo per il codice sorgente di quei programmi per computer che hanno una struttura di controllo del flusso complessa e/o incomprensibile, con uso esagerato ed errato di go to, eccezioni, thread e altri costrutti di branching (diramazione del controllo) non strutturati. Il suo nome deriva dal fatto che questi tipi di codice tendono a assomigliare a un piatto di spaghetti, ovvero un mucchio di fili intrecciati ed annodati.
Per far comprendere l'importanza di un codice chiaro e pulito, ho creato un programmino in C che evidenzia proprio le cose da non fare:
#include <stdio.h>
#define closefile fopen
#define openfile fclose
int main(int argc, char **argv){
if(1){goto END;}
PIPPO:
{
printf("DONE!\n");
return (3.14-0.5*6.28);
}
END:
{
FILE *f1;
f1=closefile("log.txt","w");
openfile(f1);
goto PIPPO;
}
}
Alcune considerazioni su questo codice:
- ho definito "closefile" la funzione fopen() e "openfile" la funzione fclose(). Per il compilatore non cambia nulla, ovviamente, ma questo evidenzia l'importanza di assegnare un nome concettualmente chiaro a variabili e funzioni
- etichetta "PIPPO": in programmazione, quando si parla di un "nome a caso", per variabili, etichette, funzioni ecc, spesso si identifica con l'esempio del nome "pippo", la peggior scelta che si possa fare per un nome, rispetto a mettere un identificativo concettualmente utile (approfondomento: variabile metasintattica); allo stesso modo, l'etichetta "END" indica l'inizio delle istruzioni
- goto: eccoci a noi, l'istruzione goto, i "salti nel codice"! Tutto inizia con if(1) che ovviamente è "TRUE" quindi rimanda all'etichetta "END" che indica l'inizio, la quale crea un puntatore a file, un semplice .txt, che poi chiude (cambiando concettualmente in nomi delle funzioni fopen() e fclose(), come abbiamo visto prima); poi rimanda all'etchetta "PIPPO" che stampa a video come conferma la stringa di completamento dell'operazione e poi il return...
- return: anziché il classico "return 0", si evidendia la possibile flessibilità, scrivendo come esempio "return (3.14-0.5*6.28)"
Sono alcuni esempi di come si rende illeggibile o comunque concettualmente "impostato male" il codice, pur mantenedo tutta la validità sintattica e funzionale. Ricordiamo quindi che seguire degli standard e convenzioni è importante, evitando "spaghetti code" e affini, soprattutto se il codice lo devono leggere altre persone!
Abbiamo visto in particolare cos'è e come funziona goto e alcune ragioni per cui sarebbe opportuno evitarne l'uso. Una curiosità, nel videogioco Star Wars: Knights of the Old Republic II: The Sith Lords esiste un personaggio chiamato G0-T0 o Goto, che è un droide con problemi di programmazione.