Почему глобальные переменные плохо?

Почему глобальные переменные считаются плохой практикой в C++? Есть ли время, когда они приемлемы для использования? Если да, то когда и где? Я слышал смешанные ответы на этот вопрос, некоторые говорят, что он работает, и другие говорят мне избегать использования глобальных переменных как можно больше.

2 ответа

Есть несколько причин, почему люди часто советуют не использовать глобальные переменные, но в корне они все сосредоточены на поддержке. Программы, которые используют глобалы, намного сложнее поддерживать, чем программы, которые этого не делают.

Во-первых, они вводят состояние во все приложение. Это намного сложнее найти ошибки, возникающие из-за чтения кода или записи этих переменных, которые вы не намеревались, или в то время, когда вы этого не ожидали. Это становится все труднее, чем больше становится приложение. Чем больше перерывов с одним глобальным, тем сложнее становится приложение и чем сложнее понять.

Для другого становится все труднее сделать многопоточный доступ безопасным и эффективным. Можете ли вы заблокировать одну из этих переменных без блокировки всего приложения?

Использование globals также запутывает семантику собственности. Кто именно владеет этими переменными? Когда они должны быть созданы? Когда они должны быть уничтожены?

Конечно, можно писать правильные программы, используя глобальные переменные. Эти программы легче писать (за исключением проблем с потоками), но, как правило, их гораздо труднее поддерживать. Заставляя себя не использовать глобальные переменные, иногда бывает сложнее записать программу в первую очередь, но она также ставит многие из проблем на раннее время и, наконец, делает эти программы более понятными, отлаживаемыми и расширяемыми.


Помимо загрязнения глобального пространства имен (что означает, что код, который кто-то пишет, который включает объявление такого глобального, может привести к ошибке, поскольку он ссылается на ваш символ неохотно), существует статический идентификатор инициализации Fiasco. Глобальный не является static как таковым, но в любом случае самой большой проблемой является обеспечение правильного состояния перед первым использованием.

Помимо этого, глобальное состояние трудно рассуждать и имеет неприятный побочный эффект, который сводит на нет строгое разделение проблем в коде. Что приводит к... Спагетти-монстра.

Поверьте мне, переписывая свой код для использования локальных переменных, вы заставите вас очищать свой дизайн, а лучший код - это бесплатный результат.

licensed under cc by-sa 3.0 with attribution.