Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Si può usare il Gosub?

Ultimamente sono stato deriso da un collega per avere utilizzato un Gosub
all'interno di una  routine. Lui dice che è una istruzione da evitare e che
non si usa più.
Normalmente sono un fautore della programmazione strutturata, e non mi
sognerei mai di usare un Goto tranne che per la gestione errori.  Il Gosub
mi pareva però un buon surrogato della chiamata a funzione nel caso in cui
questa funzione servisse solo localmente alla sub in oggetto.
Insomma, posto che alla label che identifica l'inizio del codice della Gosub
si metta un nome autoesplicativo, è buona pratica usare il Gosub o no?
Ciao
*Roby*
P.S.
Questo è il tipo di esperienza che ti fa sentire un dinosauro informatico.
8-)

 P.S. Questo è il tipo di esperienza che ti fa sentire un dinosauro informatico.
Lo dici a uno che ha cominciato con lo ZX-80... 8-))
Bisogna continuamente ridiscutere sé stessi e le proprie conoscenze, in questo campo.
Bye, G.
--
---------------------------------------------
    Le risposte alle tue domande le trovi
    sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
       ... e nell'help in linea !
---------------------------------------------
Real E-address: 
gaet...@hotmail.com

Io derivo dal PASCAL e se devo essere sincero NON USO MAI istruzioni come
label, gosub,... ecc...
Il consiglio che ti posso dare è *evita* di usarlo, in quanto se di venta un
vizio:
1) Atrofizzi il tuo cervello.
2) Crei codice illeggibile, oltre che non strutturato.
3) Rischi di non poter controllare più il flusso del codice e quindi di
aumentare la probabilità di Bug.
4) ...sicuramente hai altre penalità...
Ciao.
EASY Software
http://www.easysoftware.it
-------------------------------------------------

 4) ...sicuramente hai altre penalità...
Si, questo l'ho notato seguendo il thread. 8-)
Ciao
*Roby*


Se devi cercare l'EndIf alla 600esima riga di codice vuole dire che hai
sbagliato la strutturazione del codice.
Personalmente ho usato 1 (dico UNO) GOTO in tutta la mia vita di
programmatore (OK, non e' molto lunga, ma qualche annetto di esperienza ce
l'ho)... ed era in un sorgente C K&R (orrore) che ho dovuto debuggare tempo
fa.
In tutto questo discorso non sono compresi i goto del costrutto On Error di
VB; non esistendo altra alternativa per la gestione degli errori, quelli
sono obbligati.
--
Roal Zanazzi
z...@iol.it

 wrote in message
fpGH3.45705$1u4.3...@typhoon.libero.it...


Personalmente uso il GOTO... e sinceramente non capisco come facciate a farne a
meno..
Ad Esempio un codice del tipo
Do
       If Archivo!Codice = "XXX" Then
           GOTO Salto
       Endif
      ---- Esecuzione di altri controlli o riempimento di Array..etc etc etc
Salto:
      Archivio.Movenext
Loop
Come lo risolvete senza Goto???
Con If nidificati????
Ma se sono una 15ina che fate ???? anadate nei matti'???
Sarei veramente curioso si sapere come fate penso che potrebbe essere un'ottima
opportunita' per conoscere cose nuove Grazie 1000.
Ciao Daniele
--
!------------------------------------------------!
!ICQ     : 8281944
!E-Mail  : 
Dan...@levon.it
!
!"Bisogna essere pronti, ogni giorno,
! a spostare i paletti delle proprie certezze."
!
!HomePage : 
http://www.levon.it/daniele
!
!------------------------------------------------!


 Do
        If Archivo!Codice <>  "XXX" Then
              ---- Esecuzione di altri controlli o riempimento di Array..etc
etc etc
        Endif
        Archivio.Movenext
 Loop
Nb. e' solo la traduzione brutale senza GOTO .... non sto' a sindacare che
questo sembra essere un loop infinito.......
Ciao
Ven.

 si metta un nome autoesplicativo, è buona pratica usare il Gosub o no?
per me è come dire "si può usare il freno a mano mentre la macchina è in
marcia?"
la risposta è: "si, se si sa cosa si sta facendo... e soprattutto se si è
capaci di farlo..."
una curva stretta di una strada sterrata, azionando bene il freno a mano (e
non solo quello...), può essere affrontata a una buona velocità (specie se
non ci si deve preoccupare di pagare le gomme...)
ciao

Ok concordo e mi piace e lo faccio pure io se ho un IF solo
ma se ne hai 10 ? 15 ? non ti sembra che poi diventi un po' nidificato?
Per quanto riguarda l'infinito....  hai fatto bene a non sindacare ...
Ciao Daniele  (ovviamente con la max simpatia cio' che ti ho scritto)
Ven ha scritto:

 Ciao Daniele  (ovviamente con la max simpatia cio' che ti ho scritto)
infatti.... piu' che l'   "Infinito" preferisco "Pioggia nel Pineto" .....
;-))
Ciao
Ven


Forse non ho capito la finezza di questo codice, ma una cosa tipo:
Do
       If Archivo!Codice <> "XXX" Then
          ---- Esecuzione di altri controlli o riempimento di Array..etc etc
etc
      EndIf
      Archivio.Movenext
Loop
non ti sembra piu' pulita?
--
Roal Zanazzi
z...@iol.it


le gomme... o la macchina!
--
Roal Zanazzi
z...@iol.it

invento un Do Loop e ne esco con un Exit Do.
esatto. Exit For ed Exit Do le uso anch'io ma proprio quando il codice è
piccolino. Quando però devo saltare dal secondo ciclo al quinto o viceversa
non mi pare che esistano Exit For al quadrato o al cubo :-))
ciao
Davide

