Являются ли глобальные переменные плохими (в этой ситуации)? - PullRequest
2 голосов
/ 06 ноября 2010

Ну вот, я в миллионный раз сижу и говорю себе: «Я собираюсь написать игру с использованием SDL и C ++», за исключением того времени, когда я сказал себе, что собираюсь написать ее на C. Это потому, что сам SDL написано на С, и это, кажется, просто имеет смысл для меня. Игра, которую я пишу, будет простой "SHMUP" (Shoot 'em up) и, вероятно, будет очень короткой по кодам, так что мне интересно, плохая пара глобальных переменных? (например, "struct base basevar;" или "int SCREEN_W" или что-то в этом роде)?

Ответы [ 5 ]

4 голосов
/ 07 ноября 2010

Глобальные переменные не являются «плохими».Тем не менее, они могут легко привести к очень плохому коду (в смысле читабельности, тестируемости, ремонтопригодности) при небрежном использовании.Они также могут привести к пагубным проблемам многопоточности (если вы используете потоки), опять же, если их использовать неосторожно.

У некоторых людей есть общее правило, что вы никогда не должны их использовать.ИМХО, это слишком сурово, и если неукоснительно следовать, может привести к тому, что люди передадут указатель на большой everything_t на все функции, что не намного лучше (хотя даже этот простой подход делает ваш код повторным).Однако, пожалуйста, не читайте это как пропаганду "просто сходите с ума от глобалов!"Они являются правильным ответом только в нескольких ситуациях.

В вашем примере звучит так, будто у вас есть набор настроек / параметров, которые действительно не меняются.Рассмотрим хотя бы их группировку в структуру settings;это позже дает вам возможность иметь, например, функцию const settings *getSettings().

1 голос
/ 07 ноября 2010

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

Сказав это, слепая ненависть к глобалам также не оправдана. Я имею в виду, глобальность может быть относительной. Имя класса является глобальным в пространстве имен. Член класса является глобальным в пространстве имен, установленном классом. Таким образом, если кодовая база для класса становится достаточно большой, тот же аргумент, что и глобальные, может быть использован против членов класса. Фактически, пространства имен и классы, отчасти, являются механизмами для сдерживания этой болезни глобальности. Они (частично) являются механизмами для разграничения видимости и доступа.

Так что, на мой взгляд, глобальность не является проблемой. Это действительно о том, как это влияет на структуру.

0 голосов
/ 08 ноября 2010

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

0 голосов
/ 07 ноября 2010

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

0 голосов
/ 07 ноября 2010

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

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

...