Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    [C] Perche' evitare le variabili globali?

    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
    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

  2. #2
    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.

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    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.

  5. #5
    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
    DYNAMIC+ [ E-mail ]

    Secondo me non si può fare!

  6. #6
    C'è anche un inefficiente uso della memoria, le globali sono inizializzate smepre e comunque, le locali solo all'occorrenza.

  7. #7
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    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.
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  8. #8
    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
    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

  9. #9
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    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 ?
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.