Подтвердить что ты не робот

Почему глобальные переменные являются плохими, в однопоточном, не-os, встроенном приложении

Большинство возражений, которые я вижу для использования глобальных переменных, имеют смысл, поскольку они относятся к проблемам нескольких потоков, безопасности потоков и т.д.

Но в небольшом, однопоточном, не-ОС, случае, какие у вас возражения? В моем случае я пишу свою встроенную систему в "С", если это имеет значение. Я также являюсь единственным разработчиком продукта.

Почему устранение глобальных переменных улучшит мой код?

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

4b9b3361

Ответ 1

Это не так.

Две основные проблемы с глобальными переменными - это просто загромождение пространства имен и тот факт, что "никто" не "контролирует" их (таким образом, потенциальные столкновения и конфликты с несколькими потоками).

"Глобалы плохие", как и многие другие идиомы программирования, это руководство, а не жесткое и быстрое правило. Когда эти виды "правил" сделаны, лучше всего, а не просто принимать правило, чтобы понять обстоятельства и мотивации создания правила. Не просто следите за ними.

В вашем случае вы, кажется, понимаете природу своей системы и аргументы вокруг правила и решили, что в этом случае это не применяется. Вы правы, это не так.

Итак, не беспокойтесь об этом.

Ответ 2

Вот хорошая статья, которая дает причину Почему глобальные переменные являются плохими

Почему глобальные переменные следует избегать, когда это необходимо?

Нелокальность. Исходный код проще всего понять, когда объем его отдельных элементов ограничен. Глобальные переменные могут быть прочитаны или изменены любой частью программы, что затрудняет запоминание или рассуждение о каждом возможном использовании. Нет контроля доступа или проверки ограничений. Глобальную переменную можно получить или установить любой частью программы, и любые правила ее использования могут быть легко сломаны или забыты.

Неявная связь. Программа со многими глобальными переменными часто имеет плотные связи между некоторыми из этих переменных и связывание между переменными и функциями. Группирование связанных элементов в единые единицы обычно приводит к улучшению программ.

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

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

Добавление глобалов очень просто. Легко привыкнуть к их объявлению. Это намного быстрее, чем думать о хорошем дизайне.

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

Ответ 3

Глобальные переменные не обязательно плохи, так как макросы не обязательно плохи, а обогащенный уран не обязательно плох. Пока вы принимаете осознанное решение о плюсах и минусах выбранного дизайна, вы должны быть в порядке.

Некоторые аргументы против глобальных переменных:

  • Они нарушают хороший объектно-ориентированный дизайн
  • Они делают ваш код сложным для модульного тестирования, поскольку вы не можете тестировать отдельные блоки кода, не настраивая все глобальные переменные, которые код ожидает увидеть
  • Они увеличивают сцепление в коде: действия в одном блоке кода могут непредсказуемо влиять на вещи в другом блоке кода с помощью общей глобальной переменной

Некоторые аргументы для глобальных переменных:

  • Они позволяют легко обмениваться одним ресурсом между многими функциями
  • Они могут упростить чтение кода

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

Я пишу много кода на C для встроенных микроконтроллеров, и я постоянно использую глобальные переменные. В такой жесткой системе глобальные переменные имеют смысл. Я знаю о потенциальных недостатках, но я проанализировал "за" и "против", и я пишу свой код, чтобы защититься от основных ошибок.

Нижняя строка: нет жесткого правила. Просто сделайте лучшее решение для своего конкретного проекта или платформы, основываясь на лучшей информации, которую вы имеете.

Ответ 4

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

Ответ 5

Глобальные переменные необходимы в небольшом встроенном приложении, написанном на C. Например, вам нужно использовать глобальную переменную, чтобы передавать информацию между процедурой обслуживания прерываний и другим модулем. Вот несколько советов, которые помогут вам эффективно использовать глобальные переменные во встроенных приложениях:

  • Сделайте различие между статическими переменными и глобальными переменными. Статические переменные могут использоваться из всех функций в одном файле C. Они эквивалентны частным членам класса С++. В C вы должны сами выполнять работу с компилятором. Используйте ключевое слово static, чтобы избежать случайного использования переменной вне модуля и сделать очевидным ее объем. Вы можете префикс переменной с именем модуля.

  • Следуйте соглашениям об именах для глобальных переменных (используемых многими файлами C). Сделать ясно, что они глобальны.

  • Если вам нужно много глобальных переменных, рассмотрите их объединение в структуре.

  • При необходимости используйте ключевое слово volatile. Это необходимо, если глобальная переменная изменена ISR.

Ответ 6

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

Ответ 7

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

Вы также можете держать свой кошелек на своем крыльце, но тогда у вас гораздо меньше контроля над тем, кто к нему обращается.

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

Если вы решите использовать глобальную переменную, попробуйте прокомментировать их и дать им хорошие имена. Это действительно беспокоит меня, когда люди делают глобальные переменные типа "bool bIsFound",

Мы делаем все возможное, чтобы оценить каждую новую глобальную переменную в обзоре кода и посмотреть, есть ли лучший подход.

Ответ 8

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

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

Ответ 9

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

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

Глобальные переменные также усложняют тестирование. Они добавляют зависимости от внешнего кода, который вы, возможно, захотите избежать во время тестирования.

Но, наконец, глобальные переменные трудно избежать при программировании на C. На более продвинутом языке глобалы просто бессмысленны большую часть времени. Использование их просто не делает ваш код более понятным.

В C существует множество случаев, когда глобальные переменные - это лучшее, самое простое и чистое решение.

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

Ответ 10

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

Не так сложно отслеживать, является ли ваше приложение небольшим - но чем больше ваше приложение становится и чем больше глобальных переменных у вас есть, тем больше код приложения выглядит как спагетти.

Короче говоря, это становится кошмаром для обслуживания и отладки.

Ответ 11

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

Ответ 12

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

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

Конечно, вы могли бы решить использовать глобальные переменные сейчас, и когда проект, кажется, становится более сложным, возвращайтесь и переписывайте его части, но зачем принуждать эту дополнительную работу к себе? Вы, скорее всего, (если вообще помните глобальные вары), чтобы решить, что эта работа слишком много, и пусть дизайн идет: на данный момент у вас проблемы!

Итак, сберегите головную боль и дизайн своим глазом на будущее. Необходимая работа теперь, вероятно, облегчит жизнь в будущем.

Если это вас не убеждало, представьте, что вы разработчики, которые работали над этим проектом, и обнаружили, что их код оказался ошибочным и виновным в плохой практике программирования перед Верховным судом: Код глюкометра Buggy отражает важность обзора источника

Ответ 13

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