На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Глобальные переменные: корректные названия, префиксы.
    Обычно используют префикс "g_". Однако встает вопрос отличия глобальных переменных внутри 1 формы и доступных для всех форм. Как правильно называть данные виды переменных?
      Хрестоматийных указаний нет. Вариантов много.
      Можно тупо "global_имя", запутаться можно только под синькой или веществами.
        Никак. Правильно построенная программа не имеет проблемы глобальных/локальных переменных. И вообще, функции и объекты не должны работать с глобальными данными непосредственно. Если изучаете программирование самостоятельно, рекомендую отложить работу с GUI и "спуститься" на консольный C.
          Цитата Fiodor @
          И вообще, функции и объекты не должны работать с глобальными данными непосредственно.
          Холиварно сие всё, но всё же убеждён, что таковой совет ("не должны работать") нужен исключительно для начинающих, в воспитательных целях. У нас у всех (у меня и знакомых) те или иные функции работают с теми или иными глобальными переменными; и при этом всё прекрасно вертится. :yes:
          Названия же - где-как: есть и с чудо-префиксами, есть и просто уникальные.
            Ага, а давайте на каждую глобольную срань городить синглтон. Настоящие программисты везде должны городить объекты под паттернами.
              Цитата applegame @
              Ага, а давайте на каждую глобольную срань городить синглтон. Настоящие программисты везде должны городить объекты под паттернами.

              По мне, так лучше на каждую глобольную срань городить синглтон, нежели писать все в макросах, как некоторые любят :D Причем не просто #define TRUE FALSE, а целую такую функцию обязательно нужно нагородить, и сделать там какую нибудь ошибку, чтоб потом продебажить не получилось. Синглтоны хоть дебажить можно :tong:
              Ну а так, я конечно не стороник глобальных переменных или еще чего то, обычно если и юзаю то в пределах одного цппшника, но иногда без этих глобальных переменных не уйти. В том же COM'е есть пару вещей. Так что обычно что то типа g_НормальноеИПонятноеИмяПеременной. g_ пишу только исключительно ради того, что так быстрее найти нужное в хламе автокомплитера. Но можно и неймспейсы юзать. Да и вообще не помню когда в последний раз в каком нибудь хидере объявлял глобальную переменную.

              Добавлено
              Цитата Сергей85 @
              Однако встает вопрос отличия глобальных переменных внутри 1 формы и доступных для всех форм. Как правильно называть данные виды переменных?

              namespace GlobalnayaPeremennayaForm1 - спасет тебя :D
                Цитата KILLER @
                Ну а так, я конечно не стороник глобальных переменных или еще чего то, обычно если и юзаю то в пределах одного цппшника, но иногда без этих глобальных переменных не уйти.

                В глобальных переменных самое неприятное - это вот эта возможная ошибка:
                ExpandedWrap disabled
                  1-й модуль:
                  int i;
                  int j;
                  int k;
                   
                  2-й модуль:
                  extern int i;
                  extern char j;
                  extern int k;
                   
                  3-й модуль:
                  extern int i;
                  extern int j;
                  extern int k;

                Найти такую ошибку в большом проекте почти не возможно, особенно если extern-ы бессистемно
                разбросаны по многим модулям.
                ---
                Тогда берём и делаем класс, в котором объявляем статические переменные в public-секции.
                Вот и всё.
                Признак "глобальности" - принадлежность к классу.
                Все "глобальные" переменные (а заодно и константы) определены в одном месте,
                extern-ы исключены навсегда, а класс позволяет при необходимости добавлять методы
                для манипуляции с какими-то переменными (если недо).
                  Цитата ЫукпШ @
                  Найти такую ошибку в большом проекте почти не возможно, особенно если extern-ы бессистемно
                  разбросаны по многим модулям.
                  Нехрен быдлокодить просто.
                  ExpandedWrap disabled
                    header.h:
                    extern int i;
                    extern char j;
                    extern int k;
                     
                    1-й модуль:
                    #include "header.h"
                    int i;
                    int j;                          // ошибка компиляции
                    int k;
                     
                    2-й модуль:
                    #include "header.h"
                     
                    3-й модуль:
                    #include "header.h"


                  Добавлено
                  Одно определение на программу и по одному объявлению в каждом модуле в единственном месте исходных текстов.
                    Цитата Qraizer @
                    Одно определение на программу и по одному объявлению в каждом модуле в единственном месте исходных текстов.

                    Не надо сравнивать технику С и С++.
                    Но если очень хочется именно стиль С, тогда пишем такой неадер:
                    ExpandedWrap disabled
                      //
                      // file globalVar.h
                      //
                      #ifdef MAINMOD
                      // --------------
                      // vvvvvvvvvvvvvv
                      int i;
                      char j;
                      // ^^^^^^^^^^^^^^
                      // ..............
                      #else
                      // ..............
                      // vvvvvvvvvvvvvv
                      extern char j;
                      extern int i;
                      // ^^^^^^^^^^^^^^
                      // --------------
                      #endif

                    Вставляем его везде, где нужно.
                    Но только в одном единственном модуле пишем:
                    ExpandedWrap disabled
                      #define MAINMOD
                      #include "globalVar.h"


                    Тогда опять все глобальные переменные будут сосредоточены в одном месте
                    и хоть как-то "структурированы типа".
                    Получим простейшие правила добавления/удаления/редакции глобальных переменных.
                    Сообщение отредактировано: ЫукпШ -
                      Цитата ЫукпШ @
                      Не надо сравнивать технику С и С++.
                      Так это как раз техника C. В заголовке описываешь переменные, в одном из модулей их определяешь. Я обычно такие глобальные переменные даже определял в отдельном модуле, где кроме этих глобальных переменных ничего и не было.

                      А так обычно статических, видимых только внутри файла, хватает.

                      Добавлено
                      Цитата ЫукпШ @
                      Но если очень хочется именно стиль С, тогда пишем такой неадер:
                      Можно даже так
                      файл globals.h
                      ExpandedWrap disabled
                        #ifdef MAINMOD
                        #define EXTERN
                        #else
                        #define EXTERN extern
                        #endif
                         
                        EXTERN char j;
                        EXTERN int i;
                         
                        #undef EXTERN

                      Но в таком случае есть опасность определить MAINMOD в невскольких единицах трансляции, или вообще забыть его где-либо определить.
                      Сообщение отредактировано: amk -
                        Парни, по-моему, вы начинаете спорить, утверждая ... одинаковое)

                        * логично вынести все объявления глобальных переменных в один модуль (*.c или *.cpp)
                        * оформить "заголовок" с "экстернами" и препроцессорной охраной множественного включения, либо #pragma once
                        * включить инклюдами данный заголовок в каждый модуль

                        Это все.
                          Это всё. )
                            Цитата ЫукпШ @
                            Не надо сравнивать технику С и С++.
                            Но если очень хочется именно стиль С, тогда пишем такой неадер:
                            ...
                            Во-первых, это как раз C образца 1972 года. Во-вторых, касательно вон того ... я уже просил не ...хм, учить плохому.

                            Добавлено
                            Цитата ЫукпШ @
                            Получим простейшие правила добавления/удаления/редакции глобальных переменных.
                            Структурное программирование не для билдеровцев, да?
                                Цитата amk @
                                Добавлено
                                Цитата ЫукпШ @
                                Но если очень хочется именно стиль С, тогда пишем такой неадер:
                                Можно даже так
                                файл globals.h
                                ExpandedWrap disabled
                                  #ifdef MAINMOD
                                  #define EXTERN
                                  #else
                                  #define EXTERN extern
                                  #endif
                                   
                                  EXTERN char j;
                                  EXTERN int i;
                                   
                                  #undef EXTERN

                                Идея интересная, но реализация ужасная.
                                В одном случае EXTERN это действительно extern, а в другом нет. :o
                                Лучше другое какое-нибудь слово.
                                Кроме того, такой способ даёт возможность определить только не инициализированные
                                переменные, а это значит предложение выгодно только если не имеется инициализированных
                                переменных или их мало.

                                Добавлено
                                Цитата amk @
                                Но в таком случае есть опасность определить MAINMOD в невскольких единицах трансляции, или вообще забыть его где-либо определить.

                                Если это определение будет использовано неправильное
                                количество раз, компилятор немедленно скажет об этом.
                                Хватит ли у программиста интеллекта написать этот "define"
                                один раз в главном модуле приложения ? Вопрос риторический.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0462 ]   [ 17 queries used ]   [ Generated: 28.03.24, 19:51 GMT ]