2009-10-29 13 views
6

Ho letto in vari punti che avere variabili con ambito globale, vale a dire una classe statica pubblica con membri statici, è considerato contrario alla filosofia di OO e non è un buon progetto. (Ad esempio, ho visto commenti sulla falsariga di: "Se stai utilizzando un globale, non lo stai facendo bene." O parole in tal senso.)Variabili globali v Impostazioni in C#

Ma, se si utilizza il meccanismo Impostazioni fornito da Visual Studio, ad es "Settings.Default.MySetting" ecc., Questo è disponibile a livello globale in tutta l'app, quindi come si differenzia dall'utilizzo di una classe statica pubblica?

Inoltre, gli stessi risultati possono essere ottenuti utilizzando un oggetto singleton, ma ciò provoca anche varie opinioni, per non dire altro.

Le variabili globali sono così utili, (Modulo VB, chiunque?), Ma sto cercando di insegnarmi come fare correttamente questo OO malarky, quindi, se le variabili globali hanno un cattivo odore da un punto di vista OO, che cosa è un'alternativa?

Sono particolarmente interessato alle opinioni della gente sull'uso della funzionalità "Impostazioni". Questo è considerato un buon design OO?

Grazie per eventuali commenti.

risposta

14

I metodi statici e gli altri membri non sono una cattiva pratica a tutti gli effetti. È solo che le persone meno familiari con i concetti OO tendono a sporcare il loro codice con metodi, proprietà e campi statici ovunque, senza rendersi conto di quali siano le conseguenze.

In genere, per cose come le impostazioni di configurazione, classi helper e utility, fabbriche astratte, singleton ecc., Che hanno membri statici è perfettamente accettabile.

1

Una classe o un membro statico pubblico non è sempre una cattiva idea (anche se non è perfettamente OO). Molti buoni design OO usano un membro statico pubblico per cose come Logger o Impostazioni (come si fa notare). Un buon esempio di come farlo in modo OO è lo Static Gateway.

1

Le variabili globali, come gotos, sono qualcosa che dovrebbe essere evitato da tutti i principianti, ma sono estremamente utili per un programmatore avanzato.

Direi che se non ti senti sicuro e non hai un motivo specifico e giustificato perché è una buona applicazione, non usarli. Master OO prima di ricorrere alle variabili globali.

0

Il meccanismo Impostazioni ... hmm ...

Guardo quelle principalmente come parte dell'ambiente. Come il sistema operativo o il tempo, ma per l'applicazione. Non sono realmente "variabili" come dichiarerebbero durante un INIT.

Tuttavia, è possibile racchiudere un oggetto intorno a loro e accedervi solo tramite tale oggetto, invece di leggerli ogni volta che sono necessari in fase di esecuzione. Non l'ho provato, ma probabilmente è un lavaggio delle prestazioni (o negativo verso la lettura raw se non si fa una buona gestione della memoria).

Alla fine, quando le applicazioni maturano, cose come questa finiscono per ottenere oggetti avvolti intorno a loro comunque. La mia regola è che, ogni volta che comincio a pensare, "nah, questo è troppo semplice, troppo atomico e non richiederà un oggetto ..." questo è il mio indizio per renderlo un oggetto.

2

In C# avrete difficoltà a contrastare il buon design OO perché non potete allontanarvi da OO. Non è come il C++ in cui è possibile combinare e strutturare con la programmazione OO, il dominio in cui spesso avvengono questi tipi di argomenti. I membri statici di una classe sono OO. Così sono le impostazioni generate da Microsoft perché la generazione del codice crea l'incapsulamento OO per loro o almeno un "contenitore di oggetti" attorno a loro. Quindi non sono mai variabili globali perché non esistono in C# - sono solo membri statici sulle classi - niente che non sia OO.

Se l'argomento riguarda i membri singleton rispetto a quelli statici, allora mette un argomento OO contro un altro argomento OO.

Quindi c'è sempre il punto di vista filosofico rispetto al punto di vista pratico. Nella maggior parte dei reami, il punto di vista filosofico ideale che viene attuato non vale davvero la pena da solo, tranne che per uno studio accademico. Il mondo reale ha bisogno di soluzioni reali, soluzioni miste.

+2

Un momento difficile? Sì. Sarà difficile fermare un determinato, incompetente dev? Mai. Ho perso il conto del numero di volte in cui ho visto qualcosa implementato in un modo che è sia più difficile che meno corretto rispetto al modo progettato. (E mentirei se dicessi che non sono mai stato colpevole di una cosa del genere.) –

+0

Buon punto Greg D. Dovresti vedere un po 'del mio vecchio codice snafus! –