|
53 / 28 / 13
Регистрация: 01.03.2013
Сообщений: 330
|
|
IoC container вместо Singletone27.02.2023, 08:47. Показов 6220. Ответов 79
Метки нет (Все метки)
Здравствуйте.
В инете много инфы на эту тему, но она довольно не структурирована и сложно понять нужно ли вообще в это вникать на плюсах. В общем есть приложение на Qt. В данном приложении много объектов-одиночек. Хотелось бы избавиться от них. На первых парах не нашел какого-то встроенного инструмента в Qt. Есть мысли написать свой велосипед, но все же хотелось бы использовать проверенное решение. Из того, что я понял контейнер зависимостей это некий класс, имеющий соответствующие методы - геттеры / сеттеры, полем которого выступает словарь {key, val}, где key это строка идентификатор, val - указатель на созданный объект. Но это какое-то слишком простое представление. Там еще фабрики каким то боком). Рад буду любой ссылке либо на статью с подробным описанием решения моей проблемы, либо проекту на гитхабе (желательно максимально простому, не хотелось бы бездумно использовать какой-нибудь громоздкий инструмент на начальном этапе)
0
|
|
| 27.02.2023, 08:47 | |
|
Ответы с готовыми решениями:
79
Класс Singletone
Белый экран при входе в админку - Class 'FOF30\\Container\\Container' not found |
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|
| 01.03.2023, 13:02 | |
|
Ну и по зависимостям.
Мой изначальный пример с синглтоном содержал такие зависимости. В моём примере с DI зависимостей стало меньше. В вашем примере DI на основе шаблонов сохраняется лишняя зависимость от синглтона. Это не означает, что он не имеет право на существование. Это означает, что вы можете лучше.
0
|
|
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
||
| 01.03.2023, 13:29 | ||
|
Я могу предоставлять контракт -- интерфейс или, если вам больше нравится, шаблонный параметр -- который будет использоваться в моих сущностях и не таскать за своим кодом конкретные реализации. В моём коде может вообще не быть упоминаний зависимостей.
0
|
||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||||||||||||||
| 01.03.2023, 13:48 | ||||||||||||||
|
На шаблонах можно так завернуть, что изготавливать наследников от каких то интерфейсов вообще не понадобится. Передавать кучу всякого хлама с помощью аргументов банально не удобно. ТС этой темы специально ушел на сиглетоны, что бы избавить себя от неудобств. Избавьте меня от вот таких вот голословных понтов. У вас была неккая одна единственная реализация. И тут вы захотели организовать поддержку ещё одной реализации. Однако ваш оригиналный код не поддерживает подобную возможность. Разумеется, мне пришлось изменить ваш код. И теперь у вас на руках имеется более продвинутая версия. Это тоже синглетон, но при этом его работу можно кастомизировать. Этот пример наглядно демонстрирует, что использование синглетонов само по себе никак не ограничивает архитектуру в плане расширения. Прикинь, да? Вот только зависимости - это не только наследники от некких базовых классов. Зависимости - это ещё и сами базовые классы, и всё то множество инфраструктурных классов, которые необходимы для функционирования архитектуры. И от этих зависимостей вы никуда не ушли. Вместе с файлами, в которых реализован MyAwesomeImagePostingService, вам так же придется таскать с собой файлы, где описываются интерфесы и прочий обвяз. Вы изначально привели пример модели, которая не умела расширяться. Я её слегка подправила под ваши запросы, и теперь она умеет расширяться. Так а в чем, говорите, проблема заключается? Мне нужна конкретика: в чем проблема? Добавлено через 8 минут Причем, благодаря параметру шаблона синглетон не является зависимостью. Интерфейс - он в сферическом ваккуме существует? Это тоже код, который записан в файле, и который вам придется таскать повсюду со своим логгером. А вот шаблонный параметр может вообще не предполагать наличия каких то интерфесов. С этой точки зрения, разница принципиальная.
0
|
||||||||||||||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
||
| 01.03.2023, 14:00 | ||
|
Он с этим синглтоном никак не связан. И у ТС не встал бы вопрос.
0
|
||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||||
| 01.03.2023, 14:05 | ||||
|
0
|
||||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
||||||||||||
| 01.03.2023, 14:19 | ||||||||||||
|
В данном конкретном примере я показал зависимости кода. В вашем коде другие зависимости. И добавлен способ передачи зависимости. Скорее это уже не синглтон, а сервис локатор. И естественно, что она перестаёт быть проблемой, если её переписать. Что вы благополучно и показали. Добавив указание зависимости, превратив синглтон в сервис локатор. Цель -- уменьшить количество связей. В своём коде я представляю свой контракт, используя который можно менять конкретные реализации. Это позволяет абстрагироваться от конкретных реализаций зависимостей. Например, я не должен за своей библиотекой таскать класс/библиотеки логгера, мне достаточно иметь контракт, который можно удовлетворить. А уж каким образом -- не проблема моей библиотеки. "Синглетон" прямо написан в коде класса. Следовательно, является зависимостью. Класс нельзя будет откомпилировать без класса "синглетона". Дальше больше -- шаблонный параметр инжектит вторую зависимость. В результате финальный класс зависит от синглтона и от класса, указанного шаблонным параметром. И синглтон в коде так же зависит от шаблонного параметра. И всё. Больше ни от чего моя библиотека не зависит. Ни от какой реализации этого интерфейса/шаблонного параметра. Мне не нужно таскать за собой никакую либу. Только контракт. Моя либа собирается без сторонних библиотек. Добавлено через 1 минуту
0
|
||||||||||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||
| 01.03.2023, 14:24 | ||
|
Я не увидел резонной причины. Кликните здесь для просмотра всего текста
Может я конечно мелко мыслю. Но раз у него повсеместно используется что то. Можно поручить какому то Шарику их хранить, и все будут у этого Шарика это использовать, нет ? Откуда родились Синглтоны ? )
1
|
||
|
Комп_Оратор)
|
||
| 01.03.2023, 14:25 | ||
|
Когда слышишь такое, невольно думаешь: - "Молодец. Значит синглтон получился на славу. Наверное."
1
|
||
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
|||||||
| 01.03.2023, 14:45 | |||||||
|
Кликните здесь для просмотра всего текста
1
|
|||||||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||||||||||||||||||||||
| 01.03.2023, 15:11 | ||||||||||||||||||||||
|
Вы вообще понимаете, что такое "зависимость" ? Зависимость - это некоторая деталь, без которой у вас код даже не скомпилируется. Вот пример зависимости:
А вот пример, как с помощью шаблона можно полностью устранить зависимость:
Вы обратили внимание, как легко мне было переделать ваш нерасширяемый синглетон в расширяемый? Мне не понятно, почему вы называете проблемой код, который элементарно переделывается под изменившиеся требования. Проблема в чем? В том, что изменились требования, и пришлось чуть чуть подправить код? Я понимаю: когда ограничение архитектуры, и ничего сделать нельзя. Но в данном то случае, вы высасываете проблему из пальца. И вы это так написали, якобы DI позволит вам этого избежать. А теперь внезапно выясняется, что нет, не позволит. Количество файликов можно уменьшить. Например, не обязательно таскать ненужных наследников. Но так и в случае с моим логгером ровно тоже самое. Вас никто не заставляет обязательно таскать реализации всех синков. А вот интерфейсы, и сопутствующим им обвяз постаскать придется в любом случае. Давайте её уберем, если она вас напрягает:
Вы же не называете интерфейсы зависимостями. Почему тогда вы называете зависимостью деталь, которая наряду с интерфейсами выполняет инфраструктурную роль? Ведь без них класс нельзя будет откомплиировать. Технически, зависимость от интерфейса - это тоже зависимость. Однако, в контексте ооп, зависимостями обычно называют только наследников. А вот интерфейсы и сопутствующие им инфраструктурные классы зависимостями не считают. И если я захочу периспользовать какие то ваши классы где-то ещё, то мне тоже придется таскать с собой их зависимости. Ровно тоже самое, как и в случае с моим логгером.
0
|
||||||||||||||||||||||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|||||||||
| 01.03.2023, 15:44 | |||||||||
|
И скажем, что это одно и то же? Ну нет же разницы никакой. В крупных проектах -- "поправить одну функцию", превнеся несовместимость, означает рекурсивно поправить так же ВСЕ места их использования. Зарелизить все задетые библиотеки по дереву зависимостей. Зарелизить все задетые приложения по дереву зависимостей. Чуть-чуть подправить код?! Не смешите мои тапочки. Не знаю, как в вашем проекте, в нашем же сотни приложений и библиотек, и такой "чуть-чуть поправить код" может занять несколько месяцев. Поэтому мы сразу думаем о том, как уменьшать связанность кода и весьма осторожно подходим к выбору паттернов проектирования. Несколько контр-примеров, когда код собирается, а зависимость неудовлетворена. Или это не зависимость? А что тогда? Представьте себе сервис-локатор, который не вернул нужный сервис, это зависимость или нет? Представьте себе код, который использует внешнюю динамическую библиотеку, это зависимость или нет? Представьте себе код, который использует данные в файле, это зависимость или нет? Нет, не то же самое. В версии с IoC/DI вы сможете подменить логгер на любой другой. В варианте, который вы предложили, придется сначала переделать под DI. Моя библиотека избавлена от необходимости таскать с собой в связке ещё какой-то код. Добавлено через 4 минуты А вот там, где вы захотите её применить, вам придется либо воспользоваться подготовленными мною реализациями, либо написать свою. Добавлено через 4 минуты Magic!
0
|
|||||||||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||||||||||||
| 01.03.2023, 16:32 | ||||||||||||
|
Интерфейсы все равно таскать придется. Получается, что проблема, которую вы обрисовали, связанна не с синглетонами, а с вашими кривыми руками. В моём варианте тоже можно подменить логгер на любой другой. И ничего переделывать для этого не нужно. Я беру какой то класс, готовлю какую то реализацию, на базе вашей библиотеки. Использую в этом классе. А потом вдруг захочу переиспользовать этот класс где нибудь ещё. Но в нем уже будут торчать какие то запчасти, которые мне либо придется руками удалять, либо таскать с собой их обвяз. Это абсолютно тоже самое, как и с моим логгером. Вот взять вот эти строчки: Допустим, я хочу переиспользовать AwesomeService, а мне вообще не нужно никакое логгирование. Но мне все равно придется таскать с собой интерфейс логгера. И вешать на него какую то заглушку. Либо придется руками удалять ненужные строки из кода. Ситуация абсолютно точно такая же, как и в случае с моим логгером. Если он не нужен, то можно выбросить всю библиотеку логгирования, а классу подсунуть заглушку, которую даже не обязательно наследовать от интерфейса. Добавлено через 54 секунды
0
|
||||||||||||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|||||||||
| 01.03.2023, 16:48 | |||||||||
|
Изначально вы попросили меня пример, где синглтон создаёт проблему. Я привел такой пример, добавив, что решение будет через внедрение зависимостей. Вы поменяли мой код, добавив в него внедрение зависимости и говорите, что это то же самое. Очевидно, что вы поняли проблему, раз исправили её. Уводить дискуссию в сторону от начального вопроса -- некрасиво. Не уводите дискуссию в сторону. Я предпочитаю интерфейсом из-за явности контракта. Пока вы не в моей команде, я вас не заставляю. ))) Например -- вы пишете универсальный класс, выполняющий нужный вам функционал, и декоратор, приводящий нужный вам функционал к требуемому контракту (интерфейсу). Пожалуйста, прекратите эту практику.
0
|
|||||||||
|
184 / 72 / 35
Регистрация: 09.05.2022
Сообщений: 388
|
|
| 01.03.2023, 17:36 | |
|
Привет! Кажется, ты ищешь способ управления зависимостями объектов для своего проекта на C++ в Qt. Эта техника называется Dependency Injection (DI) и она может значительно упростить создание и управление объектами в сложных приложениях.
Есть несколько DI-фреймворков и библиотек для C++, которые ты можешь использовать в Qt. Например: Boost.DI - это легкая библиотека только для заголовков, которая предоставляет простой интерфейс для определения и инъекции зависимостей с помощью инъекции конструктора, инъекции сеттера или инъекции свойства. Она хорошо работает с Qt, и ты можешь найти пример использования Boost.DI с Qt на сайте библиотеки. QDI - это DI-фреймворк, специально разработанный для Qt-приложений. Он использует макрос Q_OBJECT для определения зависимостей и предоставляет простой API для регистрации и разрешения зависимостей. QDI также поддерживает автоматическое внедрение зависимостей и может использоваться как с C++, так и с QML. Poco: ependencyInjector - это фреймворк для C++11 и выше, который поддерживает инъекцию конструкторов и инъекцию сеттеров и может использоваться в приложениях Qt.Inversify-cpp - это мощный и гибкий DI-фреймворк для C++11 и выше, который предоставляет простой API для определения и инъекции зависимостей с помощью инъекции конструктора, инъекции сеттера или инъекции свойства. Он также поддерживает автоматическое внедрение зависимостей и может использоваться как с C++, так и с TypeScript. Вот несколько ресурсов, которые могут помочь: Dependency Injection in C++ - это статья с хорошим введением в DI в C++, которая включает примеры с использованием Boost.DI и Poco: ependencyInjector.Modern C++ Dependency Injection - это статья с обзором DI в современном C++, включая пример с использованием Inversify-cpp. Инъекция зависимостей в Qt
0
|
|
|
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
|
|
| 01.03.2023, 17:48 | |
|
karlhildekruger, что за набор слов?
ChatGPT ?
0
|
|
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
||||||||||||||||
| 01.03.2023, 18:18 | ||||||||||||||||
|
Либо ты всегда можешь использовать Вот две сигнатуры:
1
|
||||||||||||||||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||||||||||||||||||||||||||||||
| 02.03.2023, 00:16 | ||||||||||||||||||||||||||||||
|
Я попросила пример, где синглетон создает проблемы. Вместо того, что бы привести пример, где синглетон создает проблемы, вы привели мне пример, где проблема в ваших кривых руках, а вовсе не в синглетоне. Так например, ваши проблемы ко мне вообще никакого отношения не имеют. Это вы уводите дисскуссию в сторону. Я просила привести пример проблемы синглетона. А не проблемы ваших кривых рук.
::mylog::emergency - это имя объекта.Вы можете выбросить полностью всю библиотеку mylog, и подсунуть заглушку, которая просто будет иметь ничего не делающий метод log Вы там выше жаловались, что синглетоны вынуждают вас таскать запчасти. Вот с DI вам тоже придется таскать запчасти. Я привела довольно подробный пример как так получаетсчя. И вот эти ваши декораторы только добавляют запчастей. Добавлено через 9 минут По его мнению, только синглетоны вынуждают таскать запчасти. Вот карандаш означает карандаш. Ботинок означает ботинок. А Log означает Log Добавлено через 3 минуты Это что - повод лазить в реализацию? Тестируют же паблик, а не приват. Пока тесты зеленые, что там внутри - вообще не интересно. Добавлено через 30 минут Например, Петя сделал такую систему сообщений: у него, что бы создать тип пользовательского сообщения, нужно обязательно вручную написать код наследования:
1. Типы юзерских сообщений зависят от библиотечного класса IMessage, что прибивает их гвоздями к Петиной библиотеке. 2. Просто неудобно на каждый чих создавать новый класс. Поэтому Вася посмотрел на всё, плюнул и сделал вот так:
Хитрый Вася просто взял Петину библиотеку, и немножечко подправил шаблон функции Send Внутри этого шаблона автоматичеки создается шаблоно-наследник от IMessage, путем инстанцирования типами аргументов, с которыми была вызвана функция. Поэтому клиентам больше не нужно вручную писать код наследования, а можно сразу запускать Send для объектов любых типов. Это ещё один пример того, как с помощью шаблона можно избавиться от зависимости от интерфейса. А вот человек выше утверждает, что в шаблоны мы передаем зависимости. Какая же это зависимость, если юзерские сообщения никак не зависят от Петиной библиотеки, а Петина библиотека никак не зависит от юзерских сообщений?
0
|
||||||||||||||||||||||||||||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 02.03.2023, 00:52 | |||
![]() Ну так, наверное интерфейсы не воздух подпирают. И они описывают некий функционал который должен определить наследник. Что это за фантазии ? Добавлено через 4 минуты А при чем тут синглтоны ?
0
|
|||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 02.03.2023, 08:18 | ||
|
Что мы, собственно, и наблюдаем.
0
|
||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|||||
| 02.03.2023, 09:04 | |||||
|
Судя по вашим ответам, вы проблемы поняли, показали, как их исправить, а дальнейшей софистикой занимаетесь лишь из любви к искусству. Как и демонстрация высокомерия и агрессии. Продолжение кормления троллей не считаю конструктивным.
0
|
|||||
| 02.03.2023, 09:04 | |
|
Singletone для Class library Паттерн singletone и unit of work IoC контейнер
DI/IoC из коробки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|