PDA

Visualizza la versione completa : [OT]: Perche' evitare le variabili globali?


akiross
28-09-2005, 18:01
Salve,

Nonostante siano diversi anni che programmo, e che sento dire che le variabili globali non vanno usate.

Io onestamente mi sono sempre rifatto alla mia logica, e usavo le globali solo se ne ho bisogno in ogni funzione, o se ho bisogno di performance.

Dopo tutti questi anni pero' ho dimenticato le ragioni per cui non vanno usate, e onestamente cercando un po su google non riesco a trovare qualche cosa che mi spieghi seriamente il perche' non vanno usate.

Fin ora ho trovato cose tipo:
perche' generano confusione
perche' occupano memoria
perche' sono causa di comuni bug (???)

a questo punto mi dico: le globali non sono sbagliate. E' sbagliato usarle male, ma se esistono significa che un motivo c'e'.

La mia vera conclusione e' stata: se sei stupido evita le globali, ma non perche' facciano male, ma perche' non le sai usare come si deve.

Ad esempio le performance: inutile passare una variabile tra 1000 funzioni del programma quando posso lasciarla globale, oppure e' inutile creare una struttura dati quando poi devo passarla a tutte le funzioni... mi sembra logico che in questi casi le variabili siano globali.

Quindi chiedevo a voi, se avete delle documentazioni o dei motivi, o dei casi in cui e' meglio o peggio usare le globali.

Grazie in anticipo
ciauz

Michele Facchin
28-09-2005, 18:19
Io sono molto contrario alle globali.

Il motivo non lo saprei, che per me l'informatica logica, e sinceramente non vedo logica utilizzando le variabili globalli.

Se devi passare ad una funzione delle variabili, che fai? Ne metti 200 globali e poi metti 200 funzioni?

L'informatica una materia con cu si deve imparare, e quindi anche ad usare le variabili.

E poi una questione di stile, come vuoi, alla fine l'importante che ti piaccia a te il programma.

alka
28-09-2005, 18:27
Non programmo in C/C++, bens in Delphi, ma suppongo che le regole siano sempre le stesse.

In genere, bene evitare variabili globali per via della dispersione che creano all'interno del codice, anche se ovviamente il grado di rischio dipende sostanzialmente dall'accortezza dello sviluppatore.

Usando variabili globali puoi incappare in alcune casistiche che sarebbero da evitare, come ad esempio un "name clashing" con una variabile locale (due variabili con lo stesso nome) che ti porta a riflettere su quale delle due prioritaria, oppure in fase di debugging potresti avere problemi in quanto, esaminando il valore della variabile globale, non lo trovi come dovrebbe essere ma non sai quale procedura o funzione ha portato a quel risultato.

Sono tutte problematiche che si eludono facilmente seguendo un approccio pi OOP, incapsulando e facendo in modo che ogni variabile o campo che sia venga modificato solo dalle routine che ne hanno l'autorit (seguendo la logica del programma) o comunque in modo controllato e facilmente tracciabile.

Ciao! :ciauz:

pprllo
28-09-2005, 19:01
Suppongo per la stessa ragione per cui non si usano i goto, ovvero che creano confusione. Di solito si tende a fare in modo che le funzioni siano "compatte", quindi l'utilizzo eccessivo di globali pu generare casini nella comprensione. Comunque non c' un motivo "vero", se non la consuetudine. Io trovo che ci siano situazioni in cui NECESSARIO usare delle variabili globali. Prendiamo un problema semplice come sapere quali tasti sono premuti in Windows e poi usare questo dato in molteplici funzioni. Con le globali si risolve in 3 secondi. Senza globali uno smaciullamento di palle.
Personalmente, lo stesso discorso secondo me vale per le classi e le funzioni friend, che vengono sconsigliate ma che io trovo utili in alcune situazioni. Caso tipo: volete fare una classe che sia accessibile solo da altre 2 o pi classi, ma non dal resto del programma. Con la possibilit di dichiarare classi friend si risolve facilmente, altrimenti un discreto casino.

DYNAM!C+
28-09-2005, 20:14
teoricamete non c' nessun problema, oltre ad una questione di stile, ma visto che il programma tuo puoi scrivertelo come vuoi...

come la storia del "goto" insomma...


tecnicamente pero' una variabile globale (sia indirizzo che dati) occupa memoria, sia in dimensioni del programma finale che in memoria allocata in fase di runtime.
se usi le variabile locali, quasi sempre queste vengono create "dinamicamente" servendosi dello stack.


mah, visto che cmq i compilatori (per efficienza) allineano i dati in doppie parole o pagine, sprecando spazio, puoi indistintamente usare anche le variabili globali.

se devi fare un programma openSource o utilizzabile da altri utenti, conviene farlo comprensibile ad altre menti :)

Alvaro Vitali
28-09-2005, 20:23
C' anche un inefficiente uso della memoria, le globali sono inizializzate smepre e comunque, le locali solo all'occorrenza.

infinitejustice
28-09-2005, 21:44
Le variabili globali rendono il codice non portabile, senza contare i problemi legati a cambi nel progetto all'ultimo momento, n a quelli legati al concetto di runtime static initialization delle variabili globali.

akiross
28-09-2005, 22:17
Bhe dalle vostre risposte mi sembra proprio come pensavo: se il programmatore non e' un incompetente le globali vanno anche bene :)

