Коротше кажучи, це робить стан програми непередбачуваним.
Для уточнення уявіть, що у вас є пара об'єктів, які обидва використовують одну і ту ж глобальну змінну. Якщо припустити, що ви не використовуєте джерела випадковості ніде в будь-якому модулі, то вихід конкретного методу можна передбачити (і, отже, протестувати), якщо стан системи відомий перед тим, як виконати метод.
Однак якщо метод в одному з об'єктів викликає побічний ефект, який змінює значення загального загального стану, то ви більше не знаєте, що таке початковий стан, коли ви виконуєте метод в іншому об'єкті. Тепер ви більше не можете передбачити, який результат ви отримаєте при виконанні методу, і тому ви не можете його протестувати.
На академічному рівні це може здатися не настільки серйозним, але можливість одиничного тестового коду є головним кроком у процесі доведення його коректності (або принаймні придатності за призначенням).
У реальному світі це може мати дуже серйозні наслідки. Припустимо, у вас є один клас, який заповнює глобальну структуру даних, і інший клас, який споживає дані в цій структурі даних, змінюючи їх стан або знищуючи їх у процесі. Якщо клас процесора виконує метод до того, як буде зроблено клас популяції, то результат такого класу, ймовірно, матиме неповні дані для обробки, а структура даних, над якою працював клас популятора, може бути пошкоджена або знищена. Програмна поведінка в цих умовах стає абсолютно непередбачуваною і, ймовірно, призведе до епічної втрати.
Крім того, глобальна держава шкодить читабельності вашого коду. Якщо ваш код має зовнішню залежність, яка явно не вводиться до коду, тоді, хто отримає завдання з обслуговування вашого коду, доведеться шукати його, щоб з’ясувати, звідки він узятий.
Щодо альтернатив, які існують, ну взагалі неможливо мати глобальну державу, але на практиці зазвичай можливо обмежити глобальну державу одним об'єктом, який охоплює всі інші, і на який ніколи не слід посилатися, покладаючись на правила обстеження мови, якою ви користуєтесь. Якщо певному об'єкту потрібен певний стан, він повинен явно запитувати його, передавши його як аргумент своєму конструктору або методом setter. Це відомо як ін'єкція залежності.
Можливо, вам здасться дурним передати стан, до якого ви вже можете отримати доступ через правила розміщення будь-якої мови, якою ви користуєтесь, але переваги величезні. Тепер, якщо хтось дивиться на код ізольовано, зрозуміло, який стан він потребує і звідки він береться. Він також має величезні переваги щодо гнучкості вашого кодового модуля, а отже, і можливості його повторного використання в різних контекстах. Якщо стан передається, а зміни в стані є локальними для блоку коду, ви можете передати будь-який стан, який вам подобається (якщо це правильний тип даних) і змусити його обробити його. Код, написаний у цьому стилі, як правило, має вигляд колекції слабко пов’язаних компонентів, які легко змінюються. Код модуля не має значення, звідки походить стан, а як його обробити.
Існує маса інших причин, через які держава, що перебуває навколо, значно перевершує покладення на глобальну державу. Ця відповідь аж ніяк не є вичерпною. Можливо, ви могли б написати цілу книгу про те, чому глобальний стан поганий.