Domanda [C] GOTO, che ha fatto di male?

Stato
Discussione chiusa ad ulteriori risposte.

Ojutai

Utente Silver
14 Luglio 2014
111
23
36
94
Salve a tutti, avevo un cosa da chiedere a voi c developer. Mi potete spiegare le principali ragioni per cui si odia così tanto il GOTO? Io credo che se lo si utilizza in maniera intelligente qualcosa di buono ci ricavi. Anche molti docenti ne hanno quasi proibito l'uso (alcuni minacciando una bocciatura istantanea) mentre altri dicono che un corretto utilizzo possa solo giovare. Chi ha ragione quindi secondo voi?
 
Personalmente sono stato abituato a non usarlo, alcuni miei docenti non l'hanno nemmeno menzionato, ma penso che sia una cosa superata, che si possa evitare avendo più accortezza nella progettazione. Il fatto è che crea confusione, non pensare a progettini scemi di 4/500 righi, pensa a magari un qualcosa con funzioni belle grosse. Perdi il contesto e ti lasci sfuggire qualcosa mentre non usandolo sei "costretto" a progettare il programma in modo più fluido.
Almeno io la vedo in questo modo, ogni programma deve essere leggibile da chiunque e, ogni volta che serve vedere il codice, bisogna capire all'istante cosa sta facendo senza dover scorrere tra la pagina per cercare la referenza e scoprire magari qualche bug prchè capita che l'hai scritta più volte oppure messa in un posto sbagliato, che è molto facile che avvenga.
 
  • Mi piace
Reazioni: TheSeeker
Personalmente sono stato abituato a non usarlo, alcuni miei docenti non l'hanno nemmeno menzionato, ma penso che sia una cosa superata, che si possa evitare avendo più accortezza nella progettazione. Il fatto è che crea confusione, non pensare a progettini scemi di 4/500 righi, pensa a magari un qualcosa con funzioni belle grosse. Perdi il contesto e ti lasci sfuggire qualcosa mentre non usandolo sei "costretto" a progettare il programma in modo più fluido.
Almeno io la vedo in questo modo, ogni programma deve essere leggibile da chiunque e, ogni volta che serve vedere il codice, bisogna capire all'istante cosa sta facendo senza dover scorrere tra la pagina per cercare la referenza e scoprire magari qualche bug prchè capita che l'hai scritta più volte oppure messa in un posto sbagliato, che è molto facile che avvenga.
Esatto, quello è il motivo principale. I programmi scritti che utilizzano istruzioni goto possono essere riscritti usando condizioni e loops per rendere il tutto più leggibile.
Il punto di destinazione è identificato solo da una etichetta, l'istruzione goto fa un salto incondizionato a quest'ultima.
Qualsiasi cosa che non usa istruzioni goto deve coinvolgere condizioni nidificate o variabili booleane.
Il tutto quindi è per migliorare la leggibilità del programma.
 
  • Mi piace
Reazioni: Defalt316
Ultima modifica da un moderatore:
Il goto non e' il diavolo, ovviamente.
Generalmente non serve, visto che le strutture di controllo sono adeguate nella maggior parte delle occasioni.
Quando potrebbe servire, spesso la stessa cosa puo' essere fatta usando gli statement continue <label> e break <label>.

Ad esempio:

Codice:
...
loop: while(<condizione 1>)
{
...while(<condizione 2>)
...{
......if (<condizione 3>) continue loop;
...
......if (<condizione 4>) break loop;
...}
}

....

Il seguente codice dice:
1) ho due loop nidificati.
2) all'interno del secondo loop, se capita la <condizione 3>, devo continuare ricominciando direttamente dal loop piu' esterno
3) se capita la <condizione 4>, devo uscire da ENTRAMBI i loop.

E' ovvio che ci sono n-mila modi per fare la stessa cosa senza usare la label (uso di flag, aggiunta di if e di condizioni sui flag, ...)

L'unico inconveniente e' che break e continue possono essere utilizzati solo all'interno di cicli (for/while/...).

C'e' un caso in cui il goto risulta utile, ed e' il seguente:

supponiamo di avere un codice di questo tipo:

