|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
Используете ли вы глобальные переменные13.07.2016, 23:47. Показов 6756. Ответов 72
Метки нет (Все метки)
Добрый вечер,
используете ли вы у себя в коде глобальные переменные между единицами трансляции и/или в конкретной? Моё мнение: нужна общая переменная делаем сингтон (+контроль, +гибкость, +ООП, +lazy inizilization). P.S. Смотрю проекты гитхаба С++ - используют люди глобальные с extern, блэк-джеком и пушками. Смотрю в чём плюсы такого приёма - не вижу. Человеческая лень? Знаю пример, когда на cpp заводят
0
|
||||||
| 13.07.2016, 23:47 | |
|
Ответы с готовыми решениями:
72
Глобальные и статические глобальные переменные Глобальные переменные Глобальные переменные |
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|||||||||||||
| 18.07.2016, 13:07 | |||||||||||||
|
Не по теме:
![]() Там между строк у меня написано что задачи еще остались, но наращивать мы не можем, потому что в одном месте правишь - в 100 ломается, классический такой багофикс процесс )))) И что нам делать начинать?![]() Если вы так боитесь наследования от класса содержащего ваши две функции subscribe & send, то не наследуйтесь, а агрегируйте и делегируйте. смотрите код :
Скорость vs гибкость, в данном вопросе я выберу гибкость. Но спрошу на всякий случай, там точно std::functon внутри не стрятан? а-то это такой себе компайлтайм))
0
|
|||||||||||||
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
||
| 18.07.2016, 13:08 | ||
|
Если у меня есть два модуля m1 и m2, такие, что они оба нуждаются в ресурсе X, и при этом я могу передать каждому свой X, то всё хорошо. А вот если есть какая-то необходимость им передать строго один и тот же X, значит между m1 и m2 существует сложная скрытая связь. Никто не говорит, что глобального состояния нет. Оно всё равно есть, но ваши компоненты не должны нуждаться в глобальном состоянии, иначе их нельзя переиспользовать без этого состояния. Если я буду вести лог с помощью std::cout, то я буду к нему привязан. И если завтра мне понадобится писать лог в файл, а сообщения продолжать писать в std::cout -- будут проблемы. Или я захочу переиспользовать часть своей системы в другом проекте, а там другое логгирование, что делать? Искать везде std::cout и заменять на другое глобальное имя? Глобальные имена есть, но моей программе они не нужны! Я в main создам объект моего приложения и передам в конструктор std::cout. Если потом понадобится, то передам другой объект. Я не связан глобальным состоянием. И нет никакой необходимости использовать строго один какой-то std::cout в моей системе. Да пусть их хоть 10! Моя программа от этого не испортится, потому что в конструкторе захватит один конкретный.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||||||||
| 18.07.2016, 15:31 | |||||||||||||||||||||||||||
|
Не по теме:
и практическими соображениями вы вообще ничего так и не поняли. здесь вообще нет места быть богам. и не понятно с чего вообще могло возникнуть такое мнение. такое впечатление, что вы представляете себе совсем не то, что я пытаюсь вам описать. допустим изначально был функционал:
нам дали задачу: сделать функцию, которая вернет список скрытых баз данных (сигнатуры скрытых баз данных описаны в клиентском конфиге) и вот мы добавляем функцию:
нам дали задачу - мы делаем. дали другую - делаем другую. я помимо этого админа, ещё много чем занимаюсь. можно начать с вашего увольнения, например. лично у меня, что бы не было такой ситуации, когда правка в одном месте ломает в других, предусмотрены юнит-тесты. и кстати, я подсадил на TDD все те конторы, в которых доводилось работать. это теже яйца, только сбоку. нафига мне чего то там агрегировать, когда я могу получить тот же результат ничего не агрегируя. нафига вообще писать дополнительный код, и захламлять бизнес-логику деталями, которые к ней не относятся, если можно ничего не писать, и получить такой же профит? "всегда быть готовой к использованию по первому требованию клиентов". ваша глобальная переменная не отвечает этому требованию, поскольку не имеет иммунитета простив static-order-fiasco ну или выгонять на сишку под зад метлой. на языке с++ элементарно реализуются безопасные решения c проверкой всех типов времени компиляции. то получится ровно тоже самое только удобств будит меньше, кода больше, работать будет медленеее. в остальном - никакой разницы. по прежнему любое создание сможет подписаться/отправить что ему захочется. сингелтоны тут вообще не причем. это - бич паттерна эвент-систем. неаккуратное использование может запросто привести к спаггети времени выполнения. это - в тысячу раз хуже goto. что значит уведомляет даже тех, кому оно и не нужно? что за бред? эвент-систем уведомляет только тех, кто подписался. а не всех подряд. классическая модель в духе "банды четырех" реализуется на интерфейсах. подписчк наследуется от интерфейса подписчиков. получатель - от интерфейса получателей сообщение - от интерфейса сообщений. хотите создать новое сообщение - создайте класс и наследуетесь от интерфейса. в итоге, что там за сообщение - это информация времени рантайм. я уже молчу про ваш лютый void* - вот где источник рантайм ошибок. за такое вообще убивать нужно. в те времена std::function ещё не было. однако к тому моменту, у меня уже был опыт изготовления делегатов собственного производства. и хотя под капотом моей эвент-систем не было статического делегата, но опционально (нацеливание на указанную функцию-член приёмник) некоторые элементы присущие статическим делегатам я использовал. std::shared_ptr - это конечо же следствие проблем в дизайне. extern - это конечно же следствие проблем в дизайне. локальный статик - это конечно же следствие проблем в дизайне. std::cout - это конечно же следствие проблем в дизайне. что в этом плохого, если это облегчает жизнь, как при разработке, так и при сопровождении? я даже перефразирую: что в этом плохого, если это не создает проблем? а только дает профиты. не нужно решать проблемы будущего, которое может и не наступить. гибкость ради гибкости не нужна. это - тонны кода, который не приносит пользы. и который придеццо потом сопровождать. система должна быть максимально жесткой. но при этом отвечать заявленным требованиям. чем жесче - тем лучше. эта жесткость позволит её легко сопровождать. чем жестче конструкция, тем легче в ней ориентироваться. а я могу повязать хоть весь код на std::cout, а вывод организовать, хоть в консоль, хоть в файл, хоть в строку, хоть во все места одновременно. с точно таким же успехом, как это можете сделать вы. вот только мне не придется через аргументы простаскивать стрим по всем лабиринтам.
0
|
|||||||||||||||||||||||||||
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
||
| 18.07.2016, 15:55 | ||
|
Но через год оказалось, что для одного из модулей есть необходимость поддерживать второе соединение. Вот была беда-беда огорчение...
0
|
||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||||||||||||||
| 18.07.2016, 16:51 | ||||||||||||||
|
В других 10% использований функции сделать Б. ........ В последних 10% использований сделать <10 буква алфавита >.А у нас была только одна функция? Мы практически никогда не можем верно оценить будущее расширение. Я не готов рисковать, точнее я устал рисковать и больше не хочу. Не по теме: Пошутили и хватит. Я говорю о том, что задача не выполнена, и выполняться будет, в связи с загруженность класса, высокой связанностью и недоступность ООП инструментов для расширения, очень много времени. ![]() Не по теме:
Они лишь помогут, да и скорее всего завтра. Т.е. вместо того чтобы поправить пару ООП абстракций, мы будем достаточно долго разгребать гору процедурного кода. ![]()
Скажу лишь что сопровождать хорошую абстракцию очень легко. И написать её - проверяйте свою скорость http://klavogonki.ru/ и потом осознайте, что лишнее в абстракции пишется за 5 минут времени, а-то, что вы пишите это не за 5 минут, а за 35, так это потому, что вы не привыкли так писать, т.е. вы не знаете что писать. (hoggy, это не лично вам, я не хочу это обсуждать , это ИМХО для интересующихся)
0
|
||||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 18.07.2016, 17:17 | ||||||||
|
мои ученики предусмотрели возможность предкомпилированных запросов. и пул соединений. так они решили проблему экранирования текста запроса, и проблему балансировки серверов дата-центра. мы разработали этот дизайн. и мы прекрасно знаем какие у него возможности и ограничения. и это касается не только сингелтонов, а вообще любых наших механизмов. в общем, не распарсил. посмотрите например, как устроенна эвент систем в бибилотеке CEGUI получатель получает сообщение в виде базового интерфейса сообщений. далее он кастит его к ожидаемому наследнику. это - территория рантайм. static_cast - может вернуть неконсистентную кашу, если вы ошибетесь с наследником. dynamic_cast - тормозной, к тому же ну допустим он вернул ноль, и что вы будите делать? самое хреновое, это то, что любые подобные сбои будут известны лишь времени выполнения. статические модели, на подобие тех, что проектировал я сам, обеспечивают типо безопасность времени компиляции. не нужно ничего ни кастить, ни проверять. организовали тебя через одно место. ну ладно, хотя бы так.
0
|
||||||||
| 18.07.2016, 17:35 | |
|
0
|
|
| 18.07.2016, 17:39 | |
|
0
|
|
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||||||||||
| 18.07.2016, 18:19 | ||||||||||
|
Приведу еще выдержку из книги "Game programming patterns":
Каждое решение принимается не так просто. 1) Прикидываем, как система может расширяться 2) Оцениваем вероятность каждого расширения 3) Для каждого возможного решения: для каждого расширения считаем трудозатраты на код сейчас + код расширения, с учетом вероятности; суммируем для всех расширений, получаем грубую оценку в уме для каждого решения. 4) Сравниваем решения, выбираем лучшее.
1
|
||||||||||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|||||||
| 18.07.2016, 18:53 | |||||||
|
Не по теме:
Но да, компайлтайм проверка выглядит вкуснее. Не по теме:
1) Какими инструментами вы будете расширять сингелтон? Добавление еще функций-методов - раз. Какими ещё инструментами? 2) Если новая функция-метод потребует изменение внутреннего представления состояния, вы будете его менять? Или дублировать? Или возвращать копию/"<data>_view"? 3) Сколько новых функций(или другие количественные характеристики приведите) вы готовы поддерживать? Где заканчивается сингелтон и приходит говнокод? Третий вопрос требует какого-нить контекста, пусть это будет обсуждаемый выше конфиг "connection/user/pass" и функции учитываем достаточно серьезные, аля вернуть сгруппированное древо, и раз это модель, то можно в неё запихать например фильтры.
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||||||||||
| 18.07.2016, 19:33 | ||||||||||||||||||||||||||||
|
повторять не буду: вот есть постгресс. документацию читаем. с бд упражняемся. вы должны понимать дизайн постгресса. и только с учетом этого дизайна пилить хотелки заказчика. добавим функций-членов, если понадобится. ведь у меня не будет выбора. однако, я в большинстве случаев на практике, мне удавалось сделать так, что бы такой необходимости не возникало. что за вопрос вообще? выше я ужке писал, что это в тысячу раз хуже, чем goto. например: A связывается с Б Б связывается с Ц Ц - убивает A потом стек крутится в обратку. и оказывается, что А - труп. но он об этом не знает. стоит ему поиметь вызов своих данных или виртуальных функций - в лучшем случае повезет, если сразу упадет. а концы потом искать... по всей этой петле лазить вникать во все уровни иерархии класов. шляпа в общем. здесь на самом деле полная аналогия с эвент-систем. событийные модели так же жестоко страдают от подобного пинпонга. но если систему сообщений можно исскуственно ограничить (например, обязать всех подписчиков быть std::shared_ptr) то с паттерном "сингелтон" все гораздо печальнее. он слишком уязвим в этом смысле. что бы его использовать получая профит - тут либо привентивно безопасные техники, либо программисты, которые приученны к высокой культуре программирования. а иначе - запрещайте паттерн. другая так же темная сторона: сингелтон можно позвать в обое время, из любой точки программы. в реалиях нашего мира, c его 8ми ядерными процессорами, мы зачастую имеем дело с многопоточными приложениями. здесь классическая реализация сингелтона очень уязвима. мы конечно можем повтыкать в него критические секции. но адепты многопоточки лишь криво усмехнуццо. представьте себе: мы из разных потоков пишем в std::cout что бы данные не перемешивались, нужно ставить синхронизацию. но если мы это сделаем - мы создадим чудовищную конкуренцию за ресурс, и сведем на нет весь профит от многопоточки. на самом деле, как паттерн, сингелтон вполне реализуется и в многопоточной среде. тут смысл в прямых руках. я например, знаю как реализовать логгер в многопоточной среде без пенальти. то есть, я хочу сказать, это не проблемма паттерна. это проблема прямых рук. Добавлено через 14 минут кстати, флажков - нет. (в реализации) найдите 10 принципиальных отличий:
и да - сишный модуль всегда в ед. экземпляре. см природу чингелтона и сишного модуля. выдержку не читал. я лишь утверждаю, что гибкость ради гибкости не нужна. алгоритм оценок рисков у меня схож с вашим по описанию.
0
|
||||||||||||||||||||||||||||
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|||
| 18.07.2016, 20:10 | |||
|
Вы нам предъявляете какое-то статической чудо и обзываете его синглетоном. Каждый модуль имеет свою функцию инициализации, которая возвращает указатель на выделенный энвайронмент/неймспейс/окружение, с которым и работает программа-клиент. То есть, по сути, любой сишный модуль -- это набор "методов", а каждое окружение -- отдельный объект, который, па скудности средств Си, приходится передавать в каждый вызов руками. Но никаких синглетонов. Взять хотя бы работу с файловыми дескрипторами. Я могу их создать столько, сколько мне нужно, как наплодить объектов-потоков...
0
|
|||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||||||||
| 18.07.2016, 20:33 | ||||||||
|
0
|
||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 18.07.2016, 21:06 | ||||||
|
пачка сишных функций (модуль/библиотека) ничем по своей природе не отличается от сингелтона. надеюсь вам не нужно рисовать сишное апи, и аналог в виде сингелтона? это можно принять, если это не мешает диалогу. я свободно читаю технический английский. но в нашем с вами общении, я хочу живое мнение живого человека. литературы я итак дофига читаю. мне не интересно читать ваши ссылки. мне интересно лично ваше мнение. понимаете? я вовсе не хотел вас обидеть, если что. вашу ссылку я срисовал для прочтения "потом". Добавлено через 9 минут пока вы их не найдете (а вы их не найдете, потому что их нет) вы не поймете.
0
|
||||||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|||
| 19.07.2016, 22:38 | |||
|
hoggy, а есть причина, по которой лучше выбрать синглтон, а не например service locator?
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 19.07.2016, 23:26 | ||||
|
независимо от того, сингелтон это или нет, если изначально функционал не был бы предусмотрен. и не пришлось бы ничего делать, если бы был предусмотрен. то есть, этот момент ортогонален паттерну "сингелтон". и не имеет к паттерну никакого отношения. однако, любой сингелтон всегда можно представить в виде пачки сишных функций (ну или одной, если у него всего один метод) а любую пачку сишных функций (ну или одну) всегда можно представить в виде сингелтона. таким образом, с технической точки зрения между сишным модулем и сингелтоном нет никакой разницы вообще. а не сервис-локатор, который вообще сингелтонам ортогонален. ничего не мешает реализовать сервис-локатор, как сингелтон, например
0
|
||||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||||
| 20.07.2016, 00:27 | ||||
|
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||
| 20.07.2016, 00:45 | |||||||||||||||
|
для этого вам придется это сделать. код сам себя не напишет. если вам это понадобилось - вам придется написать интерфейсы, реализации, и тп. при этом не важно, чем является ваш сервис-локатор: сингелтоном, или обычным классом. разница лишь в том, что в случае с сингелтоном не придеццо протягивать его по всем лабиринтам. то есть кода будет меньше. в этой теме я уже приводил этот пример:
между сингелтоном и сишным модулем вообще нет никакой разницы в техническом смысле. с технической точки зрения у них одна и та же природа, одни и те же недостатки, и даже один и тот же дизайн использования. ругать синглетон - все равно что ругать сишный модуль. но почему то никому не приходит в голову ругать сишные модули. а само сравнение полагают неуместным. наверное, потому что не доходит до мозгов, что разницы между ними на самом деле нет.
0
|
|||||||||||||||
| 20.07.2016, 01:34 | |
|
Эмм... В тему топика. Когда
Не бейте - ООП не знаю, банду паттернов не читал.
0
|
|
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
||||||||
| 20.07.2016, 01:42 | ||||||||
|
Да, делать яичницу из огурцов -- это не моё.
0
|
||||||||
| 20.07.2016, 01:42 | |
|
Глобальные переменные Глобальные переменные Глобальные переменные Глобальные переменные
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|