Successivo: , Su: Funzioni di libreria   [Contenuti][Indice]


10.1 Dare un nome a variabili globali in funzioni di libreria

Per come si è sviluppato il linguaggio awk, le variabili sono o globali (usabili dall’intero programma) o locali (usabili solo in una specifica funzione). Non c’è uno stato intermedio analogo alle variabili statiche in C.

Le funzioni di libreria hanno spesso necessità di avere variabili globali da usare per conservare informazioni di stato tra successive chiamate alla funzione; per esempio, la variabile di getopt() _opti (vedi la sezione Elaborare opzioni specificate sulla riga di comando). Tali variabili vengono dette private, poiché le sole funzioni che devono usarle sono quelle della libreria.

Quando si scrive una funzione di libreria, si dovrebbe cercare di scegliere per le variabili private dei nomi che non entrano in conflitto con nessuna delle variabili usate da un’altra funzione di libreria o dal programma principale di un utente. Per esempio, un nome come i o j non è una buona scelta, perché i programmi a livello utente usano spesso nomi di variabile come questi per le proprie elaborazioni.

I programmi di esempio mostrati in questo capitolo usano per le loro variabili private nomi che iniziano con un trattino basso(‘_’). Generalmente gli utenti non usano trattini bassi iniziali nei nomi di variabile, così questa convenzione riduce le possibilità che il nome di variabile coincida con un nome usato nel programma dell’utente.

Inoltre, parecchie funzioni di libreria usano un prefisso che suggerisce quale funzione o gruppo di funzioni usa quelle variabili; per esempio, _pw_byname() nelle routine che consultano la lista degli utenti (vedi la sezione Leggere la lista degli utenti). L’uso di questa convenzione viene raccomandata, poiché riduce ulteriormente la possibilità di conflitti accidentali tra nomi di variabile. Si noti che questa convenzione può anche essere usata per i nomi di variabile e per i nomi delle funzioni private.68

Come nota finale sui nomi delle variabili, se una funzione rende disponibile una variabile globale per essere usata da un programma principale, è una buona convenzione quella di far iniziare i nomi di queste variabili con una lettera maiuscola; per esempio, Opterr e Optind di getopt() (vedi la sezione Elaborare opzioni specificate sulla riga di comando). La lettera maiuscola iniziale indica che la variabile è globale, mentre il fatto che il nome della variabile non è tutto in lettere maiuscole indica che la variabile non è una delle variabili predefinite di awk, come FS.

È importante anche che tutte le variabili nelle funzioni di libreria che non abbiano la necessità di essere conservate per tutta la durata del programma siano, di fatto, dichiarate come locali.69 Se ciò non viene fatto, la variabile potrebbe essere usata accidentalmente nel programma dell’utente, conducendo a errori che sono molto difficili da scoprire:

function lib_func(x, y,    l1, l2)
{
    …
    # qualche_var dovrebbe essere locale ma per una svista non lo è
    uso della variabile qualche_var
    …
}

Una differente convenzione, comune nella comunità Tcl, è quella di usare un solo vettore associativo che contiene i valori necessari alle funzioni di libreria, o “package.” Questo riduce significativamente il numero degli effettivi nomi globali in uso. Per esempio, le funzioni descritte in Leggere la lista degli utenti potrebbero aver usato gli elementi di vettore PW_data["inizializzato"], PW_data["totale"], PW_data["contatore"], e PW_data["awklib"], al posto di _pw_inizializzato, _pw_totale, _pw_awklib e _pw_contatore.

Le convenzioni illustrate in questa sezione sono esattamente quello che indica il termine: convenzioni. Non si è obbligati a scrivere i propri programmi in questo modo: è solo auspicabile che lo si faccia.

A partire dalla versione 5.0, gawk fornisce un meccanismo efficiente per risolvere i problemi descritti in questa sezione: gli spazi-dei-nomi (spazi-dei-nomi). Gli spazi-dei-nomi e il loro utilizzo sono descritti in dettaglio in Spazi-dei-nomi in gawk.


Note a piè di pagina

(68)

Sebbene tutte le routine di libreria si sarebbero potute riscrivere usando questa convenzione, ciò non è stato fatto, per far vedere come lo stile di programmazione in awk si è evoluto e per fornire alcuni spunti per questa spiegazione.

(69)

L’opzione da riga di comando di gawk --dump-variables è utile per verificare questo.


Successivo: , Su: Funzioni di libreria   [Contenuti][Indice]