Codice:
...
if(<condizione 1>)
{
....azione_1
....if(<condizione 2>)
....{
........azione_2
........if(<condizione 3>)
........{
............azione_3
............if(<condizione 4>)
............{
................azione_4
................ <altri test>
............}
........}
....}
...
azione_finale

Ora, finche' ci sono 2 o 3 condizioni, piu' o meno il codice risulta leggibile, ma se le condizioni iniziano ad essere 4 o piu', il codice comincia ad essere complicato da leggere perche' potrebbe uscire dallo schermo (non si dovrebbe mai scrivere righe piu' lunghe di 80/132 caratteri, per mantenere la leggibilita').

La soluzione semplice e' inverire i test ed usare il goto

Codice:
...
if( ! <condizione 1>)
   goto esci;
azione_1

if( ! <condizione 2>)
   goto esci;
azione_2

if( ! <condizione 3>)
   goto esci;
azione_3

if( ! <condizione 4>)
   goto esci;
azione_4


esci:
azione_finale
...

In questo modo, il codice risulta avere una struttura lineare e risulta evidente la presenza di uscite multiple.

Se non dovesse esistere azione_finale, allora al posto del goto si puo' usare direttamente un return

Un'altro caso e' il seguente:

Codice:
...
if(<condizione 1>) then goto exit_1
azione_1
if(<condizione 2>) then goto exit_2
azione_2
if(<condizione 3>) then goto exit_3
azione_3
...

exit_3: 
.... azione_finale_3
exit_2: 
.... azione_finale_2
exit_1: 
.... azione_finale_1
azione_finale

Qui, a seconda di una certa condizione, deve essere fatto un certo numero di azioni finali.
Ovviamente, anche in questo caso si puo' fare la stessa cosa con un opportuno numero di flag e di if, ma probabilmente il codice risultante risulterebbe PIU' complicato dell'uso del goto.

In soldoni:
l'assioma e' scrivere codice comprensibile.

Se l'uso del goto migliora la comprensibilita' del codice, allora vale la pena usarlo.
 
Salve a tutti, avevo un cosa da chiedere a voi c developer. Mi potete spiegare le principali ragioni per cui si odia così tanto il GOTO? Io credo che se lo si utilizza in maniera intelligente qualcosa di buono ci ricavi. Anche molti docenti ne hanno quasi proibito l'uso (alcuni minacciando una bocciatura istantanea) mentre altri dicono che un corretto utilizzo possa solo giovare. Chi ha ragione quindi secondo voi?
A parte le mille discussioni sull'argomento che potrai trovare sul web, ritengo che il problema sia che utilizzare in maniera "intelligente" il goto sia molto, molto difficile. Per questo, si finisce per usarlo in maniera "molto poco intelligente" e quindi si ottiene l'effetto contrario.

A questo punto, meglio non usarlo.
 
Ma che caz...??? Che poi tra parentesi, ci sono pure io su quel forum, certo non loggo da un po' però immagina quando avrei letto il messaggio...io non ho idea guarda...grazie per la segnalazione @incredibile
 
Ciao,

Il problema fondamentale del goto se andaimo a vedere bene non esiste, si tratta semplicemente di un istruzione JUMP non condizionato, quindi in assembly non da alcun problema.
Tuttavia, lavoro su progetti medi e medio-grandi di sviluppo da oltre 10 anni, e non ne ho mai visto uno.
Semplicemente, come anche altre istruzioni, è possibile programmare qualsiasi cosa senza mai usarlo.
Come già detto, il motivo fondamentale per cui ne è sconsigliato l'utilizzo, è soltanto che il codice per forza di cose diventa meno comprensibile, specialmente se questo goto salta abbastanza lontano.
Se poi quel file sorgente è utilizzato da più di una persona, le probabilità di creare problemi crescono esponenzialmente quanti più sviluppatori ci sono.
Io quindi sono d'accordo con quei docenti che non ne consentono l'utilizzo, perchè risolvere problemi creando entropia non è certo un buon modo di agire.
 
  • Mi piace
Reazioni: Ojutai
Salve a tutti, avevo un cosa da chiedere a voi c developer. Mi potete spiegare le principali ragioni per cui si odia così tanto il GOTO? Io credo che se lo si utilizza in maniera intelligente qualcosa di buono ci ricavi. Anche molti docenti ne hanno quasi proibito l'uso (alcuni minacciando una bocciatura istantanea) mentre altri dicono che un corretto utilizzo possa solo giovare. Chi ha ragione quindi secondo voi?
Il motivo per il quale si sconsiglia di utilizzare il GOTO è che esso rende il codice destrutturato e di conseguenza più difficile da interpretare. In pratica quando osservi un algoritmo correttamente formattato (indentato) riesci subito ad individuare dei blocchi di codice ed hai la certezza che a Run-Time quando entri in un blocco questo viene eseguito fino alla fine, quindi l'esecuzione riprende dall'istruzione successiva o dall'inizio del blocco se si tratta di un ciclo; se invece nel blocco è presente un goto il flusso di esecuzione potrebbe saltare in un punto completamente diverso del programma, per questo occorre molto più impegno per comprendere la logica che c'è dietro. D'altra parte però il goto insieme ad altre istituzioni (break e return) consente di gestire in maniera più intuitiva le condizioni di eccezione, ovvero quelle condizioni in cui l'esecuzione dell'algoritmo non è più necessaria (perché i dati sono compromessi oppure si è giunti alla soluzione prima del previsto). In Java ad esempio è stato creato un ibrido per rendere strutturata la gestione delle eccezioni attraverso il costrutto try-catch e l'istruzione throw, che di fatto esegue un salto proprio come il GOTO.
 
Ma allora è una fissazione ... anche Exyne (sarà un clone di Elysium ?) ... ma come funziona su questo forum? Non bannate certi utenti che si comportano in questo modo?

Anche questa risposta è stata data da un altro utente in un altro forum

http://www.hwupgrade.it/forum/showthread.php?t=2741443

dopo che la domanda fatta in questo forum è stata riportata ...

E' un comportamento inaccettabile ... ma che fanno i moderatori di inforge?
 
  • Mi piace
Reazioni: davidecreatoreapp
La discussione ha già avuto molte risposte, che qualcuno chiuda questo thread per favore!

OT: E' vergognoso, ancora questa gente gira liberamente sul forum. Quindi tu dovresti essere un mio concittadino? Ci vogliamo incontrare? Finiamola per favore! Si è capito che vuoi far confondere la gente, vai a mettere dove abito IO in altri forum, in questo modo fai pensare che sono io quell'utente!
Classico comportamento da prendere a schiaffi ... Se ti avessi tra le mani, piccolo moccioso ...
Non sei mio concittadino, e non hai nemmeno il diritto di esserlo! Adesso non presentarti più in questo forum!
Sei Elysium? Sì!

@Kolo93 che fai? Procedi, e magari dicci se i due suddetti "laureati" hanno qualche legatura di indirizzo IP, in questo modo possiamo sapere se è un signorino che si diverte a fare ste cà**ate!
 
Da quello che avevo letto il GOTO è scomodo per porzioni di codici composti da diverse linee e ovvio che per un codice semplice il GOTO risulta essere molto più utile
 
Stato
Discussione chiusa ad ulteriori risposte.