I globuli non sono poi così male. Come affermato in molte altre risposte, il vero problema è che oggi il percorso della cartella globale potrebbe essere uno o più centinaia. Se stai scrivendo un programma rapido e unico, usa i globi se è più facile. In generale, tuttavia, consentire i multipli anche quando pensi solo di averne bisogno è la strada da percorrere. Non è piacevole dover ristrutturare un programma ampio e complesso che improvvisamente deve parlare con due database.
Ma non danneggiano l'affidabilità. Qualsiasi dato a cui si fa riferimento da molte parti del programma può causare problemi se cambia in modo imprevisto. Gli enumeratori si bloccano quando la raccolta che stanno enumerando viene modificata a metà dell'enumerazione. Gli eventi in coda agli eventi possono giocare brutti scherzi. Le discussioni possono sempre provocare scompiglio. Tutto ciò che non è una variabile locale o un campo immutabile è un problema. I globi sono questo tipo di problema, ma non lo risolverai rendendoli non globali.
Se stai per scrivere su un file e il percorso della cartella cambia, la modifica e la scrittura devono essere sincronizzate. (Come una delle mille cose che potrebbero andare storte, supponiamo di afferrare il percorso, quindi quella directory viene eliminata, quindi il percorso della cartella viene modificato in una buona directory, quindi si tenta di scrivere nella directory eliminata.) Il problema esiste se il percorso della cartella è globale o è uno dei mille che il programma sta attualmente utilizzando.
Esiste un vero problema con i campi a cui è possibile accedere da diversi eventi su una coda, diversi livelli di ricorsione o thread diversi. Per renderlo semplice (e semplicistico): le variabili locali sono buone e i campi sono cattivi. Ma gli ex globuli continueranno ad essere campi, quindi questo problema (per quanto di fondamentale importanza) non si applica allo stato Bene o Male dei campi globali.
Aggiunta: problemi di multithreading:
(Nota che puoi 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 programma non fallirà durante l'esecuzione perché filePath
è nullo. Il controllo funziona sempre. Nessun altro thread può modificarne il valore. Altrimenti , non ci sono garanzie. Quando ho iniziato a scrivere programmi multithreading in Java, ho sempre ricevuto NullPointerExceptions su righe come questa. Qualunquealtri thread possono modificare il valore in qualsiasi momento e spesso lo fanno. Come diverse altre risposte sottolineano, questo crea seri problemi per i test. La dichiarazione di cui sopra può funzionare un miliardo di volte, superando test approfonditi e completi, quindi esplodere una volta in produzione. Gli utenti non saranno in grado di riprodurre il problema e non accadrà più fino a quando non si saranno convinti di vedere le cose e di averlo dimenticato.
I globali hanno sicuramente questo problema, e se riesci a eliminarli completamente o sostituirli con costanti o variabili locali, questa è un'ottima cosa. Se hai un codice stateless in esecuzione su un server web, probabilmente puoi farlo. In genere, tutti i problemi di multithreading possono essere rilevati dal database.
Ma se il tuo programma deve ricordare cose da un'azione dell'utente alla successiva, avrai campi accessibili da tutti i thread in esecuzione. Passare da un campo globale a un campo così non globale non aiuterà l'affidabilità.