Les globales ne sont pas si mauvaises. Comme indiqué dans plusieurs autres réponses, le vrai problème avec ces problèmes est que votre chemin de dossier global peut être, demain, l'un des plusieurs, voire des centaines. Si vous écrivez un programme rapide et ponctuel, utilisez globals si c'est plus facile. En règle générale, toutefois, il est préférable d’envisager des multiples, même lorsque vous pensez en avoir besoin. Il n'est pas agréable de devoir restructurer un programme complexe de grande taille qui doit soudainement se connecter à deux bases de données.
Mais ils ne nuisent pas à la fiabilité. Toute donnée référencée à de nombreux endroits dans votre programme peut causer des problèmes si elle change de manière inattendue. Les énumérateurs s'étranglent lorsque la collection qu'ils énumèrent est modifiée en cours d'énumération. Les événements en file d'attente peuvent se jouer des tours. Les fils peuvent toujours faire des ravages. Tout ce qui n'est pas une variable locale ou un champ non modifiable pose un problème. Les problèmes globaux sont ce genre de problème, mais vous ne pourrez pas résoudre ce problème en les rendant non globaux.
Si vous êtes sur le point d'écrire dans un fichier et que le chemin du dossier est modifié, la modification et l'écriture doivent être synchronisées. (Comme l’un des milliers de problèmes, vous pouvez saisir le chemin, puis ce répertoire est supprimé, puis le chemin du dossier est remplacé par un bon répertoire, puis vous essayez d’écrire dans le répertoire supprimé.) Le problème existe si le chemin du dossier est global ou est l’un des milliers que le programme utilise actuellement.
Il existe un réel problème avec les champs auxquels différents événements d'une file d'attente, différents niveaux de récursivité ou différents threads peuvent accéder. Pour faire simple (et simpliste): les variables locales sont bonnes et les champs sont mauvais. Mais les anciens globaux seront toujours des champs, de sorte que cette question (si importante soit-elle) ne s’applique pas au statut Bon ou Mauvais des champs Global.
Ajout: Problèmes de multithreading:
(Notez que vous pouvez avoir des problèmes similaires avec une file d'attente d'événements ou des appels récursifs, mais le multithreading est de loin le pire.) Considérez le code suivant:
if (filePath != null) text = filePath.getName();
Si filePath
est une variable locale ou une sorte de constante, votre programme ne va pas échouer lors de son exécution car sa valeur filePath
est null. Le chèque fonctionne toujours. Aucun autre thread ne peut changer sa valeur. Sinon , il n'y a aucune garantie. Quand j'ai commencé à écrire des programmes multithreads en Java, j'ai toujours eu des exceptions NullPointerExceptions. Toutles autres threads peuvent changer la valeur à tout moment, et ils le font souvent. Comme plusieurs autres réponses le soulignent, cela crée de sérieux problèmes de test. La déclaration ci-dessus peut fonctionner un milliard de fois, en faisant l’objet de tests approfondis et complets, puis en explosant une fois en production. Les utilisateurs ne pourront pas reproduire le problème et cela ne se reproduira plus tant qu'ils ne se seront pas convaincus qu'ils voyaient des choses et les ont oubliés.
Les problèmes globaux ont définitivement ce problème, et si vous pouvez les éliminer complètement ou les remplacer par des constantes ou des variables locales, c'est une très bonne chose. Si du code sans état est exécuté sur un serveur Web, vous le pouvez probablement. En règle générale, tous vos problèmes de multithreading peuvent être résolus par la base de données.
Mais si votre programme doit se souvenir d'éléments d'une action utilisateur à l'autre, vous aurez des champs accessibles par tous les threads en cours d'exécution. Basculer un champ global vers un champ aussi non global n’améliorera pas la fiabilité.