Вот хорошая статья, объясняющая причину Почему глобальные переменные плохие
Почему следует избегать глобальных переменных, когда они не нужны?
Нелокальность. Исходный код легче всего понять, когда область его отдельных элементов ограничена. Глобальные переменные могут быть прочитаны или изменены любой частью программы, что затрудняет их запоминание или рассуждение о каждом возможном использовании.
Отсутствие контроля доступа или проверки ограничений - глобальная переменная может быть получена или установлена любой частью программы, и любые правила, касающиеся ее использования, могут быть легко нарушены или забыты.
Неявная связь - Программа со многими глобальными переменными часто имеет тесную связь между некоторыми из этих переменных и связь между переменными и функциями. Группировка связанных элементов в единые блоки обычно приводит к улучшению программ.
Проблемы с выделением памяти. В некоторых средах существуют схемы выделения памяти, которые усложняют распределение глобалов. Это особенно верно в языках, где «конструкторы» имеют побочные эффекты, отличные от распределения (поскольку в этом случае вы можете выразить небезопасные ситуации, когда два глобальных элемента взаимно зависят друг от друга). Кроме того, при динамическом связывании модулей может быть неясно, имеют ли разные библиотеки свои собственные экземпляры глобалов или глобальные глобальные ресурсы являются общими.
Тестирование и ограничение - источник, использующий глобальные переменные, несколько сложнее протестировать, поскольку нельзя легко установить «чистую» среду между запусками. В более общем смысле, источник, который использует глобальные сервисы любого рода, которые явно не предоставлены этому источнику, сложно проверить по той же причине.
Добавление глобалов действительно просто. Легко привыкнуть объявлять их. Это гораздо быстрее, чем думать о хорошем дизайне.
Глобальные переменные не так плохи, как вы думаете, их следует избегать всякий раз, когда они не нужны. Глобальные переменные могут найти хорошее применение для переменной, которая будет использоваться во всей программе, помня о том, что вы всегда должны отслеживать, где эта переменная принимает изменения; но для переменных, которые, как правило, используются только в рамках ограниченных частей программы, есть веская причина избегать ее глобализации.