Una procedura (anche denominata subroutine) consiste in un insieme di istruzioni deputato a compiere una serie di operazioni definite a monte dal programmatore ed attivabile semplicemente richiamandola all’interno dello script. Essa consente di eseguire parti di codice richiamandola e passandole – eventualmente - anche alcuni parametri necessari al compimento dell’operazione, indipendentemente dal punto dello script nel quale sia stata fisicamente inserita. Dopo aver eseguito il codice della procedura ed eventualmente modificato uno o più dei parametri passati, lo script riprende l’esecuzione a partire dalla riga successiva alla chiamata (call).
L’impiego delle procedure rende il codice più ordinato e pulito,
ne facilita almeno parzialmente il riutilizzo anche da parte di altri programmi
ed abbrevia notevolmente la sua scrittura.
Il più grande vantaggio, infatti, è dato proprio dalla possibilità di scrivere una sola volta un procedura che sarà poi utilizzabile in più pagine: basterà includere la pagina che contiene la procedura stessa in tutte le pagine che dovranno utilizzarla ed essa potrà essere richiamata in qualsiasi momento. A fronte pertanto di un maggiore sforzo in termini di progettazione, l’impegno profuso sarà ripagato dalla possibilità di riutilizzo, dalla semplicità e dalla pulizia del codice prodotto.
Il principale svantaggio, invece, è dovuto al fatto che in linguaggi interpretati come asp, i salti del codice rallentano i processi. In coda all’articolo ne viene offerta una piccola dimostrazione.
La sintassi standard per richiamare una procedura è la seguente:
call nome_procedura (parametro1, parametro2,…, parametro[n])
In linea generale ogni procedura segue queste regole sintattiche:
- se richiede parametri e si utilizza la parola chiave call, i parametri devono essere racchiusi tra parentesi;
- se si omette la parola chiave call, anche le parentesi possono essere omesse;
- se non ci sono parametri le parentesi possono essere omesse.
Il listato della procedura vera e propria deve essere racchiuso tra le parole chiave sub e end sub.
Nell’esempio seguente viene richiamata una procedura che esegue la somma di due numeri e li stampa a video:
<html>
<head>
<title>Sub: somma di due numeri</title>
</head>
<body>
<%
'Richiamo la procedura
call somma (5, 14)
'Codice della procedura
sub somma (numero1, numero2)
'Visualizzo il risultato
response.write ("Il risultato della somma è "& numero1
+ numero2)
end sub
%>
</body>
</html>
Potremmo anche impiegare uno dei parametri per immagazzinare dati che siano stati calcolati all’interno della procedura. In questo caso il parametro non è in input alla procedura bensì in output alla medesima.
L’esempio seguente mostra quindi come la somma, invece di essere stampata all’interno della procedura, possa essere restituita da uno dei parametri prodotti ed essere liberamente utilizzata nel successivo codice della pagina:
<html>
<head>
<title>Sub: somma di due numeri</title>
</head>
<body>
<%
'Richiamo la procedura
call somma (5, 14, outSomma)
'Visualizzo il risultato
response.write ("Il risultato della somma è "& outSomma)
'Codice della procedura
sub somma (numero1, numero2, byRef outSomma)
outSomma = numero1 + numero2
end sub
%>
</body>
</html>
Le procedure, quindi, si dimostrano uno strumento versatile ed “economico" per produrre codice efficiente, sintetico, riutilizzabile e più semplice da mantenere. Come accennato in precedenza, l’unico limite nell’utilizzo delle procedure, è legato al fatto che aumentano i tempi di elaborazione.
Il codice seguente mostra come lo stesso script impieghi un tempo di esecuzione diverso a seconda che sia eseguito al di fuori oppure all’interno di una procedura. Nel secondo caso si evidenzia addirittura un tempo di elaborazione più che doppio:
<%
'Senza procedura
inizio = timer
reiterazione = 0
for x = 1 to 250000
reiterazione = reiterazione + 1
next
fine = timer
response.write("Reiterazione x "& reiterazione & ": "&
fine - inizio)
Response.Write("<br />")
'Con la procedura
inizio = timer
reiterazione = 0
for x = 1 to 250000
call aaa
next
fine = timer
response.write("Reiterazione x "& reiterazione & ": "
& fine - inizio)
sub aaa ()
reiterazione = reiterazione + 1
end sub
%>