Почему singleton плохо, а share из DI контейнеров, которые по сути тоже создают singleton - это хороший паттерн? И В чем отличие?
2 Answers
Хороший вопрос.
На самом деле share из DI контейнеров тоже плохо.
И большинство нормальных фреймворков уходят от работы с контейнером напрямую. В Симфони в контроллере получишь не контейнер, а фигу.
Потому что все зависимости класса должны передаваться в качестве аргументов в конструктор. И в итоге контейнер используется только при автоматическом создании классов, чтобы было откуда брать экземпляры классов-зависимостей.
-
Спасибо!
Но все же становится непонятным, как быть, если мне в проекте например нужно использовать класс, перед инициализацией, нужно инициализировать еще несколько классов, и передать их в качестве зависимости в конструктор. Кроме этого, потребуется конфигурация объекта перед началом использования.
– человек мякоть May 20 '19 at 19:34 -
Получается, чтобы мне работать каждый раз с этим объектом, в разных файлах проекта, то нужно будет каждый раз создавать объект вместе с его зависимостями + конфигурация ? Я конечно, могу это все обернуть в какой-нибудь wrapper. Но тогда будут плодиться одинаковые объекты, а мне и одного экземпляра для всего проекта достаточно. Как быть? Синглтон ?
Я думал DI контейнеры решают такие проблемы, поэтому начал копать в этом направлении.
– человек мякоть May 20 '19 at 19:35 -
Что делать, если синглтон - антипаттерн, Глобальные переменные - Зло. Но задача требует создать только 1 объект ? (думаю пример, когда требуется только 1 объект не нужен, и все так знаю кучу таких примеров). – человек мякоть May 20 '19 at 19:38
-
Идея тут в том, что когда тебе нужен новый объект бизнес-логики, то ты его создаешь не сам, передавая в качестве зависимости контейнер, из которого ты по потребности извлекаешь нужные сервисы, а новый объект тебе создает контейнер и передает в него потребные сервисы через конструктор. – Ипатьев May 21 '19 at 05:04
На мой взгляд вся пропаганда о том, что синглтон плох - это для начинающих разработчиков, которых остерегают от того, чтобы они везде их не напихали, и чтобы их потом за это не уволили.
И.М.Х.О. Синглтон надо уметь применять к месту. Вот и всё.
-
Вы не правы. Синглтон хорош для начинающих разработчиков. Потому что обеспечивает единство экземпляра и лёгкое инстанцирование. А плох он как раз у опытных разработчиков. Потому что обладает рядом существенных недостатков – ArchDemon May 19 '19 at 19:29
-
"На мой взгляд" - имеется ввиду, что я выражаю своё лично мнение. Хорошее оно или плохое - это моё лично мнение. Если синглтон - это плохо, то оно плохо для всех - и для начинающих и для опытных. Везде понатыкать синглтоны (как иногда делают начинающие) - на мой взгляд не очень хорошая идея. Как и любой паттерн его надо уметь применять. – Ramazan Aliskhanov May 20 '19 at 10:44
Class::getInstance()и не один. Явное всегда лучше неявного. К тому же замена реализаций синглтона в классе требует переписывания кода. В-третьих, код сложно тестировать. – ArchDemon May 19 '19 at 19:27