Perché utilizzare una variabile locale su una variabile globale? [duplicare]

4

Sono un principiante che utilizza Visual Studio 2013 e so cosa sono, ma sono perplesso, perché dovrei usare una variabile locale? Userei sempre una variabile globale.

    
posta Modrisco 14.05.2016 - 11:32
fonte

4 risposte

14

Questa è una bella domanda! Gran parte dei consigli di programmazione e delle "migliori pratiche" si riduce alla questione della gestione della complessità. O per dirla chiaramente: come scrivere e gestire un grande programma complesso senza essere sopraffatti. La soluzione è (come con la maggior parte dei problemi di grandi dimensioni) per dividerlo in pezzi più piccoli e più gestibili.

Ogni variabile è un po 'complessa, ma una variabile globale aggiunge complessità all'intero programma (perché potrebbe avere effetti su tutto il programma, da cui il nome), mentre una variabile locale aggiunge complessità solo in una singola unità isolata, la funzione.

La peggiore paura di uno sviluppatore è quella di avere un programma in cui un cambiamento in una singola funzione fa fallire una parte totalmente diversa del programma. Ogni variabile globale aumenta questo rischio.

    
risposta data 14.05.2016 - 11:49
fonte
3

Una variabile globale consente a diversi componenti di comunicare leggendo e scrivendo in una posizione di memoria comune. In questo modo, le diverse componenti dipendono l'una dall'altra / accoppiate: ogni componente ha aspettative sui valori contenuti nella variabile globale e tutti gli altri componenti devono soddisfare tali aspettative se si desidera che il programma funzioni correttamente.

L'accoppiamento aumenta la complessità del tuo software: quando modifichi un pezzo di codice, devi tenere a mente tutte le possibili ripercussioni della modifica su altri componenti che dipendono da esso.

Quindi, usando una variabile locale diminuisci le dipendenze tra i tuoi componenti, cioè diminuisci la complessità del tuo codice. Dovresti utilizzare la variabile globale solo quando hai veramente bisogno di condividere i dati, ma ogni variabile dovrebbe essere sempre visibile nel più piccolo ambito possibile.

    
risposta data 14.05.2016 - 11:52
fonte
1

Cercare di pensare a un esempio in cui le variabili locali sono indispensabili rispetto alle sole buone pratiche.

Considera un carrello con articoli e tasse.

Global double CostOfShopping 

AddItem(item)
{
    CostOfShopping += item.price
}

AddTax()
{
    CostOfShopping =* TaxRate
}

Quindi l'ordine in cui aggiungiamo elementi e le imposte sul calcolo possono modificare il costo di acquisto. Esp. Se aggiungiamo due articoli!

Vs

double GetCostOfShopping(items)
{
    var tot = 0;
    Foreach(item)
        tot+=item.price;
    tot = tot * taxRate;
    return tot;
}

Poiché totalizzi una variabile locale, controlli l'ordine del calcolo all'interno della funzione e impedisci l'aggiunta di elementi dopo il calcolo delle imposte

    
risposta data 14.05.2016 - 14:03
fonte
1

Oltre alle altre risposte soddisfacenti, dovremmo prendere in considerazione le nozioni separate ma strettamente correlate di durata variabile, portata variabile e permesso di accesso; consideriamoli relativi al concetto di variabili globali, statiche e locali. Prendere in giro questi aspetti ci consentirà di analizzare alcune delle differenze nelle dichiarazioni.

E il punto che @JacquesB fa sulla complessità del programma è azzeccato.

Ciascuno dei precedenti può essere usato per ridurre o ingrandire la complessità del programma.

La durata è la durata effettiva della variabile; semplicemente, quanto dura la variabile. Una variabile globale vive per la durata dell'intero programma. Una variabile locale vive per la lunghezza del metodo in cui si trova (differenze minori nei linguaggi di programmazione e la nozione di ambito). Una variabile che vive più a lungo ha un maggiore effetto potenziale sulla complessità del programma. Le variabili statiche hanno la stessa durata delle variabili globali.

Si noti inoltre che quando ci sono più variabili dell'intero ciclo di vita del programma (globale o statico), esistono problemi di ordinamento di inizializzazione (che sono o non sono risolti dall'ordinamento di inizializzazione della lingua). Sono presenti anche i problemi relativi all'ordine di terminazione.

L'ambito è una nozione del contesto e dell'ambiente della condivisione. La maggior parte delle lingue consente la nidificazione di ambiti. Una variabile globale è nello scope più grande, il che significa che è condivisa con tutti gli altri codici. Una variabile statica è (potenzialmente) ristretta rispetto alla classe che la sta definendo, quindi la condivisione può essere limitata alla sola classe piuttosto che a tutte le funzioni (anche le differenze di modulo nei linguaggi di programmazione e la nozione di permesso di accesso). Una variabile locale è dichiarata uno degli ambiti più piccoli possibili, che è l'ambito della funzione, e come tale è accessibile solo al codice all'interno della funzione. Alcune lingue consentono agli ambiti interni di restringere ulteriormente la condivisione della variabile anche a un numero inferiore di codice.

Solitamente le variabili dichiarate in una funzione o in uno scope nidificato hanno anche una durata dell'ambito nidificata o della funzione, ma questo non è sempre il caso a causa delle differenze linguistiche e delle funzionalità come le chiusure, che possono estendere efficacemente la durata delle variabili locali. / p>

Permessi di accesso concedono permessi di lettura e / o scrittura a vari tipi di pubblico. Quando parliamo di variabili globali, il permesso di accesso connotato è generalmente sia in lettura che in scrittura, il permesso più permissivo. Le lingue che supportano variabili statiche d'altra parte, in genere consentono l'applicazione di restrizioni di accesso personalizzate, come pubbliche o private. Essere pubblico equivale a lettura / scrittura globale e accesso privato alla limitazione dell'ambito (ad esempio la classe di definizione).

Le variabili locali, per definizione nella maggior parte delle lingue sono inaccessibili ad altri codici in altre funzioni, sebbene le lingue generalmente non tentino di limitare la lettura e la scrittura per i locali (sebbene alcuni linguaggi come Swift e Javascript (e altri) supportino write-once (inizializza solo) tramite una parola chiave LET o const , da non confondere con la parola chiave LET di VB per l'assegnazione del valore rispetto a SET per l'assegnazione di riferimento).

Il ragionamento su gran parte di ciò che sta accadendo riguardo allo stato in ambito funzionale non richiede l'analisi completa del programma (differenze del linguaggio modulo e metodi di passaggio parametri).

In sintesi

Le variabili globali vivono per tutta la durata del programma, sono condivise con tutte le funzioni e generalmente consentono di leggere e & accesso in scrittura.

Le variabili statiche vivono per tutta la durata del programma; consentire l'ambito limitato (alla classe) e consentire potenzialmente diversi permessi di lettura e scrittura.

Le variabili locali, d'altra parte, vivono per tutta la durata dell'ambito (funzione o altro), sono condivise solo per il codice nello stesso ambito.

Scomponendo questi aspetti della dichiarazione delle variabili, puoi probabilmente immaginare l'effetto che ciascuno di questi ha sulla potenziale complessità e lo sforzo richiesto dagli umani o dagli strumenti per quanto riguarda l'analisi di ciò che il programma sta facendo o potrebbe fare.

    
risposta data 14.05.2016 - 18:58
fonte

Leggi altre domande sui tag