Come evitare le variabili globali?

0

Sto usando c # ma la domanda era più rivolta ai principi di ingegneria del software, quindi ti sto ponendo la domanda qui.

Ci sono così tante domande qui ma per lo più dicono: "Come usare le variabili globali in c #?" e "Le variabili globali sono cattive?". Ma la mia domanda riguarda "Come" per evitare variabili globali nel mio scenario.

Ho scritto una classe che funziona come livello di accesso ai dati. Ho 2 oggetti di questa classe. Uno punta al database principale e il secondo al database dei report. La stringa di connessione non è una costante, piuttosto un modulo viene visualizzato all'avvio dell'applicazione e l'utente inserisce il nome del server, il nome di accesso e la password. Ora tutte le altre classi devono utilizzare questi oggetti per lavorare con il database.

Ho la netta sensazione che questi 2 oggetti dovrebbero essere globali ma voglio evitare se in qualche modo è possibile?

    
posta Khan 29.04.2017 - 09:43
fonte

2 risposte

2

È una questione di dipendenze. La stringa di connessione e le credenziali potrebbero essere passate al costruttore della classe del livello di accesso ai dati. Gli oggetti che dipendono dal DAL possono essere passati un riferimento all'istanza DAL nel loro costruttore.

Se hai due DAL separati, gli oggetti che dipendono da entrambi dovrebbero passare entrambe le istanze DAL nel costruttore.

Passando le dipendenze nei costruttori anziché accedere ai globali, la catena delle dipendenze diventa più esplicita e si evitano le dipendenze "nascoste".

    
risposta data 29.04.2017 - 11:19
fonte
0

Sono in qualche modo insicuro chi dice che gli oggetti globali sono sempre cattivi. Esiste almeno un modello orientato agli oggetti ben accettato che coinvolge esplicitamente gli oggetti globali - il modello singleton. Per C #: link

"Le variabili globali sono cattive" probabilmente significa semplicemente che non dovresti memorizzare le due istanze della tua classe DAL in alcune variabili accessibili a livello globale. E in effetti questo non è necessario. Dato che hai due istanze, il modello singleton non funzionerà. Ma potresti avere una semplice classe factory / pool. Avrebbe un metodo getDAL (id) che prenderebbe una stringa identificativa ("main" o "reports") e restituirà l'oggetto DAL (e lo creerà se non esiste ancora). Quindi, in ciascun oggetto che utilizza un DAL, è possibile recuperare l'oggetto DAL necessario in una variabile locale.

Ecco il vantaggio rispetto alla semplice presenza di variabili globali. Immagina che un terzo database sia aggiunto in seguito. È possibile passare a utilizzarlo ovunque semplicemente passando l'ID in cui viene recuperato l'oggetto DAL, senza passare attraverso tutti i riferimenti a una variabile globale.

    
risposta data 30.04.2017 - 03:29
fonte

Leggi altre domande sui tag