Es gibt viele Gründe, warum Globale in OOP böse sind .
Wenn die Anzahl oder Größe der Objekte, die gemeinsam genutzt werden müssen, zu groß ist, um effizient in Funktionsparametern weitergegeben zu werden, empfiehlt normalerweise jeder die Abhängigkeitsinjektion anstelle eines globalen Objekts.
In dem Fall, in dem fast jeder eine bestimmte Datenstruktur kennen muss, warum ist Dependency Injection besser als ein globales Objekt?
Beispiel (ein vereinfachtes Beispiel , um den Punkt allgemein darzustellen, ohne zu tief in eine bestimmte Anwendung einzutauchen)
Es gibt eine Reihe von virtuellen Fahrzeugen mit einer Vielzahl von Eigenschaften und Zuständen, von Typ, Name, Farbe bis zu Geschwindigkeit, Position usw. Eine Reihe von Benutzern kann sie fernsteuern, und eine Vielzahl von Ereignissen (beides initiiert und automatisch) können viele ihrer Zustände oder Eigenschaften ändern.
Die naive Lösung wäre, einfach einen globalen Container daraus zu machen
vector<Vehicle> vehicles;
die von überall zugegriffen werden kann.
Die OOP-freundlichere Lösung wäre, dass der Container Mitglied der Klasse ist, die die Hauptereignisschleife behandelt, und in seinem Konstruktor instanziiert wird. Jede Klasse, die es benötigt und Mitglied des Hauptthreads ist, erhält über einen Zeiger in ihrem Konstruktor Zugriff auf den Container. Wenn beispielsweise eine externe Nachricht über eine Netzwerkverbindung eingeht, übernimmt eine Klasse (eine für jede Verbindung), die das Parsing ausführt, und der Parser hat über einen Zeiger oder eine Referenz Zugriff auf den Container. Wenn die analysierte Nachricht zu einer Änderung in einem Element des Containers führt oder einige Daten benötigt, um eine Aktion auszuführen, kann sie verarbeitet werden, ohne dass Tausende von Variablen durch Signale und Slots geworfen werden müssen (oder schlimmer noch, Speichern Sie sie im Parser, damit sie später von demjenigen abgerufen werden können, der den Parser aufgerufen hat. Natürlich sind alle Klassen, die über Dependency Injection Zugriff auf den Container erhalten, Teil desselben Threads. Verschiedene Threads greifen nicht direkt darauf zu, sondern erledigen ihre Aufgabe und senden dann Signale an den Haupt-Thread. Die Slots im Haupt-Thread aktualisieren den Container.
Wenn jedoch die Mehrheit der Klassen Zugriff auf den Container erhält, was unterscheidet ihn dann wirklich von einem globalen? Wenn so viele Klassen die Daten im Container benötigen, ist die "Abhängigkeitsinjektionsmethode" dann nicht nur eine verschleierte globale Methode?
Eine Antwort wäre Thread-Sicherheit: Auch wenn ich darauf achte, den globalen Container nicht zu missbrauchen, wird möglicherweise ein anderer Entwickler in Zukunft unter dem Druck einer kurzen Frist den globalen Container in einem anderen Thread verwenden, ohne sich um alles zu kümmern die Kollisionsfälle. Selbst im Fall der Abhängigkeitsinjektion kann man jedoch einen Zeiger auf jemanden geben, der in einem anderen Thread ausgeführt wird, was zu denselben Problemen führt.