Войти
ПрограммированиеФорумОбщее

Глобальные переменные в С++ (2 стр)

Страницы: 1 2 3 410 Следующая »
#15
10:08, 15 янв. 2021

Zab
> Соблюдение строгих правил полезно тому, кто этих правил не понимает и не способен пока сам технологии вырабатывать.
неужели ты думаешь, что кто-то из них это признает


#16
10:34, 15 янв. 2021

Suslik
> неужели ты думаешь, что кто-то из них это признает
Не только не признает, но и не осознает. Причин случающихся с ними неприятностей не понимают. С какой стати ему следовать правилам? Если только, насильно кого загоняют в рамки. Но для этого нужна строгая технологическая среда, с тотальным контролем. Где такая есть?

#17
(Правка: 11:34) 11:31, 15 янв. 2021

Zab
> Соблюдение строгих правил полезно тому, кто этих правил не понимает и не способен
И сращу все проекты с LOC больше 150к, особенно автомобильные. Где кода под 5кк строк, свои компиляторы под таргет. Жоский TDD с жоским кавереджем. Cразу забили на strict, сэйфти гайдлаенс, и прочие clang-tidy, clang-format. Мда, умозаключение прост гениальное.

#18
11:34, 15 янв. 2021

Zab
> Где такая есть
Компиляторы, браузеры, ембедед, движки, ОС, драйвера, трансляторы-интерпретаторы, обработка сигналов, навигация, тренажеры, хайлоад, авиация.

#19
11:44, 15 янв. 2021

rcsim
Хорошо, перефразирую. Делая некие данные или statefull функционал глобальными, мы "бетонируем" их уникальность. То есть если мы сделали менеджер ресурсов глобальным, значит мы точно уверены, что он будет один на все приложение. И вроде бы все хорошо - кому нужно в игре, например, 2 набора одинаковых текстур или звуков? Все классно, удобно, я так и сделал. А потом писал редактор и там, внезапно, оказалось, что для каждого открытого документа нужен свой уникальный набор. Не буду вдаваться в причины - это вне этого обсуждения. И огребаю я теперь во весь рост - приходится переключать состояния менеджера каждый чих. Подобные вопросы и с многопоточностью были. Например, был у меня глобальный контекст клонирования. А когда потребовалось создать отдельный поток, пришлось городить свой аналог thread_local (ну, это бы я не называл проблемой, thread_local для этого и придумали). Или логгер, например. Начинают сразу несколько потоков ломиться в один логгер, и приходится синхронизировать. А не был бы он глобальным (хотя трудно представить такую архитектуру), нужный поток создал бы свой логгер и писал бы в него, никого не трогая.

#20
14:56, 15 янв. 2021

Went
> А потом писал редактор ... внезапно, оказалось, что ... нужен ...

Ну то есть появилась новая задача, которая должна решаться по другому. И что?
Ты не хочешь переделывать, а хочешь чтобы одно единственное решение работало везде?
Или хочешь чтобы неудобную задачу "отменили"?

#21
15:20, 15 янв. 2021

rcsim
> Ты не хочешь переделывать, а хочешь чтобы одно единственное решение работало
> везде?
да, ради этого ООП и был придуман)

#22
15:44, 15 янв. 2021

rcsim
Утверждение, что я чего-то хочу некорректно. Идеальное решение, да, хорошо работает везде, его легко масштабировать и адаптировать под свои нужды. Но в реальном мире каждая новая задача может требовать переделки уже имеющегося кода. И одна из причин этих переделок - глобальные переменные. Далеко не единственная, но тем не менее.

#23
12:58, 17 янв. 2021

Глобальные переменные - зло. Чем их меньше, тем лучше.
На моих рабочих и личных проектах их почти что нету. Почти всегда это глобальные объекты вроде логгера или аллокатора.

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

#24
(Правка: 18:39) 15:45, 17 янв. 2021

Panzerschrek[CN]
> На моих рабочих и личных проектах их почти что нету.
это очень важно для нас, держи нас в курсе.
а на моих проектах глобальные, и все отлично.


> глобальные объекты вроде логгера или аллокатора.
чем глобальные переменные отличаются от глобальных обьектов?

ты уверен что это безопасно?
ты смотри, это как работает? пишешь ты функцию/метод, которая реально только складывает два числа, и решаешь что тебе надо тут обратиться к глобальному аллокатору памяти и очистить его? это так происходит?

#25
18:36, 17 янв. 2021

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

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

- Глобальная де факто константа, т.е. хоть она и переменная, то после инициализации своего состояния не меняет. Это может быть при чтении файла конфига, например.
- Глобальная рид-переменная. Переменная, которую меняет только одна функция (или несколько в пределах одного класса/файла), но читают - все.

Но вообще я разочаровался в pure глобальных переменных, и причина всего одна - у них отсутствует какой-либо идентификатор принадлежности к сущности. Т.е. надо либо иметь очень четкий и длинный нейминг типа g_loggerLogBufferSize/g_displayScreenSizeXY где первое слово служит псевдо-неймспейсом, либо таки распихивать по неймспейсам (что противоречит философии "быстро нафигачим глобальных переменных а потом разберемся, если когда-нибудь понадобится").

#26
(Правка: 18:56) 18:42, 17 янв. 2021

jaguard
> Т.е. надо либо иметь очень четкий и длинный нейминг типа
> g_loggerLogBufferSize/g_displayScreenSizeXY

namespace display { namespace screen {

int w;
int h;

}}
это реально сложно

>g_displayScreenSizeXY
g_ScreenSize

#27
20:57, 17 янв. 2021

Panzerschrek[CN]
Уровень аргументации наших оппонентов изрядно доставляет.

#28
(Правка: 22:46) 22:36, 17 янв. 2021

MikeNew
> в плане скорости выполнение программы, глючности/безглючности, наличия
> каких-нибудь специфических особенностей глобальных переменных
Если в процессе написания программы всерьез возникает хоть один из этих вопросов, немедленно выкидывайте исходники и начинайте заново.

#29
5:53, 18 янв. 2021

forwhile
>[b]jaguard[/b]
> распихивать по неймспейсам (что противоречит философии "быстро нафигачим
> глобальных переменных а потом разберемся, если когда-нибудь понадобится").


До конца не читай, сразу отвечай?

А глобальная переменная, скрытая в неймспейсе, уже не столь глобальна, вообще говоря.

В чем главное преимущество глобальной? Глобальный скоуп. Ты можешь средствами IDE быстро найти переменную, помня лишь отдельные буквы. Ты пишешь, IDE фильтрует. В твоем случае, если не помнишь в каком неймспейсе твоя переменная, ты ее не найдешь.

Страницы: 1 2 3 410 Следующая »
ПрограммированиеФорумОбщее