Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чем плохи глобальные переменные? Философский вопрос 
V
    Опции темы
maxim1000
Дата 9.10.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
Alexeis
Дата 9.10.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  Я стараюсь строить программу в виде восходящего дерева/деревьев. Т.е. в глобальной области один или несколько стволов, все остальное дочерние элементы. Так принято у борланда в VCL. Неплохая модель.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
maxim1000
Дата 9.10.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(Alexeis @  9.10.2007,  12:24 Найти цитируемый пост)
И еще это засорение пространства имен. Я люблю когда все схожее называется одинаково. Глобальная область видимости мне не дает такой свободы, ведь каждый раз нужно придумывать всякие префиксы к именам, уж лучше написать класс / структуру

а кто мешает объявить глобальную переменную в соответствующем пространстве имён? (которые и были придуманы в частности для того, чтобы формализовать и развить всякие префиксы, которые люди придумывали для отражения области задач объектов)

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

и со стековыми объектами можно встретить такое:
Код

{
    int *array;
    int arraySize;
    ...
}

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

с другой стороны те же структуры тоже могут быть глобальными...


--------------------
qqq
PM WWW   Вверх
Alexeis
Дата 9.10.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(maxim1000 @  9.10.2007,  12:32 Найти цитируемый пост)
а кто мешает объявить глобальную переменную в соответствующем пространстве имён? (которые и были придуманы в частности для того, чтобы формализовать и развить всякие префиксы, которые люди придумывали для отражения области задач объектов)

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
maxim1000
Дата 9.10.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(Alexeis @  9.10.2007,  12:42 Найти цитируемый пост)
Правильно. Но если рассуждать чисто логически, то переменная в пространстве имен уже не глобальная, она уже принадлежит определенной группе и доступ к ней уже не прямой.

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

Цитата(Alexeis @  9.10.2007,  12:42 Найти цитируемый пост)
В этом смысле я слабо понимаю чем это лучше создания класса, ведь класс позволяет точно также спрятать переменную под крыло своего пространства имен.

ну а для класса там уже всё по-другому
для доступа к переменной тогда нужен объект, который её содержит, значит, его нужно передать функции, а значит, он будет упомянут в строке
(ну если, конечно, сам объект объявлен глобально, то снова появляется глобальная переменная, просто другого типа)


--------------------
qqq
PM WWW   Вверх
SergeCpp
Дата 9.10.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Цитата(mrbrooks @  9.10.2007,  14:18 Найти цитируемый пост)
...учиться мне еще учиться и еще раз учиться...

Вот эта книжка поможет весьма (дороговата, но купите бумажную!)

Добавлено через 3 минуты и 49 секунд
Цитата(Alexeis @  9.10.2007,  14:24 Найти цитируемый пост)
И еще это засорение пространства имен. Я люблю когда все схожее называется одинаково. Глобальная область видимости мне не дает такой свободы, ведь каждый раз нужно придумывать всякие префиксы к именам, уж лучше написать класс / структуру. 

Я, к примеру, для этого использую namespace (с глобальными (уже не совсем и глобальными, выходит) inside)

PM MAIL WWW ICQ   Вверх
mrbrooks
Дата 9.10.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Цитата(Alexeis @ 9.10.2007,  12:24)
И еще это засорение пространства имен. Я люблю когда все схожее называется одинаково. Глобальная область видимости мне не дает такой свободы, ведь каждый раз нужно придумывать всякие префиксы к именам, уж лучше написать класс / структуру.

Значит если я запихаю все свои глобальные данные в некую структуру и буду их там переваривать это есть выход из сложившейся ситуации. И уже по мере надобности я буду обращаться к ее элементам. Я правильно понял?
PM MAIL   Вверх
maxim1000
Дата 9.10.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(mrbrooks @  9.10.2007,  13:20 Найти цитируемый пост)
Значит если я запихаю все свои глобальные данные в некую структуру и буду их там переваривать это есть выход из сложившейся ситуации.

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


--------------------
qqq
PM WWW   Вверх
comcon1
Дата 9.10.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Цитата(mrbrooks @  9.10.2007,  13:20 Найти цитируемый пост)
Значит если я запихаю все свои глобальные данные в некую структуру и буду их там переваривать это есть выход из сложившейся ситуации.

Мда. а что, сбор в структуру как-то ограничит доступ к ним??? 

чтобы ограничить доступ, можно собирать их в приват отдельного объекта-синглетона и открывать доступ, например, только определенным классам. хотя какими способами наиболее корректно реализовать последнее... smile  даже и не знаю((



--------------------
PM MAIL   Вверх
Alexeis
Дата 9.10.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(comcon1 @  9.10.2007,  15:47 Найти цитируемый пост)
Мда. а что, сбор в структуру как-то ограничит доступ к ним??? 

  Конечно, для доступа нужно обращаться уже через точку/стрелочку, а не просто по имени.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Dronchik
Дата 9.10.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Звукач ёмаё
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 1.5.2007

Репутация: 0
Всего: 37



Цитата(comcon1 @ 9.10.2007,  15:47)
Цитата(mrbrooks @  9.10.2007,  13:20 Найти цитируемый пост)
Значит если я запихаю все свои глобальные данные в некую структуру и буду их там переваривать это есть выход из сложившейся ситуации.

Мда. а что, сбор в структуру как-то ограничит доступ к ним??? 

чтобы ограничить доступ, можно собирать их в приват отдельного объекта-синглетона и открывать доступ, например, только определенным классам. хотя какими способами наиболее корректно реализовать последнее... smile  даже и не знаю((

Тогда уж лучше protected и делать друзей класса.

Это сообщение отредактировал(а) Dronchik - 9.10.2007, 17:08


--------------------
Вместо слов делай дело, от которого ты фанатеешь. (с)

PM MAIL WWW ICQ   Вверх
archimed7592
Дата 9.10.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



А считает ли кто-нибудь плохой такую вот глобальную "переменную":
Код
std::ostream &logStream()
{
#ifdef LOG_TO_CONSOLE
    return std::clog;
#else
    static std::ofstream logFile("my.log");

    return logFile;
#endif
}

#define log logStream()

void someFunc()
{
    // ...

    log << 1 << 2 << 3;
}


Это сообщение отредактировал(а) archimed7592 - 9.10.2007, 18:29


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
maxim1000
Дата 9.10.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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

logStream()<<"qqq";



--------------------
qqq
PM WWW   Вверх
archimed7592
Дата 9.10.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(maxim1000 @  9.10.2007,  18:31 Найти цитируемый пост)
и не дай бог кому-то захотеть посчитать логарифм smile

Ну это наглядности ради smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
maxim1000
Дата 9.10.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



проблема препроцессора в его незнании о том, что такое C++ smile
(в частности пространства имён и классы)
какое бы осмысленное имя не дать этому define'у, найдётся программист, которому захочется так назвать метод своего класса, и если повезёт, всё закончится ошибкой компилятора...

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


--------------------
qqq
PM WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1565 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.