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.

    Giulio_M Sì conoscevo l'infame GOTO. Non lo devo usare mai fortunatamente ma in casi estremi è necessario, ad esempio per realizzare cicli o condizioni dello scripting Batch 🙂
    Stupendo il tuo spaghetti code 😂

      Powered by: FreeFlarum.
      (remove this footer)