Il y a beaucoup de raisons pour lesquelles les globaux sont mauvais en POO.
Si le nombre ou la taille des objets à partager est trop important pour être efficacement transmis dans les paramètres de fonction, tout le monde recommande généralement l' injection de dépendances plutôt qu'un objet global.
Cependant, dans le cas où presque tout le monde a besoin de connaître une certaine structure de données, pourquoi l'injection de dépendance est-elle meilleure qu'un objet global?
Exemple (simplifié, pour montrer le point en général, sans plonger trop profondément dans une application spécifique)
Il existe un certain nombre de véhicules virtuels qui ont un grand nombre de propriétés et d'états, du type, du nom, de la couleur, de la vitesse, de la position, etc. Un certain nombre d'utilisateurs peuvent les contrôler à distance, et un grand nombre d'événements (les deux utilisateurs- initiés et automatiques) peuvent changer beaucoup de leurs états ou propriétés.
La solution naïve serait de simplement en faire un conteneur global, comme
vector<Vehicle> vehicles;
qui peut être consulté de n'importe où.
La solution la plus conviviale pour les POO serait que le conteneur soit membre de la classe qui gère la boucle d'événement principale et qu'il soit instancié dans son constructeur. Chaque classe qui en a besoin, et qui est membre du thread principal, aura accès au conteneur via un pointeur dans son constructeur. Par exemple, si un message externe arrive via une connexion réseau, une classe (une pour chaque connexion) gérant l'analyse prendra le relais et l'analyseur aura accès au conteneur via un pointeur ou une référence. Maintenant, si le message analysé entraîne soit un changement dans un élément du conteneur, ou nécessite certaines données pour effectuer une action, il peut être géré sans avoir besoin de lancer des milliers de variables via des signaux et des emplacements (ou pire, les stocker dans l'analyseur pour être récupéré plus tard par celui qui a appelé l'analyseur). Bien sûr, toutes les classes qui reçoivent l'accès au conteneur via l'injection de dépendances font partie du même thread. Différents threads n'y accéderont pas directement, mais feront leur travail, puis enverront des signaux au thread principal, et les emplacements du thread principal mettront à jour le conteneur.
Cependant, si la majorité des classes auront accès au conteneur, qu'est-ce qui le rend vraiment différent d'un global? Si tant de classes ont besoin des données dans le conteneur, la "méthode d'injection de dépendances" n'est-elle pas simplement un global déguisé?
Une réponse serait la sécurité des threads: même si je fais attention à ne pas abuser du conteneur global, peut-être qu'un autre développeur à l'avenir, sous la pression d'une échéance proche, utilisera néanmoins le conteneur global dans un thread différent, sans prendre soin de tout les cas de collision. Cependant, même dans le cas de l'injection de dépendances, on pourrait donner un pointeur à quelqu'un qui s'exécute dans un autre thread, conduisant aux mêmes problèmes.