sbagliato la strutturazione del codice.
        e te pareva che l'errore lo facevo :-))
no davvero... scrivo moduli con oltre mille righe e se dovessi star attento
a non mettere Goto o Gosub diventerei scemo.
ciao
Davide

 le gomme... o la macchina!
dipende: se la curva la prendi bene basta trovare qualcuno che paga le
gomme... altrimenti :((
ciao

 non mi pare che esistano Exit For al quadrato o al cubo :-))
Sinceramente non mi è ancora capitata l'esigenza, ma se decidessi di saltare
aventi e indietro per il sorgente lo farei anche senza usare i goto.
Dim iCicloDaFare as integer
iCicloDaFare=1
Do While True
    Select Case iCicloDaFare
        Case 1
            iCicloDafare=3
        Case 2
            iCicloDafare=4
        Case 3
            iCicloDafare=2
        Case 4
            Exit do
   End Select
Loop
Ti è piaciuta? 8-)
Ciao
*Roby*


Mah io non uso mai goto tranne per la gestione degli errori con On Error
Goto xxx
Per le condizioni nidificate preferisco, dove e' possibile, metterlo in
sub dedicati, anche se aumenta l'overhead. Ma dipende caso per caso.
-- 
Sidewinder  
---------------------------------------------------------------------
"You just come along with me and have a good time. The Galaxy's a fun place.
 You'll need to have this fish in your ear." "I beg your pardon?" - HHGG
---------------------------------------------------------------------


è una normale struttura select che però non fa al caso mio :-))
quando intendo saltare dal  quarto al secondo ciclo intendo una roba del
genere
for a=x1 to x2
if condizione3 then goto salta1
if condizione4 then goto FineCiclo
for b=x3 to x4
if condizione2 then goto salta1
if condizione3 then goto salta2
if condizione4 then goto FineCiclo
for c=x5 to x6
if condizione1 then goto salta1
if condizione2 then goto salta2
if condizione3 then goto salta3
if condizione4 then goto FineCiclo
for d=x7 to x8
if condizione1 then goto salta2
if condizione2 then goto salta3
if condizione3 then goto salta4
if condizione4 then goto FineCiclo
salta4:
    next d