Se sai che la g. dura per tutto il programma, la userai per tutto il programma.
Se conosci la regola dell'ultima dichiarazione, sai che le locali sovrascrivono le globali, e le puoi usare tranquillamente.
Se le globali non le dichiari per 2 cagate che usi saltuariamente, non aggiungi molta confusione al programma.

Si insomma, mi pare di capire che vadano bene se sai quello che stai facendo... un po' come dire che un fucile a canne mozze puo' anche andare bene per un cacciatore con molta esperienza, ma per un novizio meglio di no, sono piu' i danni che altro ;)

Quindi mi pare di capire che sia per lo piu' una questione di "codice pulito" e "abilita' del programmatore".

Grazie per le vostre opinioni.

Riguardo ai goto, non sono contrario, proprio come le globali. L'importante e' usarli bene. Tempo fa ho letto un documento di Linus Torvald che spiegava del perche' i goto non sono un male. Esistono casi in cui e' molto comodo, **veloce** e assolutamente chiaro. Ovviamente i goto creano problemi quando si usa a mo' di assembly o basic, che li usi per fare salti da posti completamente distanti tra loro, ma solitamente i goto in C si usano per fare veloci salti fuori da cicli e strutture nestate.


Pero' sono interessato particolarmente alla risposta di infinitejustice: perche' dici che le globali rendono il codice non portabile?
I problemi di cambio nel progetto all'ultimo momento non mi riguardano, sono scrupoloso quando lavoro da solo e anche quando sono in gruppo, solitamente evito i cambi all'ultimo momento, e se ce ne sono talmente drastici da ostacolarmi il codice, bhe riscrittura.

Riguardo al runtime static initialization, onestamente ho qualche difficolta' a capire di cosa parli, ma da una veloce ricerca su google sembra proprio che non mi riguardi (visto che il C per quanto mi ricordo e' grezzo (per questo lo amo) e non ha features legate al realtime, almeno per quello che ricordo al momento).
Al massimo C++ ma se posso lo evito.

Comunque mi interessa sapere riguardo alla portabilita'.

Grazie a tutti
Ciauz

infinitejustice
29-09-2005, 09:02
Pero' sono interessato particolarmente alla risposta di infinitejustice: perche' dici che le globali rendono il codice non portabile?

Perche quando delle funzioni sono legate ad una o piu globali, se vuoi riutilizzarle devi portarti dietro tutte le globali da cui dipendono, nonch tutte le altre funzioni che non c'entrano niente ma che manipolano le globali (perche magari senza di loro il valore della globale nn quello che dovrebbe).

Annulli cio il concetto di indipendenza funzionale (suddividere un problema in tanti problemi piu piccoli, semplici ed indipendenti fra loro).

Pensa se tu avessi un tuo progetto con un tot di variabili globali e decidessi di acquistare o usare una libreria che al suo interno ha variabili globali con gli stessi nomi... se il tuo progetto uno due file passi, se inizi ad avere un progettino importante...


Ti ritrovi inoltre oggetti che vivono per tutta la durata del programma e a cui tutti possono accedere. Devi quindi sempre tener sotto controllo chi fa cosa su chi.



E' buona regola (e se lo ci sara un motivo ;) ) limitare visibilita e durata delle variabili allo spazio dove queste servono davvero.

Es. in C++ nei cicli
for(int i; ...)

Generalmente in C c' chi invece dichiara subito i e poi la utilizza per i piu svariati motivi per tutto il programma.



I problemi di cambio nel progetto all'ultimo momento non mi riguardano e se ce ne sono talmente drastici da ostacolarmi il codice, bhe riscrittura.

Nel mondo del lavoro ti picchiano se a due giorni dalla consegna riscrivi tutto. Perche riscrivere tutto vuol dire cattiva progettazione ed analisi dei requisiti...



Riguardo al runtime static initialization, onestamente ho qualche difficolta' a capire di cosa parli

Piu semplicemente, cosa succede se le globali nn possono essere inizializzate a tempo di compilazione ma solo run time ? :)

oregon
29-09-2005, 13:02
Oltre a quanto detto, fornisco una visione piu' "teorica" del problema.

In informatica, l' "accoppiamento" misura le interrelazioni che esistono tra
i moduli di un programma. Un alto accoppiamento e' negativo. L'uso di variabili
globali "aumenta" l'accoppiamento e quindi tale uso e' ritenuto molto negativo.

Il funzionamento di un modulo di un programma fa riferimento ad una "lista di
interfaccia" in cui vengono presentati i dati di ingresso/uscita affinche' il
modulo possa svolgere il proprio lavoro.

Ogni modulo si comporta da "black box" e quindi non risulta importante come
lavora al suo interno ma solamente la sua "interfaccia".

Se il lavoro di ogni modulo dipende anche da dati globali dichiarati e inizializzati
in altri moduli (piu' di uno) ecco che il funzionamento del primo modulo non
e' descrivibile interamente con quella che e' la propria "interfaccia" ma dipende
(va in coppia, si accoppia ...) a quello che e' espresso in un altro modulo.

La modifica del valore di inizializzazione di un dato condiviso (o del suo valore
all'interno di un altro modulo) puo' determinare, all'interno di un certo modulo
la variazione del suo comportamento inducendo facilmente bug per cui non si erano
previsti alcuni effetti del cambio di valore.

Dato che l'uso di variabili globali non e' mai "necessario", il suo uso e' per
questo da evitare.

Loading