ciao Rosanna , mi fa molto piacere ricevere queste domande e quindi sono altrettanto
contento di rispondere, mi fa piacere perche vedere interesse per questo argomento
che cerco di divulgare mi fa capire che non sia tutto tempo perso il che è gia qualcosa
.
1) Usando delle funzioni/procedure al posto di scrivere tutto in un singolo blocco introduce
sicuramente un piccolo overhead tuttavia l'eventuale perdiata delle performance dipende anche
dal compilatore/interprete usato.
Alcuni compilatori sono maggiormente ottimizzati e producono codice piu veloce , gli script comunque
non sono compilati ma interpretati anche tra gli interpreti c'è chi lavora meglio e chi lavora peggio..
Nel caso del vbscript che gia è lento di suo la cosa secondo me è trascurabile (un mulo è sempre
lento a prescindere ...se uno volesse il cavallo ci vorrebbe un vero ambiente di sviluppo non gli
script).
Comunque il piccolissimo (impercettibile) prezzo che si paga in termini di prestazioni
si guadagna nella chiarezza e nella qualità del codice che si ottiene facendo uso corretto di sub e function.
Ovviamente non è che è per definizione che ogni script debba essere costituito da piu sub/function
Se lo script deve svolgere un compito semplice non è necessario ma in script piu complessi suddividere
in funzioni differenti aiuta a sezionare il problema e a sudduviderlo in tanti piccoli problemini
Ad esempio se in uno script che dopo fatti certi calcoli e d individuati certi numeri da giocare occorre
prima vedere se percaso si siano verificati esiti nelle estrazion precedenti è sicuramente meglio
demandare questo compito ad una function piuttosto che scrivere tutto insieme .. tieni presente che un giorno forse
potresti voler modificare il tuo script e un script scritto bene è molto piu facile da modificare
specie se lo si riguarda dopo qualche mese.
Per toglierti il dubbio vcomunque puoi fare una prova.
Inserisci all'interno del seguente codice prima lo script monoblocco e poi quello che fa uso di eventuali
sub function e constata la differenza in tempo di esecuzione.
Codice:
Option Explicit
Sub Main
Dim tInizio , tTrascorso
tInizio = Timer
'==============================================
' qui i mezzo va tutto il codice dello script
'==============================================
tTrascorso = Timer - tInizio
MsgBox "Tempo in secondi : " & tTrascorso
End Sub
2) Un esempio è gia nel capitolo che tratta le classi , il modo migiore è semplicemente passare
gia l'array come parametro della funzione , in vbscript ogni variabile e è del tipo variant
il che vuol dire che puo contenere qualisiasi cosa anche un array.
Quindi tu crei un parametro che riceve una variabile e all'uscita della funzione torna
un array valorizzato.
Se noti in questo codice di esempio il risultato che torna la funzione ci serve solo per
vedere se sia andata a buon fine , in realta i dati che ci servono davvero ce li rida dentro al
parametro aRetEstratti
Codice:
Option Explicit
Sub Main
ReDim aEstratti(0)
If GetEstrattiRuota(8000,1,aEstratti) Then
Call Scrivi(StringaNumeri(aEstratti))
Else
MsgBox "Estrazione non valida"
End If
End Sub
Function GetEstrattiRuota(idEstr,Ruota,aRetEstratti)
Dim k
ReDim aRetEstratti(5)
For k = 1 To 5
aRetEstratti(k) = Estratto(idEstr,Ruota,k)
Next
If aRetEstratti(1) > 0 Then
GetEstrattiRuota = True
End If
End Function
3) l'esempio precedente sono sicuro che gia ti consentirà di fare un po' di luce su questo tuo dubbio.
Avrai notato/dedotto che tutte el variabili che passiamo alle sub e function possono essere
alterate all'interno della procedura e che esse al loro ritorno hanno il valore che eventualmente
hanno acquisito nella sub/function questo comportamento lo sfruttiamo per farci tornare indietro i valori.
A dire il vero questo è semplicemente il comportamento di default del vb script , per fare in modo
che le variabili all'uscita delle procedure NON risultino alterate bisogna passarle byVal , invece come
dicevo per default esse sono passate byRef e non è necessario specificarlo.
Ad esempio lo script precednte se avesse la dichiarazione della variabile aRetEstratti passata byval
non funzionerebbe , attenzione non è che darebbe errore , è lecito passare le variabili byval solo
non è quello che ci serviva a noi in quel momento ..
Codice:
Function GetEstrattiRuota(idEstr,Ruota,byval aRetEstratti) ' non fa quello che vorremmo anche se è lecito
Function GetEstrattiRuota(idEstr,Ruota,byref aRetEstratti) ' fa proprio quello che ci serve in quel caso
Function GetEstrattiRuota(idEstr,Ruota, aRetEstratti) ' analogo perche byref è il default
4) certo che è corretto o lo dichiaravi come variabile oppure con redim aValori(0) poi ci pensava lui ad
alimentarlo.
Usare Option explicit è la best pratices (come si dice in gergo)
5) Il discorso Dim Redim Erase
In pratica
Se dichiari un vettore con Dim puoi tranquillamente usare Erase , il tuo vettore subira solo l'azzeramento
degli elementi mantenendo il vettore intatto quindi riutilizzabile in chiamate successive.
Se l'array invece lo avessi dichiarato con Redim usare Erase non va bene (se,pre se lo scopo èra solo quello di
cancellare i valori ) infatti in questo caso Erase cancella proprio tutto l'array , ne elimina la referenza in
memoria sicche una chiamatra successiva che ne faccia uso darebbe errore , percio in questo caso se lo scopo
è svuotare solo i valori ma non liberare la memoria allora si ricorre ad una nuova chiamata a Redim se invece
si vogliono liberare risorse perche si sa che l'array ha finito il suuo compito allora si usa Erase.
6) in verita non sbagli niente non è possibile lavorare su piu script in contemporanea o meglio il programma
puo elaborare un solo script alla volta , la finestra edit script che dici tu serve per aprire ed editare
copiare da altri script rispetto a quello eseguibile ma non per eseguirli in contemporanea.
7) dal primo menu fai apri directory dati . nella finestra di risorse del computer fai doppio click
sul file Spaziometria.ini si dovrebbe aprire notepad o qualsiasi altro editor di file di testo.
Vai nel menu cerca e digita la seguente voce <SDIRSCRIPT=> senza i simboli di <> che sono solo dei delimitatori
appena trovi la riga che la contienee sostituisci il percorso a destra del simbolo = con quello che vuoi tu
Ciao !