Є багато причин, через які глобальні люди є злими в ООП.
Якщо кількість або розмір об'єктів, які потребують спільного використання, занадто великі, щоб ефективно їх передати в параметрах функції, зазвичай кожен рекомендує введення залежностей замість глобального об'єкта.
Однак у випадку, коли майже всім потрібно знати про певну структуру даних, чому інжекція залежності залежить від глобального об'єкта?
Приклад (спрощений, щоб показати точку взагалі, не заглиблюючись занадто глибоко в конкретну програму)
Існує ряд віртуальних транспортних засобів, які мають величезну кількість властивостей і станів, від типу, імені, кольору, швидкості, положення тощо. Багато користувачів можуть дистанційно керувати ними та величезна кількість подій (як користувачі, ініційований і автоматичний) може змінити багато своїх станів або властивостей.
Наївним рішенням було б просто зробити глобальний контейнер з них, як
vector<Vehicle> vehicles;
до якого можна отримати доступ з будь-якого місця.
Більш сприятливим для OOP рішенням буде контейнер бути членом класу, який обробляє цикл основної події, і бути екземпляром в його конструкторі. Кожен клас, який йому потрібен і є членом основної нитки, отримає доступ до контейнера за допомогою вказівника в їх конструкторі. Наприклад, якщо зовнішнє повідомлення надходить через мережеве з'єднання, клас (по одному для кожного з'єднання), який обробляє розбір, приймає на себе, і аналізатор матиме доступ до контейнера за допомогою вказівника чи посилання. Тепер, якщо проаналізоване повідомлення призводить до зміни елементу контейнера або потрібні деякі дані з нього, щоб виконати дію, з ним можна обробляти без необхідності перекидання тисяч змінних за допомогою сигналів і слотів (або гірше, зберігання їх у аналізаторі, щоб пізніше був отриманий тим, хто викликав парсер). Звичайно, всі класи, які отримують доступ до контейнера через введення залежності, є частиною однієї теми. Різні потоки не матимуть прямого доступу до нього, але виконують свою роботу і потім надсилають сигнали в основний потік, а слоти в основному потоці оновлять контейнер.
Однак, якщо більшість класів отримають доступ до контейнера, чим він дійсно відрізняється від глобального? Якщо стільки класів потребують даних у контейнері, чи не "спосіб введення залежності" є просто замаскованим глобальним?
Одна з відповідей буде безпекою нитки: навіть якщо я дбаю про те, щоб не зловживати глобальним контейнером, можливо, інший розробник у майбутньому, під тиском короткого терміну, все-таки використовуватиме глобальний контейнер в іншому потоці, не піклуючись про всіх випадки зіткнення. Однак, навіть у випадку введення залежності, можна дати вказівник тому, хто працює в іншій нитці, що призведе до тих же проблем.