0
Under review

На столько ли плохи синглтоны?

Mim 4 years ago updated by иван хак 4 years ago 2

Всем привет. Очень избитая тема, НО ДО СИХ ПОР не дает покоя, стремление к идеалу (делать идеально проект / код) заставляет постоянно думать об этом.

Сразу скажу что: речь именно про объекты одиночки, в том числе сингл. игра где всегда будет один игрок.
речь про домашний проект, но я всегда думаю про крупные фирмы (например делал бы ведьмака, как там быть, вряд ли там используют синглтоны).

Не совсем понимать эти слова:
Вы не сможете просто взять и использовать класс, зависящий от одиночки в другой программе. Для этого придётся эмулировать присутствие одиночки и там.
А типа если через зависимости:
public Player Player {private get; set;}

То у вас не будут проблемы с переносом класса? Что за бред, у вас будут те же проблема, вам так же нужно будет у класса игрока ставить все функции что были в вашей программе. Отличие только в том что вместо кода "Player" вы пишите "Player.Instance" и все.

Я понимаю делать через зависимости (я написал выше пример, когда кто то главный ставит тебе ссылки), но это порождает кучу лишнего кода (это пол беды) и главное множество лишних операций программы.
Допустим у меня есть отдельная подгружаемая сцена (Unity) в которой 10 объектов, им всем нужна 1 ссылка на игрока (что бы вызвать метод при уничтожении например). Мне придется изначально создавать список в этой сцене (или хуже того, динамически искать компоненты), который будет ссылаться на эти 10 объектов, после загрузки сцены мы обходим список и всем 10 объектам ставим ссылку. Вместо того что бы просто в нужный момент вызвать "Player.Instance.Method()"?
То есть мы жертвуем: храним в памяти список с ссылками (кол. * 6-8 байт (забыл сколько точно в Unity занимает ссылка), + обход в массиве + получение элементов по индексу + установка зависимости через метод доступа set;
И все это ради того, что бы не использовать синглтоны верно?

Интересует мнение опытных людей. Может кто видел исходники ААА игр, есть ли полностью на синглтонах игры?

+2
Under review

Отличная тема для холивара!


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

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

+1

В одном проекте реализовывал с целью снижения обращения к памяти точнее ее повторного использования
суть - при обращений к полю объекта проверить возможность пользователем на просмотр этого поля , редактирование итд. каждое поле проверяеться отдельно - такова структура ее измениния слишком дороги для системы.
переписать модель разбора политик то же не представляеться возможным в  связи с тем что 60 % данных обрабатываються хранимиыми процедурами oracle сервера
несмотря на кеширование мне приходиться каждый раз получать 13 мб массив (промышленная система) 
обход этого массива составлял 25 сек с учеом всех проверок.
После сохранеиния однотипных данных в синглтон скорость обработки возрасла до 2 сек 
Забыл отметить что код писан на PHP то есть переменные сушествуют на момент запроса к серверу.
Вообщем суть месседжа - стремление сделать все как надо очень сильно конфликтуют с задачами бизнесса, для себя принял решение все делать по мере необходимости и там где это оправданно