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

Поиск:

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


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


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

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



Комрады.
Наболело. Объясните чем плохи глобальные переменные. Уже сколько раз встречал - глобальная переменная это плохо. Пространство имен и все такое. А вот что бы научно - доходчиво - сразу молчок. Вотя я новичок. Глобальными стараюсь не пользоваться - ибо это ПЛОХО - но вот почему? Ведь с другой стороны это удобно.
PM MAIL   Вверх
MAKCim
Дата 9.10.2007, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



mrbrooks
ничего плохого в использовании глобальных переменных нет
долой предрассудки
надо просто все делать с умом и четко понимать конечную цель
бывают случаи, когда без глобальных переменных не обойтись
та же переменная errno глобальна
я уж не говорю о стандартных stdin, stdout, stderr
в многопоточном программировании глобальные переменные + средства синхронизации используются на ура
если надо выделить статически большой кусок данных, то BSS + глобальный массив - лучшее и самое производительное решение


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(mrbrooks @  9.10.2007,  09:51 Найти цитируемый пост)
Объясните чем плохи глобальные переменные.

1. Невозможно контролировать время жизни, что ещё более страшно и предугадать время создания/удаления тоже нельзя.
2. Пораждают негибкую архитектуру
PM MAIL WWW   Вверх
Anikmar
Дата 9.10.2007, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Ну прям из серии плох ли goto.
На мой взгляд ни одна серьезная программа без глобальных переменных просто не обойдется. Все должно контролироваться здравым смыслом.
Глобальные переменные были есть и будут. Начиная от операционной системы.
PM MAIL ICQ   Вверх
mrbrooks
Дата 9.10.2007, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



А ну и славно. Я то уж было испужался - а оказывается не все так и плохо. После заявлений таких метров можно тему и прикрыть. 

ЗЫ. а goto хорош но в меру на мой начинающий взгляд.
PM MAIL   Вверх
Fazil6
Дата 9.10.2007, 09:14 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(MAKCim @  9.10.2007,  08:59 Найти цитируемый пост)
mrbrooks, ничего плохого в использовании глобальных переменных нетдолой предрассудки

так уж ничего...
Переменных должно быть как можно меньше, а время их жизни как можно короче.
Например, порядок инициализации глобальных и статических переменныз из разных модулей неопределен.
Глобальные данные усложняют программу. Зачастую очень трудно вносить изменения в проект, если это касается работы с глобальными данными.
Другое дело , что не всегда возможно или не всегда просто обойтись без них.
PM MAIL   Вверх
mrbrooks
Дата 9.10.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Я убедился в одном - все можно - но в меру. Эврика!!! Но тем не менее я удовлетворен полученными мнениями. Что бы я без вас делал - наверно считал бы на калькуляторе!!!
PM MAIL   Вверх
MAKCim
Дата 9.10.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Fazil6
заметь, я не призывал использовать глобальные данные
я лишь сказал, что ничего плохого в них нет, если использовать их по делу и с умом
и привел примеры, где без них никак (или почти никак)
Цитата(Fazil6 @  9.10.2007,  09:14 Найти цитируемый пост)
Например, порядок инициализации глобальных и статических переменныз из разных модулей неопределен.

не определен, но при передаче управления в main()
они уже инициализированы (до main выполняется куча кода по инициализации, секции .init, .text (до main))

Добавлено @ 09:25
Цитата(Fazil6 @  9.10.2007,  09:14 Найти цитируемый пост)
Переменных должно быть как можно меньше, а время их жизни как можно короче.

ну что за обобщение?
кто такое сказал? не все в нашей жизни ООП
для каждой задачи свое решение и не всегда количество переменных со временем их жизни связано приведенным тобой соотношением

Добавлено через 8 минут и 9 секунд
вот пример
Код

class foo {
public:
    foo() { throw exception(); }
};

foo object;

int main() {
    cout << Hello, World! << endl;
    return 0;
}

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

Это сообщение отредактировал(а) MAKCim - 9.10.2007, 09:26


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Эксперт
***


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

Репутация: 21
Всего: 25



MAKCim, имелась в виду проблема порядка ИХ инициализации. При создании глобального объекта A я не могу быть уверен, что глобальный объект B, который у меня в A используется, уже создан.

та проблема, которая описана у Майерса и решалась паттерном Синглтон (довольное неожиданное применения паттерна, кстати smile )

Это сообщение отредактировал(а) Alek86 - 9.10.2007, 09:39


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 9.10.2007, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



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

Код

size_t size;
Foo foo;

void f1()
{
 size = 100;
 foo = new Foo[size];
}
//ф-я требует для правильной работы чтобы перем. size содержала размер массива, те. чтобы перед вызовом f2 была вызвана f1
void f2()
{
 for (int i =0; i < size; ++i) foo[i]->....
}


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


Это сообщение отредактировал(а) Lazin - 9.10.2007, 10:06
PM MAIL Skype GTalk   Вверх
Mihhail
Дата 9.10.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 9



  Глобальными обычно назначаются переменные связанные с единственным параметром или свойством.

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

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


Эксперт
****


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

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



есть некоторые аспекты, связанные с восприятием кода
рассмотрим такую ситуацию
Код

x=f(y);

в этой строке есть три объекта: x,f,y
здесь мы точно видим: изменяется x, y (если передан по неконстантной ссылке) и f (если это, например, объект с переопределённым operator() )

если эта функция изменяет глобальную переменную z, получается, что мы этого не видим
нам нужно смотреть её код
даже если функция f только читает содержимое z, всё равно в разных местах программы f(y) может возвращать разные значения для одного и того же y (т.к. она ещё и зависит от значения z)

всё это не делает невозможным понимание кода, такие ситуации делают его просто немного труднее

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


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


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


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

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



Народ. Блин я думал я знал С++ хоть чуть чуть. Но после ваших высказываний - я понял - учиться мне еще учиться и еще раз учиться.

ЗЫ. И в догонку еще раз учиться.
PM MAIL   Вверх
maxim1000
Дата 9.10.2007, 12:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



есть даже более сильные рекомендации (которым лично я зачастую следую)
[похоже, они пришли из области функционального программирования]
строка x=f(y) должна менять только x, т.е. избегать передачи параметров по неконстантной ссылке
это опять же позволяет сразу отсеять кучу мест, где может меняться "y", уже на этапе простого визуального "пробега" по коду (а именно - те, в которых "y" не стоит слева от знака равенства)


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


Амеба
Group Icon


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

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



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


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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Страницы: (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.0949 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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