salta3:
    next c
salta2:
    next b
salta1:
    next a
FineCiclo:
ti ho scritto un esempio minimo con tre diverse condizioni da soddisfare in
base a determinate richieste. Alcune di quelle GoTo si possono superare con
un If Then ma visto che il codice lo voglio "leggibile" ho uniformato tutti
le condizioni con una GoTo.
A proposito di questa routine l'amico Marco Frazzoli mi ha genialmente
stilato una funzione ricorsiva che è davvero esemplare e che a dir la verità
soddisfa il 90% delle mie esigenze. Ci sono infatt altri problemi da
superare e non credo che in tutti i casi la funzione sia idonea. per cui il
codice che ti ho scritto riguarda alcune ipotesi di ricorsività dei cicli
dove tuttavia una funzione lineare non può bastare. Nella funzione lineare
tutti i cicli si sarebbero distinti per l'incremento +1 dei valori quindi
invece di trovare For b=x3 to x4 avremmo avuto For B=A+1 to x3 e For C=b+1
to x4. Nell'esempio invece ciascun ciclo segmenta un intervallo di valori
che è diverso dagli altri e che (credo) non faciliti la scrittura di una sub
ricorsiva. Ecco perchè per la leggibilità inserisco le Goto e non le If Then
ciao a presto
Davide Greco

 Poi è sempre questione di gusti.
Certamente....! Ma se nella tua Sub ci sono centinaia di righe e il gosub
cominciano a diventare 4, 5, 6,...
allora non è più programmazione... diventa una spaghettata!
Comunque le cose che ti ho detto, vedrai, le capirai con l'esperienza.
Se avrai modo di avviare progetti importanti o estremamente complessi ti
renderai conto che NON usare *salti* qua e la nel codice diventerà
un'esigenza e non semplice gusto di programmazione.
Ciao, spero di esserti stato utile.
Mario.

 un'esigenza e non semplice gusto di programmazione.
Siamo d'accordo. Ma non stavo parlando di saltare qua e la. La gosub salta
solo in fondo alla routine e poi ritorna alla riga successiva del codice,
quindi non vedo come possa destrutturare il codice.
Che poi possa non piacere per motivi di estetica della programmazione, posso
anche capirlo. 8-)
Ciao
*Roby*

  Ecco perchè per la leggibilità inserisco le Goto e non le If Then
Sulla leggibilità non sono d'accordo, ma certo che il tuo sistema produce
del codice molto più veloce. Se hai problemi di velocità di esecuzione, alla
fine forse la soluzione migliore è la tua. Ma forse a questo punto conviene
riscriversi le routine più pesanti in C
Altrimenti devi pregare di non dover rimettere le mani nel codice dopo
qualche mese. 8-)
Ciao
*Roby*

>Cumunque senza Goto si può fare tutto: eccoti il tuo codice rimaneggiato:
c'è qualcosa che non va nel codice.. ho provato diverse cose ma senza
fortuna... magari se me lo davi meno rimaneggiato era meglio :-)) Ad ogni
modo posso dirti che una valida alternativa l'ha trovata frazzoli con una
funzione ricorsiva che è davvero una bomba. Per quanto mi riguarda non credo
che sarei riuscito ad arrivare alla soluzione di Frazzoli e quella che avevo
ideato io mi stava benissimo.
grazie
ciao
Davide

 funzione ricorsiva che è davvero una bomba.
E perchè non l'ho vista? Se puoi, mandala sul newsgroup oppure dimmi dove la
posso trovare.
Comunque la ricorsione è molto elegante, ma genera anche un discreto
sovraccarico di sistema a causa dell'uso dello stack. Passare da Goto alla
ricorsione è un bel salto. 8-)
Ciao
*Roby*