![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
Комрады.
Наболело. Объясните чем плохи глобальные переменные. Уже сколько раз встречал - глобальная переменная это плохо. Пространство имен и все такое. А вот что бы научно - доходчиво - сразу молчок. Вотя я новичок. Глобальными стараюсь не пользоваться - ибо это ПЛОХО - но вот почему? Ведь с другой стороны это удобно. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
mrbrooks,
ничего плохого в использовании глобальных переменных нет долой предрассудки надо просто все делать с умом и четко понимать конечную цель бывают случаи, когда без глобальных переменных не обойтись та же переменная errno глобальна я уж не говорю о стандартных stdin, stdout, stderr в многопоточном программировании глобальные переменные + средства синхронизации используются на ура если надо выделить статически большой кусок данных, то BSS + глобальный массив - лучшее и самое производительное решение -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Ну прям из серии плох ли goto.
На мой взгляд ни одна серьезная программа без глобальных переменных просто не обойдется. Все должно контролироваться здравым смыслом. Глобальные переменные были есть и будут. Начиная от операционной системы. |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
А ну и славно. Я то уж было испужался - а оказывается не все так и плохо. После заявлений таких метров можно тему и прикрыть.
ЗЫ. а goto хорош но в меру на мой начинающий взгляд. |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
так уж ничего... Переменных должно быть как можно меньше, а время их жизни как можно короче. Например, порядок инициализации глобальных и статических переменныз из разных модулей неопределен. Глобальные данные усложняют программу. Зачастую очень трудно вносить изменения в проект, если это касается работы с глобальными данными. Другое дело , что не всегда возможно или не всегда просто обойтись без них. |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
Я убедился в одном - все можно - но в меру. Эврика!!! Но тем не менее я удовлетворен полученными мнениями. Что бы я без вас делал - наверно считал бы на калькуляторе!!!
|
|||
|
||||
MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Fazil6,
заметь, я не призывал использовать глобальные данные я лишь сказал, что ничего плохого в них нет, если использовать их по делу и с умом и привел примеры, где без них никак (или почти никак)
не определен, но при передаче управления в main() они уже инициализированы (до main выполняется куча кода по инициализации, секции .init, .text (до main)) Добавлено @ 09:25
ну что за обобщение? кто такое сказал? не все в нашей жизни ООП для каждой задачи свое решение и не всегда количество переменных со временем их жизни связано приведенным тобой соотношением Добавлено через 8 минут и 9 секунд вот пример
до main() тут дело даже не дойдет и нам здесь абсолютно побоку, порядок инициализации и прочие вещи а вот если мы попадаем в main(), это гарантирует, что инициализация всех глобальных бъектов прошла успешно Это сообщение отредактировал(а) MAKCim - 9.10.2007, 09:26 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
MAKCim, имелась в виду проблема порядка ИХ инициализации. При создании глобального объекта A я не могу быть уверен, что глобальный объект B, который у меня в A используется, уже создан.
та проблема, которая описана у Майерса и решалась паттерном Синглтон (довольное неожиданное применения паттерна, кстати ![]() Это сообщение отредактировал(а) Alek86 - 9.10.2007, 09:39 |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Самоя большая проблема с глобальными переменными, при неправильном использовании, это то что неизвестно какое они имеют состояние
я однажды видел проект, в котором использовалось полсотни глобальных переменных вот в таком вот духе. Стоило поменять код в одном месте, начинало глючить в другом. Короче так глобальными переменными лучше не пользоваться. Помимо этого в многопоточных программах, глобальные переменные еще нужно синхронизировать(если это не int ![]() Если пишешь объектно ориентированную программу, то там у тебя будет минимум глобальных переменных, в случае если дизайн правильный. Ведь объекты должны обмениваться сообщениями, а не передавать информацию друг другу через глобальные переменные. Это сообщение отредактировал(а) Lazin - 9.10.2007, 10:06 |
|||
|
||||
Mihhail |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 13.9.2007 Репутация: нет Всего: 9 |
Глобальными обычно назначаются переменные связанные с единственным параметром или свойством.
Нужно исключать ситуации когда одна переменная меняет своё предназначетие от функции в функции, в таких случаях действитеьно возможна путаница и пересечение областей применения. Например для временного хранения однотипных значений можно дыло бы выделить одну глобальную переменную и использовать её во всех функциях, но при условии исключения взаимного вызова этих функций. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
есть некоторые аспекты, связанные с восприятием кода
рассмотрим такую ситуацию
в этой строке есть три объекта: x,f,y здесь мы точно видим: изменяется x, y (если передан по неконстантной ссылке) и f (если это, например, объект с переопределённым operator() ) если эта функция изменяет глобальную переменную z, получается, что мы этого не видим нам нужно смотреть её код даже если функция f только читает содержимое z, всё равно в разных местах программы f(y) может возвращать разные значения для одного и того же y (т.к. она ещё и зависит от значения z) всё это не делает невозможным понимание кода, такие ситуации делают его просто немного труднее Добавлено через 2 минуты и 16 секунд или даже рассмотрим другую ситуацию: мы ловим баг, связанный с тем, что у переменной z устанавливается неправильное значение если она глобальная, это значение, в общем-то может установить любая функция так что сужая область видимости переменной мы сужаем область, которую нам придётся исследовать при ловле багов -------------------- qqq |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
Народ. Блин я думал я знал С++ хоть чуть чуть. Но после ваших высказываний - я понял - учиться мне еще учиться и еще раз учиться.
ЗЫ. И в догонку еще раз учиться. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
есть даже более сильные рекомендации (которым лично я зачастую следую)
[похоже, они пришли из области функционального программирования] строка x=f(y) должна менять только x, т.е. избегать передачи параметров по неконстантной ссылке это опять же позволяет сразу отсеять кучу мест, где может меняться "y", уже на этапе простого визуального "пробега" по коду (а именно - те, в которых "y" не стоит слева от знака равенства) -------------------- qqq |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
И еще это засорение пространства имен. Я люблю когда все схожее называется одинаково. Глобальная область видимости мне не дает такой свободы, ведь каждый раз нужно придумывать всякие префиксы к именам, уж лучше написать класс / структуру.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |