Quando si programmano software un pò più avanzati si deve tener conto che non tutto nella vita può essere definito a priori.
Basti immaginare a chi sviluppa una semplice calcolatrice da riga di comando. Molte volte ho visto questo esempio ma l'errore sempre ricorrente era quello di accettare sempre e solo due parametri numerici ai quali applicare l'operazione prescelta. La cosa è molto utile dal lato sviluppo ma davvero poco professionale dal lato utenza.
Qualsiasi linguaggio che si rispetti da la possibilità a chi programma di scrivere funzioni che accettano anche parametri senza prima definirne l'esatte numero, semplicemente scrivendo un prototipo che indichi al sistema che tale funzione accetta parametri ma ne accetta tanti quanti l'utente ne inserisce.
Questo modo di programmare è davvero utile e flessibile e toglie dall'imbarazzo di dover specificare nei propri programmi che una certa operazione può essere eseguita solo tra due dati alla volta.
In Gambas, svolgere tale compito è davvero semplice e vedremo ora come fare.
Il passaggio indefinito di parametri prevede una struttura della funzione uguale a quelle a cui siamo abituati con una differenza nella dichiarazione dei parametri da passare in fase di esecuzione. Immaginiamo di avere la nostra funzione di nome FAddizione che deve sommare tutti i numeri interi passati come parametri (di cui ovviamente non sappiamo il numero a priori) e ne deve restituire la somma intera. Il prototipo di tale funzione sara quindi:
FAddizione (Numero1 AS Integer, Numero2 AS Integer, ...) AS Integer
Innanzitutto vediamo che la definizione prevede un costrutto del tutto simile ad una normale funzione, con la differenza che il terzo parametro viene definito come una serie di tre punti ( ... ) che sta ad indicare al linguaggio che dopo Numero2 non si sa quanti altri parametri verranno sottoposti ad operazione.
Si noti che i primi due parametri, ovvero Numero1 e Numero2, vengono definiti esplicitamente per il semplice fatto che non ha senso effettuare una somma se non ci sono almeno due numeri su cui effettuare l'operazione.
Il codice che eseguirà il lavoro voluto è il seguente:
FAddizione (Numero1 AS Integer, Numero2 AS Integer, ...) AS Integer
DIM Elemento AS Integer
DIM Risultato AS Integer
Risultato = Numero1 + Numero2
FOR EACH Elemento IN Param
Risultato = Risultato + Elemento
NEXT
RETURN Risultato
END
Dunque, come si vede la funzione, come primo passo, somma i due numeri passati esplicitamente alla funzione mediante l'operazione
Risultato = Numero1 + Numero2
Fatto ciò scorre tutti gli altri elementi passati alla funzione, non definiti, mediante il ciclo FOR EACH. Si vede infatti che è stato definito un intero all'interno della funzione di nome Elemento che indica di volta in volta nel ciclo un nuovo elemento presente in Param. Elemento viene sommato a Risultato che aggiorna, di volta in volta, il suo valore con il proprio valore precedente sommato al nuovo parametro.
Apriamo una parentesi. Param è una classe statica, di sola lettura, interna di Gambas che prevede la gestione di tutti gli extra-parametri di una funzione. Essa gode di alcune proprietà che agevolano il trattamento di questa particolare situazione.
Nel nostro caso sfruttiamo la particolarità della classe di essere enumerabile mediante il ciclo FOR EACH e di scorrerla quindi finchè c'è un dato da leggere.
Tornando al codice si può vedere come con l'istruzione:
RETURN Risultato
Restituisce alla fine di tutto il dato voluto.
CONSIDERAZIONI
L'uso di questo tipo di struttura e del suo costrutto deve diventare una prassi per i codici che richiedono la risoluzione di questi tipi di situazioni poichè può accadere che all'utente serva passare un grosso numero di parametri e si costringerebbe chi opera sul nostro software a creare numerosi cicli, dispendiosi in termini di tempo, per effettuare semplici operazioni.
Ovviamente rimango a vostra disposizione per chiarimenti in merito a questo articolo.
0 commenti:
Posta un commento