LINUX.ORG.RU

насколько целесообразно уклоняться от создания глобальных объектов?

 ,


1

5

Мне нужно уйти от static-only класса и меня смущает количество мест, куда нужно пробросить указатель на объект.

известно, что объект будет создан только в одном экземпляре и будет использоваться в половине сырцов.

★★★★★

Последнее исправление: post-factum (всего исправлений: 6)
Ответ на: комментарий от note173

Плюсую вопрос.

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

Suntechnic ★★★★★
()
Ответ на: комментарий от geekless

Ну это уже практически == эмулировать объект там где его нет и юзать глобальный «объект». Т.е. смысл ответа не меняет, хотя в общем, да - такой подход более правильный и более unixway'ный.

Suntechnic ★★★★★
()
Ответ на: комментарий от Suntechnic

Почему?

Прощаемся с производительностью, встречаем deadlock'и.

dmfd
()
Ответ на: комментарий от note173

Никак. Мне приходит в голову только то, что архитектуру проектировать так, чтобы глобальных изменяемых сущностей не было. Либо в крайнем случае делать синглтон, с которым общаться исключительно через thread-safe методы, или смотреть в сторону actors/STM.

Иначе в начале каждого сорца нужно капсом писать "не пытайтесь что-то распараллелить".

dmfd
()

известно что обьект они будут создан только в одном экземпляре и будут пользоватся в половине сырцов.

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

Manhunt ★★★★★
()

А что там в том объекте то?

nanoolinux ★★★★
()

Я такие объекты добавляю в класс Applicaiton.

Потом получаю его вот так:

SomeObject* Application::instance()->getSomeObject();

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

trex6 ★★★★★
()
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от O02eg

Плохо будет, когда его хелло ворд будет требовать 4 гига оперативы и i7.

Ну да, а синглтон спасет от этого.

tailgunner ★★★★★
()
Ответ на: комментарий от O02eg

Того же мнения, только еще продумать порядок мультипоточной инициализации, или же наложить разумные ограничения

westtrd
()
Ответ на: комментарий от trex6

каменнопочечный век, йейбогу в яве давно уже есть ServiceLocator и Dependency Injection

Deleted
()
Ответ на: комментарий от trex6

Не ожидал, что ты умеешь делить на ноль =)

По теме: ТС, не слушай никого, кто советует синглтоны (в С их еще глобальными переменными называют). В теории паттерн хороший, но на практике нередко стреляющий в ногу.

Так что не бойся и пробрасывай всюду, где он нужен. А вообще, посмотри внимательно на свой класс, может у него слишком много сфер ответственности и проще разбить его на несколько небольших классов, чтобы каждый из них «где родился - там и пригодился»?

kulti ★★
()

Глобальные штуки - это геморрой. Рано или поздно они испортят тебе жизнь.

Вообще мне непонятно, от чего ты пытаешься уйти. «static-only класс» - это то, что приличные люди делают неймспейсами? Но тогда откуда у тебя указатель на объект?

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

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Вообще мне непонятно, от чего ты пытаешься уйти. «static-only класс» - это то, что приличные люди делают неймспейсами? Но тогда откуда у тебя указатель на объект?

у меня class перестал быть static-only и поэтому потребовался указатель на обьект.

cvv ★★★★★
() автор топика
Ответ на: комментарий от kulti

Не ожидал, что ты умеешь делить на ноль =)

а некоторые еще умеют делить на -1 так что приложение падает по SIGFPE ;)

cvv ★★★★★
() автор топика
Ответ на: комментарий от kulti

Так что не бойся и пробрасывай всюду, где он нужен. А вообще, посмотри внимательно на свой класс, может у него слишком много сфер ответственности и проще разбить его на несколько небольших классов, чтобы каждый из них «где родился - там и пригодился»?

ну у мого приложения 3 класса напрягающих пробросом указателей: Logger, UI и Config. Назначение и функциональность надеюсь из названия очевидна.

cvv ★★★★★
() автор топика
Последнее исправление: cvv (всего исправлений: 1)
Ответ на: комментарий от cvv

Логгер оставить статичным (во всяком случае используемые методы), Config получать от какого-нибудь главного синглтона типа Application или Core.

quiet_readonly ★★★★
()
Ответ на: комментарий от cvv

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

Harald ★★★★★
()
Ответ на: комментарий от cvv

каким образом? где ты предлагаешь хранить открытый файл?

Получать инстанс логгера внутри статического метода. Или freopen при инициализации.

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

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от trex6

А синглтоны способствуют уменьшению потребляемой памяти?

Меньше используется стек, чтобы гонять указатели по функциям, меньше используется куча (если используется глобальная память для объекта).

O02eg ★★★★★
()
Ответ на: комментарий от trex6

В одном приложении может быть только одно приложение. ШОК. ФОТО. БЕЗ СМС.

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

anonymous
()
Ответ на: комментарий от dmfd

Я не делю технологии на черное и белое. Синглтон это, чаще всего, плохое решение для класса, но экземпляр приложения в приложении может быть только один. Se la vi.

trex6 ★★★★★
()
Ответ на: комментарий от anonymous

В одном приложении может быть больше приложений

Как там у вас в параллельной вселенной? Коровы до сих пор кофе дают или перешли на кефир?

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Как там у вас в параллельной вселенной? Коровы до сих пор кофе дают или перешли на кефир?

Если у тебя не хватает мозгов придумать каким образом в приложении может быть несколько объектов класса Application, то это вовсе не означает, что у нас с тобой разные вселенные.

И где же ответ на мое «во-вторых»?

anonymous
()
Ответ на: комментарий от anonymous

И где же ответ на мое «во-вторых»?

Неужели я должен отпускать свои низкосортные шуточки о каждом высказанном вами нелепом предположении?

trex6 ★★★★★
()
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от O02eg

Преждевременная оптимизация до добра не доводит.

trex6 ★★★★★
()
Ответ на: комментарий от anonymous

А твой Application::instance это уже внезапно не синглтон?

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

m0rph ★★★★★
()
Ответ на: комментарий от trex6

Да уже все разъяснилось дальше в треде. Удачи.

kulti ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.