Visualizzazione Stampabile
-
perchè il goto è il male?
Premessa: non sono un programmatore. Però so mettere le mani in VBA, cosa che mi è servita più volte per migliorare tante procedure ripetitive su cui lavoro.
Leggendo vari tutorial ho visto che il comando goto è odiatissimo. Perchè?
C'è qualche ragione per cui è bene non usarlo?
-
Riferimento: perchè il goto è il male?
si perchè è facile crear casini e incasinarsi tanto per fare un esempio... :sisi:
-
Riferimento: perchè il goto è il male?
I motivi sono due:
Il suo utilizzo e' facilmente evitabile, non esistono situazioni in cui il GOTO non sia sostituibile con altre soluzioni.
Rende il codice difficilmente leggibile e interpretabile, qualora si compiano errori diventa decisamente piu' difficile scovarli.
-
Riferimento: perchè il goto è il male?
Rende il flusso delle operazioni poco (o per niente) lineare, per cui poi, come ha scritto anche NoxDaFox, il codice rischia di diventare illegibile.
Siccome esistono delle valide alternative, il GOTO lasciamolo nel dimenticatoio ;)
-
Riferimento: perchè il goto è il male?
ti hanno già detto tutto
Aggiungo che il GOTO è per chi non ci capisce una brega di programmazione e non sa come maneggiare correttamente cicli e funzioni per generare comode sub-routine.
-
Riferimento: perchè il goto è il male?
perchè è una scappatoia facile per chi non ha studiato programmazione, ma vuole scriversi da sè le sue routine SENZA pagare un programmatore :sisi:
-
Riferimento: perchè il goto è il male?
Sostanzialmente serve a rendere il codice leggibile e manutenibile. In pratica se non programmi a livello professionale, sbattitene e vai di goto. :asd:
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Il Nero
Sostanzialmente serve a rendere il codice leggibile e manutenibile. In pratica se non programmi a livello professionale, sbattitene e vai di goto. :asd:
non capisco; hai detto che il goto servirebbe a rendere il codice leggibile e manutenibile? :pippotto:
dai non ci vuole una scienza a capire come fare un for o chiamare una funzione senza l'uso dei goto :bua: lasciateli perdere... :bua:
-
Riferimento: perchè il goto è il male?
Maddone dice che non sapete un cazzo e vuole le vostre scuse! http://www.abload.de/img/lockwsju.gif
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
blue_tech
non capisco; hai detto che il goto servirebbe a rendere il codice leggibile e manutenibile? :pippotto:
no, intendeva il contrario, che NON usarlo serve a rendere il codice manutenibile.
ma se il codice in questione è di trenta righe in tutto, chissene del goto :boh2:
Citazione:
Originariamente Scritto da
blue_tech
dai non ci vuole una scienza a capire come fare un for o chiamare una funzione senza l'uso dei goto
il goto fondamentalmente è comodo per uscire da un ciclo for sotto condizione senza stare lì a perder tempo per usare un ciclo while: anche il for è inutile, si può fare tutto col while, anche il select case è inutile, si può fare tutto con l'if then; usare for e select case non è solo più veloce (se faccio una selezione solo 1 volta per generare una query dinamicamente che poi impiega 3 minuti, figurati i 5 millisec persi con l'if al posto del select quanto contano), è soprattutto più comodo.
-
Riferimento: perchè il goto è il male?
Quello che ha detto Ronin. Sia nel senso che intendevo che NON usarlo dovrebbe rendere il codice leggibile e manutenibile, sia riguardo al fatto che in alcuni casi è comodo.
Per esempio una condizione tipica nella quale il goto è comodo ed utile è quella di cicli annidati in cui una condizione sul ciclo più interno deve provocare il break immediato da tutti i cicli. Quello ad esempio secondo la mia modestissima opinione viene leggibilissimo col goto, mentre se lo si fa secondo il mantra "goto = male" bisogna impantanarsi in variabili ed istruzioni condizionali ad hoc che rendono il codice una merda illeggibile, brutta e pure lunga da scrivere.
Invece con una bella label "fuoridalfottutociclo" messa fuori dal ciclo più esterno il codice ne guadagna in leggibilità e non ci si deve fracassare i maroni a scrivere 3000 righe di codice superflue.
-
Riferimento: perchè il goto è il male?
Esistono i vari break e continue per fare quello che dici tu, Nero.
Soprattutto non è vero che goto == male.
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Pongo
digli di farsi un fake e tornare http://i28.tinypic.com/1sz95e.gif
-
Riferimento: perchè il goto è il male?
Nei linguaggi assembler il GOTO (alias jump) non e' solo utile, e' addirittura necessario.
Il vero problema sta nel fatto che su 10 programmatori, 6 sono autodidatta e 2 sono cerebralmente poco dotati. Indi per cui si crea la leggenda nera del GOTO e si rimedia all'evenienza di ritrovarsi un mare di codice assolutamente illeggibile e facilmente "buggoso" (permettetemi il termine :asd:).
Resta il fatto che il GOTO e' sempre evitabile utilizzando soluzioni altrettanto efficienti; si tratta semplicemente di sapersi ingegnare nel momento della stesura del codice.
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Cherno
Esistono i vari break e continue per fare quello che dici tu, Nero.
Soprattutto non è vero che goto == male.
esatto! nel codice ad alto livello hai sistemi per uscire dai cicli come dici senza goto e qui nessuno sta andando a spada trsatta contro il goto... ha delle problematiche oggettive tutto lì...
Citazione:
Originariamente Scritto da
NoxDaFox
Nei linguaggi assembler il GOTO (alias jump) non e' solo utile, e' addirittura necessario.
Il vero problema sta nel fatto che su 10 programmatori, 6 sono autodidatta e 2 sono cerebralmente poco dotati. Indi per cui si crea la leggenda nera del GOTO e si rimedia all'evenienza di ritrovarsi un mare di codice assolutamente illeggibile e facilmente "buggoso" (permettetemi il termine :asd:).
Resta il fatto che il GOTO e' sempre evitabile utilizzando soluzioni altrettanto efficienti; si tratta semplicemente di sapersi ingegnare nel momento della stesura del codice.
non è che è necessario, è l'unica cosa che hai se vuoi scrivere qualcosa che salti tra i vari punti del codice... lì non esistono while if for ecc... te li devi costruire con le jump :asd:
Il punto è che se uno vuole scrivere codice, tendenzialmente lo fa ad alto livello, e se decide di scrivere ad alto livello che usi i costrutti ad alto livello possibilmente in maniera intelligente...
è ridicolo appoggiarsi al goto che è usato in programmazione a basso livello e che alla lunga preso come abitudine rende il tutto illeggibile :fag:
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
NoxDaFox
Nei linguaggi assembler il GOTO (alias jump) non e' solo utile, e' addirittura necessario.
Il vero problema sta nel fatto che su 10 programmatori, 6 sono autodidatta e 2 sono cerebralmente poco dotati. Indi per cui si crea la leggenda nera del GOTO e si rimedia all'evenienza di ritrovarsi un mare di codice assolutamente illeggibile e facilmente "buggoso" (permettetemi il termine :asd:).
Resta il fatto che il GOTO e' sempre evitabile utilizzando soluzioni altrettanto efficienti; si tratta semplicemente di sapersi ingegnare nel momento della stesura del codice.
a) il jump e il goto sono due cose diverse
b) adesso qualcuno ti quoterà dicendo che il goto è inutile se lavori in binario :V
c) questa conversazione sta prendendo una piega ridicola
-
Riferimento: perchè il goto è il male?
Il GOTO non e' intrinsecamente il male ma ha un grosso difetto: il target del GOTO non e' facilmente intuibile.
Spiego meglio: in qualunque ciclo di controllo hai una keyword di inizio e una di fine (o blocchi definiti da graffe o dall'indentazione come in python o qualunque altra cosa prevista dalla specifica sintassi) quindi hai subito un'idea chiara del flusso che seguono le istruzioni contenute in quella struttura, e' immediatamente comprensibile dove inizia e dove finisce.
Con GOTO e LABEL invece questo non e' vero, puoi avere limitazioni dovute allo scope (difficilmente potrai usare un GOTO per uscire da una funzione ad esempio), ma comunque in un grosso pezzo di codice la LABEL potrebbe trovarsi teoricamente ovunque rendendo l'analisi del codice un continuo salto qua e la' con stringhe di ricerca. Ovviamente un "unico grosso pezzo di codice" e' raramente una buona cosa quindi gia' quello non e' indice di buona programmazione, ma il GOTO non fa che complicare le cose. In un linguaggio di alto livello ci sono davvero pochissimi casi in cui abbia senso usarlo, mentre e' molto facile usarlo a sproposito creando casino.
-
Riferimento: perchè il goto è il male?
La risposta alla domanda dell'argomento si trova benissimo su wiki e diciamo che si fonda sopratutto nell'idea di avere una programmazione strutturata:
Citazione:
Le idee chiave della programmazione strutturata si possono ricondurre alla critica della
struttura di controllo del
salto incondizionato (o
goto, "vai a"), che rappresentava, negli
anni sessanta, lo strumento fondamentale per la definizione di
algoritmi complessi nel software. In un celebre articolo del
1968,
Goto statement considered harmful,
Edsger Dijkstra discusse approfonditamente gli effetti deleteri del
goto sulla qualità del software, e in particolare sulla sua
leggibilità e
modificabilità (il cosiddetto problema dello
spaghetti code).
Un'altra celebre pubblicazione che risultò fondamentale all'affermarsi della programmazione strutturata fu
Flow Diagrams, Turing Machines, and Languages with Only Two Formation Rules, in cui
Corrado Böhm e
Giuseppe Jacopini dimostrarono il loro celebre
teorema. Secondo tale teorema, qualsiasi programma scritto usando il
goto poteva essere riscritto senza, a patto di avere a disposizione altri tre tipi di strutture di controllo:
sequenza,
ripetizione e
alternativa. Il risultato di Böhm-Jacopini può anche essere espresso dicendo che, dato un qualunque
diagramma di flusso, ne esiste almeno un altro che a parità di input produce sempre gli stessi output del primo e in cui i nodi del diagramma di flusso rispettano un certo insieme di vincoli.
C'e' da dire che il problema non e' nel goto stesso, ma nell'uso che se ne fa.
Il problema non sono gli strumenti ma come vengono utilizzati dal carpentiere informatico ( programmatore) cosi':
Citazione:
Ai giorni nostri l'uso di questa istruzione in
linguaggi ad alto livello è generalmente considerato indice di cattiva programmazione (il cosiddetto "
spaghetti code"). Tuttavia, in linguaggi che non prevedano le eccezioni, GOTO può essere una valida scelta nel caso di
rollback di operazioni o deallocazione di risorse allocate attraverso passi successivi, quando in uno di tali passi si verifichi una condizione di errore. Il codice sorgente del
kernel Linux è ricco di GOTO, spesso finalizzate a tale scopo.
Marco.
EDIT:
C'e' anche un esempio:
Citazione:
Il seguente programma è un esempio banale di spaghetti code in
BASIC. Esso stampa su schermo la sequenza di numeri da 1 a 10 e il loro quadrato. Si noti come le istruzioni di
goto introducano una dipendenza dai numeri di riga del programma, e come il flusso di esecuzione salti in maniera impredicibile da una zona all'altra. In pratica, nei programmi reali le occorrenze di spaghetti code sono ben più complesse e possono aumentare notevolmente i costi di
manutenzione di un programma.
Codice:
10 dim i
20 i = 0
30 i = i + 1
40 if i <= 10 then goto 70
50 print "Programma terminato."
60 end
70 print i & " al quadrato = " & i * i
80 goto 30
Ecco un esempio di codice equivalente scritto con uno stile di programmazione strutturato:
Codice:
function square(i)
square = i * i
end function
dim i
for i = 1 to 10
print i & " al quadrato = " & square(i)
next
print "Programma terminato."
Anche questo programma esegue salti, ma in questo caso si tratta di salti predicibili e formalizzati. Questo perché il
ciclo for e le
funzioni definiscono
flussi di controllo standardizzati, mentre le istruzioni
goto incoraggiano flussi di controllo arbitrari.
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Haruki
a) il jump e il goto sono due cose diverse
http://gcc.gnu.org/onlinedocs/gcc-3....as-Values.html
http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
Citazione:
Originariamente Scritto da
Haruki
b) adesso qualcuno ti quoterà dicendo che il goto è inutile se lavori in binario :V
questa non l'ho capita.
Citazione:
Originariamente Scritto da
Haruki
c) questa conversazione sta prendendo una piega ridicola
nemmeno questa l'ho capita.
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
blue_tech
esatto! nel codice ad alto livello hai sistemi per uscire dai cicli come dici senza goto e qui nessuno sta andando a spada trsatta contro il goto... ha delle problematiche oggettive tutto lì...
non è che è necessario, è l'unica cosa che hai se vuoi scrivere qualcosa che salti tra i vari punti del codice... lì non esistono while if for ecc... te li devi costruire con le jump :asd:
Il punto è che se uno vuole scrivere codice, tendenzialmente lo fa ad alto livello, e se decide di scrivere ad alto livello che usi i costrutti ad alto livello possibilmente in maniera intelligente...
è ridicolo appoggiarsi al goto che è usato in programmazione a basso livello e che alla lunga preso come abitudine rende il tutto illeggibile :fag:
E' anche vero che delle volte ti ritrovi a lavorare con del codice critico scritto col culo, nel quale non puoi permetterti di fare modifiche a certe logiche. In quel caso c'è poco da filosofeggiare e magari un bel goto non te lo toglie nessuno.
Le situazioni sono tante: dire che il goto è il male è una puttanata, dire che spesso è usato in maniera impropria, già rispecchia di più la realtà
-
Riferimento: perchè il goto è il male?
beh ma è quello che stiamo dicendo dall'inizio... :bua:
il goto è uno strumento, purtroppo sono in tanti ad usarlo alla pene di cane quindi tendenzialmente viene considerato il male... poi ovvio che chi lavora seriamente e lo usa quando e dove necessario e nella misura necessaria, fa bene :fag:
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
NoxDaFox
Mi pare proprio che ambedue confermino la mia tesi, quindi? http://i28.tinypic.com/1sz95e.gif
-
Riferimento: perchè il goto è il male?
C'è gente che riesce ad usare a pene di cane pure i for, while, e if, figuriamoci i goto :bua:
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
hendor
C'è gente che riesce ad usare a pene di cane pure i for, while, e if, figuriamoci i goto :bua:
:bua:
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
blue_tech
beh ma è quello che stiamo dicendo dall'inizio... :bua:
il goto è uno strumento, purtroppo sono in tanti ad usarlo alla pene di cane quindi tendenzialmente viene considerato il male... poi ovvio che chi lavora seriamente e lo usa quando e dove necessario e nella misura necessaria, fa bene :fag:
ronin sostiene che chi fa uso del goto è perchè si improvvisa programmatore e vuole programmarsi le cose da se senza pagarne uno, per esempio.
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Cherno
ronin sostiene che chi fa uso del goto è perchè si improvvisa programmatore e vuole programmarsi le cose da se senza pagarne uno, per esempio.
beh rimane coerente... un buon programmatore ad alto livello non usa il goto per i suddetti motivi... un buon programmatore a basso livello lo usa in maniera accurata... quasiasi altro programmatore che lo usa in realtà sarebbe meglio se non lo usasse :asd:
questo non va contro il concetto: "il goto non è il problema, il problema è chi lo usa" :fag:
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Cherno
ronin sostiene che chi fa uso del goto è perchè si improvvisa programmatore e vuole programmarsi le cose da se senza pagarne uno, per esempio.
guarda che non essere programmatore di professione è diverso che non lavorare seriamente :rotolul:
questa discussione l'abbiam già fatta altre volte: c'è chi fa un lavoro dove sapersela cavare col VBA (dentro Office) consente di risparmiare molte ore (ore che spesso valgono numeri a 3 cifre).
è solo una visione molto miope quella che ti fa dire che quello è "improvvisarsi programmatore": quello è tutt'altro, perchè c'è chi il programmatore ci tiene a non esserlo (anche se a qualcuno di questo forum parrà impossibile :asd:); perciò non è questione di improvvisarsi, bensì di sapere usare uno strumento di lavoro.
costoro sono gli utenti perfetti per l'uso del goto (perchè scrivono routine che useranno solo loro, e spesso useranno solo quella volta lì e mai più per anni, e quindi le loro esigenze di debugging, riusabilità, portabilità, ottimizzazione, coerenza interna e resistenza agli errori dell'utente sono del tutto trascurabili).
l'esempio de Il Nero, del ciclo annidato a più livelli da cui si deve uscire sotto condizione, mi par fin troppo chiaro.
-
Riferimento: perchè il goto è il male?
Cosa c'entra tutto questo, cosa c'entrano gli strumenti di lavoro, con il livello con il quale si va ad operare con la macchina e con la professione e la serietà? Cosa c'entrano i numeri a 3 cifre..che poi tre cifre di che cazzo? ti fa risparmiare al massimo 999e usare VBA? :asd:
Battute a parte: qui è stato chiesto perchè nella programmazione il goto è visto male, tu hai chiaramente detto che chi usa il goto non è un programmatore. Io dico che non è vero perchè in certi contesti può essere utile e giacchè si parla di programmazione, i contesti che intendo sono inerenti a quello.
L'esempio del Nero è un esempio sbagliato perchè se hai millemila cicli annidati e li ha scritti tu, è chiaro che sei stato impreciso nel valutare la struttura del codice: quello che dicevo io invece era in un contesto dove non puoi toccare niente se non quella cosa li ed allora magari ti serve. Non è l'unico esempio e ce ne sono tanti: Dijkstra, si quello dei grafi, scrisse una tesi intitolata Go To Statement Considered Harmful nella quale ad esempio non dice che chi lo usa non sia un programmatore. anzi.
Fai te che è una domanda così stupida che uno a caso, Dijkstra intendo, vi ha fatto su un articolo. Chiaramente sono ironico e questo vuole arrivare a dire: come fanno alcuni di voi a dare delle risposte del tipo <se fai questa cosa qui che io non faccio, allora non sei un programmatore, non sei un programmatore serio>.
Come vi vengono? Insegnatemelo!
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Cherno
ti fa risparmiare al massimo 999e usare VBA? :asd:
all'ora di lavoro sì; di più all'ora non guadagno, mica sono Tremonti :boh2:
Citazione:
Originariamente Scritto da
Cherno
come fanno alcuni di voi a dare delle risposte del tipo <se fai questa cosa qui che io non faccio, allora non sei un programmatore, non sei un programmatore serio
gioia, intanto respira col naso.
poi quando ti sei calmato, rileggi e renditi conto che hai capito TUTTO AL CONTRARIO (il sottoscritto sta tra quelli che l'uso del goto lo consigliano, e del non essere un programmatore professionista fa casomai un vanto, non certo un'infamia :rotolul: )
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Cherno
L'esempio del Nero è un esempio sbagliato perchè se hai millemila cicli annidati e li ha scritti tu, è chiaro che sei stato impreciso nel valutare la struttura del codice
Eh, ma è proprio questo il punto. Ad un programmatore non professionista capita continuamente di essere impreciso a valutare la struttura del codice. Dopodichè, una volta che si trova incasinato, secondo te la soluzione migliore è:
1) Riscrivere tutto.
2) Metterci 12000 if (...) break che renderanno il codice leggermente illeggibile.
3) Metterci un goto e provocare il pianto di un Angioletto della Programmazione.
-
Riferimento: perchè il goto è il male?
Il goto è male solo per le mezze seghe accademiche che non si sono mai sporcati le mani col codice.
O per chi usa Java.
Codice:
void funzione()
{
int *bla1 = NULL, *bla2 = NULL;
bla1 = (int *)malloc(size);
if (errore1)
{
log("errore");
goto exit;
}
bla2 = (int *)malloc(size);
[...]
if (errore2)
{
goto exit;
}
[...]
exit:
if (bla1) free(bla1);
if (bla2) free(bla2);
}
Illeggibile 'sta minchia.
-
Riferimento: perchè il goto è il male?
Altro ottimo esempio di situazione che risolverla senza goto è un'inutile stracciata di palle. :asd:
-
Riferimento: perchè il goto è il male?
no, scusa, spiegami dove starebbe la stracciata di palle :rotfl:
-
Riferimento: perchè il goto è il male?
questo topic è bellissimo perché ci sono alcuni che non capiscono nulla e pretendono di aver ragione
metto io un esempio per far capire che il goto SERVE
Codice:
int funz(....) {
....
if (err1)
goto exit1;
....
if (err2)
goto exit2;
....
if (err3)
goto exit3;
....
exit3:
....
exit2:
....
exit1:
....
return rc;
}
fino ad ora questo è l'unico costrutto in cui è veramente utile l'uso del goto, per le altre cose, se serve utilizzare il goto significa che c'è un problema di fondo (ossia si può sicuramente riprogettare il codice in maniera migliore)
(ovviamente parlo per esperienza personale)
-
Riferimento: perchè il goto è il male?
Per quanto mi riguarda, è inutile pure lì :asd:
Ma sai che ti dico? Ognuno programma come minchia gli pare, che da sto thread tanto ci usciranno solo flame.
-
Riferimento: perchè il goto è il male?
Tl;dr version
Why shouldn't you use GOTO in modern programming era (doesitevenexists.tiff)? *Spaghetti code
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Haruki
no, scusa, spiegami dove starebbe la stracciata di palle :rotfl:
Controllare in ogni punto dove c'è l'errore la se abbiamo allocato qualcosa e rilasciarlo. Stracciata di palle perché devi fare copia/incolla del codice in ogni punto dove controlli l'errore (e credimi, l'instruction cache in molte piattaforme non è generosa).
Se consideri che rischi di dimenticare di controllare qualcosa, spesso, non usare il goto in questi casi è una delle maggiori cause di memory leak. Ma tanto i javisti un memory leak non sanno neanche cosa sia, figuriamoci l'instruction cache.
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Haruki
Per quanto mi riguarda, è inutile pure lì :asd:
Ma sai che ti dico? Ognuno programma come minchia gli pare, che da sto thread tanto ci usciranno solo flame.
se per te è inutile pure lì significa che non hai capito niente della logica di quel codice.
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
working_mad
se per te è inutile pure lì significa che non hai capito niente della logica di quel codice.
No, significa semplicemente che ci sono tanti di quei modi per fare uno stesso programma, che a saperli tutti, dopo solo 5 minuti la testa ti esploderebbe. Ti ripeto, qui si finisce solo in flame, io dalla mia iniziale posizione non mi sposto, posso fare tutto anche senza usare quella magica parolina chiave, bannata dal mio vocabolario dai tempi di basic.
-
Riferimento: perchè il goto è il male?
Citazione:
Originariamente Scritto da
Haruki
no, scusa, spiegami dove starebbe la stracciata di palle :rotfl:
Fammi vedere il modo meno stracciapalle di farlo senza goto. :asd:
A me l'unica che viene in mente e sia paragonabile per compattezza e leggibilità è un blocco try-catch, che però è praticamente identico. :asd:
Tra l'altro ribadisco che il goto è spesso la soluzione meno arzigogolata e più leggibile per uscire da cicli annidati.