Итак, это действительно вопрос адвоката дьяволов.
Когда с глобальными переменными все в порядке, и если никогда, что бы вы использовали в качестве альтернативы?
Интересный побочный пример этого вопроса: чем общедоступное поле статического класса отличается от глобального?
Ответы:
Насколько я знаю, общедоступное статическое поле в основном является глобальным, учитывая, что его можно вызывать из любого места, за исключением того, что оно не забивает пространство имен.
Единственный раз, когда я лично использую «глобальные» переменные в своем коде, в форме открытых статических полей, которые являются неизменяемыми. В этом случае нет необходимости беспокоиться о том, что значение может быть искажено другими частями программы, и, конечно, это намного лучше, чем иметь дюжину переменных с одинаковыми постоянными значениями в каждом классе.
источник
Лично я использую глобальные переменные для конфигурации во время выполнения - если свойство конфигурации загружается при запуске приложения и изменяется нечасто (и только потом из одного места), это ужасно и подвержено ошибкам, передавая его каждому методу, который может потребоваться использовать это в какой-то момент. Лучше использовать что-то, что может быть введено в область действия из любой точки, где это необходимо, поскольку это не загромождает и не затеняет ваши сигнатуры методов и сайты вызовов.
источник
CONFIG_
илиCFG_
.Исключая системы реального времени / встроенные системы, вы должны использовать глобальные переменные только для постоянных значений. Если вы чувствуете, что не можете решить свою проблему без них, вы, вероятно, делаете что-то не так.
Кроме того, обратите внимание на шаблон Singleton : он может обеспечить лучшее решение для глобальных переменных в тех ситуациях, когда вам нужно что-то для глобальной точки доступа.
источник
TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOP
относится только к одному файлу / классу / разделу, где появляется «этот конкретный цикл».Проблема с глобальными переменными заключается в том, что вам нужно знать о них повсюду в вашем коде. Однако, как только вы решили, что вам нужно знать о конкретном глобальном объекте, его интенсивное использование будет немного утрачено. Поэтому я считаю, что у вас должно быть очень мало глобальных переменных, но из тех немногих, которые у вас есть, вы должны получить максимальный пробег.
Еще один пример того, что я чувствую таким образом, посмотрите на использование mixins в Ruby.
источник
Это все о пространствах имен.
Представьте на мгновение, что у всех в мире одинаковая фамилия. Какой беспорядок
(В Индии сикхи имеют одинаковую фамилию: Сингх - посмотрите)
источник
Краткая версия: когда легче рассуждать о программе. Обычно случаи - это некий тип глобального состояния или статического ресурса, который широко используется.
Длинная версия: Том Хотин сказал: «с жутким действием на расстоянии» ... в этом и заключается проблема глобалов - вы должны знать, где он используется и как, или вы можете получить некоторые действительно странные и трудные для отслеживания ошибок. Местные жители - это не что иное, как стратегия уменьшения объема того, что программист должен понимать, чтобы рассуждать о программе.
Другая сторона проблемы с знанием того, где они используются, заключается в том, что вы можете получить дублирующиеся глобальные переменные - в этом случае все может стать действительно странным, так как большинство программ получает и устанавливает var1, в то время как в нескольких местах var2 используется для хранения. та же информация. Особенно, когда несколько человек работают над одним и тем же кодом. IDE могут быть полезны для поиска использования, снижающего стоимость глобальных переменных, но они ничего не делают для дубликатов.
Чем больше глобалов у вас есть, тем сложнее отслеживать, что с ними происходит. Их должно быть мало и далеко.
источник
Два недостатка с глобальными и синглетонами - это тестируемость и возможность развертывания.
Для тестирования я видел слишком много чрезмерно сложных испытаний, чтобы справиться с плохо спланированными глобальными и одиночными сроками жизни. Убедитесь, что любой такой объект имеет четкие и простые правила запуска и демонтажа.
Что касается возможности развертывания, следует рассмотреть два случая. Во-первых, как будет жить ваш глобальный объект? Это в статической или динамической библиотеке? Если этот глобальный объект будет повторно использован для плагина, вы получите дополнительные копии? Во-вторых, что происходит, когда этот глобальный объект помещается в параллельное приложение? Это потокобезопасно?
В целом, я полагаю, эти причины означают, что глобалы и синглтоны используются исключительно в исключительных случаях.
источник
Разработка критических встроенных систем обычно включает использование глобальных переменных.
Размеры стека крошечные, все статически размещено (
malloc()
запрещено), глобальные переменные скрыты за пределами библиотеки, к которой они принадлежат.источник
В ужасной кодовой базе VB6, которая злоупотребляет глобальными кодами, как будто завтра не наступит, я виновен во введении нового:
Я думаю, что это один из немногих допустимых вариантов использования для глобального объекта.
источник