I Globali non sono così male. Come affermato in diverse altre risposte, il vero problema con loro è che quello che è, oggi, il tuo percorso di cartella globale potrebbe, domani, essere uno dei tanti, o anche centinaia. Se stai scrivendo un programma rapido e unico, usa le globali se è più facile. In generale, però, tenere conto dei multipli anche quando pensi di averne bisogno solo uno è la strada da percorrere. Non è piacevole dover ristrutturare un grande programma complesso che deve improvvisamente parlare con i due database.
Ma non danneggiano l'affidabilità. Qualsiasi dato a cui si fa riferimento da più punti del programma può causare problemi se cambia in modo imprevisto. Gli enumeratori si strozzano quando la raccolta che stanno enumerando viene modificata a metà dell'enumerazione. Gli eventi della coda degli eventi possono giocare trucchi l'uno sull'altro. Le discussioni possono sempre causare il coraggio. Tutto ciò che non è una variabile locale o un campo non modificabile è un problema. I Globali sono questo tipo di problema, ma non lo sistemerai rendendoli non globali.
Se si sta per scrivere su un file e il percorso della cartella cambia, è necessario sincronizzare la modifica e la scrittura. (Come una delle mille cose che potrebbero andare storte, diciamo che prendi il percorso, poi quella directory viene cancellata, quindi il percorso della cartella è cambiato in una buona directory, quindi provi a scrivere nella directory cancellata.) Il problema esiste se il percorso della cartella è globale o è uno dei mille che il programma sta attualmente utilizzando.
C'è un problema reale con i campi a cui è possibile accedere da diversi eventi su una coda, diversi livelli di ricorsione o diversi thread. Per renderlo semplice (e semplicistico): le variabili locali sono buone e i campi sono cattivi. Ma ex globals saranno ancora campi, quindi questo problema (comunque di importanza fondamentale) non si applica allo stato Buono o Evil dei campi Globali.
Aggiunta: Problemi di multithreading:
(Si noti che si possono avere problemi simili con una coda di eventi o chiamate ricorsive, ma il multithreading è di gran lunga il peggiore.) Considera il seguente codice:
if (filePath != null) text = filePath.getName();
Se filePath
è una variabile locale o un qualche tipo di costante, il tuo programma non fallirà durante l'esecuzione perché filePath
è nullo. Il controllo funziona sempre. Nessun altro thread può cambiare il suo valore. Altrimenti , non ci sono garanzie. Quando ho iniziato a scrivere programmi multithread in Java, ho ottenuto NullPointerExceptions su righe come questa tutto il tempo. Qualsiasi altro thread può modificare il valore in qualsiasi momento e spesso lo fanno. Come molte altre risposte sottolineano, questo crea seri problemi per i test. La dichiarazione di cui sopra può funzionare un miliardo di volte, sottoponendola a test completi e completi, per poi saltare in aria una volta in produzione. Gli utenti non saranno in grado di riprodurre il problema e non accadrà di nuovo fino a quando non si saranno convinti di vedere le cose e di averlo dimenticato.
I Globali hanno sicuramente questo problema, e se puoi eliminarli completamente o sostituirli con costanti o variabili locali, questa è una cosa molto buona. Se hai un codice stateless in esecuzione su un server web, probabilmente lo puoi fare. In genere, tutti i problemi di multithreading possono essere assunti dal database.
Ma se il tuo programma deve ricordare le cose da un'azione dell'utente a quella successiva, avrai campi accessibili da qualsiasi thread in esecuzione. Passare da un campo globale a un campo non globale non aiuterà l'affidabilità.