Le variabili globali statiche sono pessime come le variabili globali? Come evitare di usarli?

4

In generale, so che le variabili globali sono cattive e dovrebbero essere evitate. Le variabili globali statiche sono ugualmente cattive?

In tutti i miei progetti, ho fatto molto affidamento sulle variabili globali statiche. Dal punto di vista del design, come posso evitare di usarli.

Ex Caso di utilizzo:

Ogni volta che la chiave viene cambiata (con altri thread), viene eseguito il mio notificatore di chiamata in cui aggiorno la mia variabile globale statica con la nuova chiave. Questa chiave è utilizzata ovunque nel programma per decrittografare alcuni dati.

Come posso evitare i globals statici in questo caso?

    
posta mk.. 07.04.2016 - 04:10
fonte

4 risposte

9

Whenever the key is changed(by some other threads), my call back notifier is executed in which I update my static global variable with the new key. This key is used everywhere in the program to decrypt some data.

Ciò che ti sta intrappolando in questo tipo di pensiero è il concetto di "chiave". Dovrebbe essere "una chiave".

Pensa che la chiave sia globale, quindi qualsiasi cosa possa trattenerla deve essere globale. Immagina di cambiare le tue esigenze e all'improvviso ci sono 5 tasti in giro.

Non riesci a immaginarlo? Bene, immagina 5 sistemi, che fanno quasi la stessa cosa, che devono avere chiavi diverse e tutti devono essere parte della tua applicazione. Quanto del tuo codice potrebbe essere riutilizzato?

La chiave appartiene a un contesto. All'interno di quel contesto ci sarà solo una chiave. Ma ciò non significa che ci sarà sempre un solo contesto.

Piuttosto che forzare tutto per trovare questa chiave conoscendo "l'unica vera chiave", dì loro in quale contesto si trovano passandole in qualche modo per trovare la chiave che gli interessa.

Ciò significa che la chiave verrà comunque memorizzata in un unico posto. Ma ora solo un posto decide dove si trova quel posto. Se lo fai globale allora tutto deve sapere dove è e CONVENIRE su dove si trova. Ick.

    
risposta data 07.04.2016 - 10:45
fonte
2

Una variabile globale statica è la stessa variabile globale, solo con una visibilità limitata in fase di compilazione, come le notifiche di @ 5gon12eder sopra.

Lo stato statico globale è soggetto a condizioni di gara. Se hai più thread che accedono a questo stato, potresti aver bisogno di essere bloccato. Se hai solo un thread autorizzato a modificare il valore, potresti comunque avere condizioni di competizione a meno che altri thread non facciano una copia del valore una volta e non dipendano da letture ripetute della variabile globale che restituisce lo stesso valore.

Se sei un esperto nella scrittura del codice di gestione dei blocchi, puoi stare bene con quello. Ma probabilmente non farai questa domanda allora.

Se hai un programma a thread singolo, questi problemi spariscono principalmente; i problemi rimanenti potrebbero non essere contati, per le interazioni tra le funzioni tramite il valore globale.

Questo è tutto noto, l'ho appena riassunto.

    
risposta data 07.04.2016 - 05:00
fonte
2

Il problema più grande con una variabile globale è che è globale, quindi chiunque può accedervi e modificarlo in qualsiasi momento. Questo problema è immensamente ridotto con una variabile statica, perché tutto il codice che accede e modifica la variabile si trova in quel file e, si spera, sotto il tuo controllo. (Non esiste una variabile "statica globale", cioè contraddittoria: si intende una variabile statica con la stessa durata di vita dell'applicazione).

Il secondo grosso problema con una variabile globale è che potresti non averne bisogno, ma due o più. Sì, quel problema rimarrà lo stesso. Se il tuo codice è limitato dal fatto che esiste solo una variabile globale one , allora perdi funzionalità, o il tuo codice potrebbe non essere thread-safe, e così via. Questo è un problema e deve essere gestito per una variabile statica come per una variabile globale.

A seconda della lingua, può essere il fatto che sia una variabile semplice a causare problemi. Di solito è possibile accedere a variabili semplici senza alcuna precauzione. Se questo è un problema, probabilmente hai bisogno di alcune funzioni di accesso. Avresti una variabile statica accessibile solo ad un accessor. Ciò non aiuta se il problema è solo avere uno stato globale, ma aiuta se il problema è l'accesso incontrollato a quello stato globale.

    
risposta data 07.04.2016 - 10:55
fonte
0

Stai ponendo la domanda giusta: dal punto di vista del design, cosa puoi fare per evitare l'uso di variabili globali.

Il grande indizio qui è che tu dici di fare molto affidamento sulle variabili globali. Questo mi dice che i tuoi progetti non sono abbastanza modulari. L'ho già visto in vecchi progetti incorporati che sono cresciuti da piccoli anelli facili da capire a brutti animali.

Un buon design modulare ha molti vantaggi, tra cui l'eliminazione dell'uso di questi globali e la semplificazione del TDD - il test dell'unità è molto più semplice. Il tuo modulo potrebbe avere i propri dati statici interni che sono "globali" per il modulo, ma nulla al di fuori del modulo può accedervi. Creerai le funzioni di accesso secondo necessità, in modo che altre parti del programma possano svolgere il loro lavoro. Questo approccio ti costringe a riflettere attentamente su ciò che stai facendo e a cercare di creare moduli che facciano un lavoro specifico.

Un vantaggio collaterale di questo approccio è che inizierai a essere in grado di riutilizzare questi moduli in altri progetti poiché sono diventati più generici in funzione.

    
risposta data 09.04.2016 - 01:58
fonte

Leggi altre domande sui tag