Istnieje wiele powodów, dla których globale są złe w OOP.
Jeśli liczba lub rozmiar obiektów wymagających współdzielenia jest zbyt duża, aby można je było efektywnie przekazać w parametrach funkcji, zwykle wszyscy zalecają Wstrzykiwanie zależności zamiast obiektu globalnego.
Jednak w przypadku, gdy prawie wszyscy muszą wiedzieć o pewnej strukturze danych, dlaczego wstrzykiwanie zależności jest lepsze niż obiekt globalny?
Przykład (uproszczony, aby ogólnie pokazać punkt, bez sięgania zbyt głęboko w konkretną aplikację)
Istnieje wiele wirtualnych pojazdów, które mają ogromną liczbę właściwości i stanów, od typu, nazwy, koloru, prędkości, położenia itp. Wielu użytkowników może nimi sterować zdalnie i ogromną liczbę zdarzeń (zarówno inicjowane i automatyczne) mogą zmieniać wiele swoich stanów lub właściwości.
Naiwnym rozwiązaniem byłoby po prostu zrobienie z nich globalnego pojemnika
vector<Vehicle> vehicles;
do którego można uzyskać dostęp z dowolnego miejsca.
Bardziej przyjaznym dla OOP rozwiązaniem byłoby posiadanie kontenera należącego do klasy, która obsługuje główną pętlę zdarzeń i tworzenie instancji w jej konstruktorze. Każda klasa, która tego potrzebuje i jest członkiem głównego wątku, otrzyma dostęp do kontenera za pomocą wskaźnika w swoim konstruktorze. Na przykład, jeśli wiadomość zewnętrzna przychodzi przez połączenie sieciowe, klasa (jedna dla każdego połączenia) obsługująca parsowanie przejmie kontrolę, a parser będzie miał dostęp do kontenera za pomocą wskaźnika lub odwołania. Teraz, jeśli przeanalizowany komunikat powoduje albo zmianę elementu kontenera, albo wymaga pewnych danych z niego, aby wykonać akcję, można go obsłużyć bez potrzeby rzucania około tysięcy zmiennych przez sygnały i szczeliny (lub, co gorsza, przechowywanie ich w parserze do późniejszego pobrania przez osobę, która wywołała parser). Oczywiście wszystkie klasy, które uzyskują dostęp do kontenera poprzez wstrzyknięcie zależności, są częścią tego samego wątku. Różne wątki nie będą miały do niego bezpośredniego dostępu, ale wykonają swoją pracę, a następnie wyślą sygnały do głównego wątku, a gniazda w głównym wątku zaktualizują kontener.
Jeśli jednak większość klas uzyska dostęp do kontenera, co tak naprawdę różni się od globalnego? Jeśli tak wiele klas potrzebuje danych w kontenerze, to czy „sposób wstrzykiwania zależności” nie jest tylko ukrytym globalnym?
Jedną odpowiedzią byłoby bezpieczeństwo wątków: chociaż staram się nie nadużywać globalnego kontenera, być może inny programista w przyszłości, pod presją bliskiego terminu, mimo wszystko użyje globalnego kontenera w innym wątku, nie dbając o wszystko przypadki kolizji. Jednak nawet w przypadku wstrzykiwania zależności można wskazać wskaźnik komuś, kto działa w innym wątku, co prowadzi do tych samych problemów.