|
53 / 28 / 13
Регистрация: 01.03.2013
Сообщений: 330
|
|
IoC container вместо Singletone27.02.2023, 08:47. Показов 5989. Ответов 79
Метки нет (Все метки)
Здравствуйте.
В инете много инфы на эту тему, но она довольно не структурирована и сложно понять нужно ли вообще в это вникать на плюсах. В общем есть приложение на Qt. В данном приложении много объектов-одиночек. Хотелось бы избавиться от них. На первых парах не нашел какого-то встроенного инструмента в Qt. Есть мысли написать свой велосипед, но все же хотелось бы использовать проверенное решение. Из того, что я понял контейнер зависимостей это некий класс, имеющий соответствующие методы - геттеры / сеттеры, полем которого выступает словарь {key, val}, где key это строка идентификатор, val - указатель на созданный объект. Но это какое-то слишком простое представление. Там еще фабрики каким то боком). Рад буду любой ссылке либо на статью с подробным описанием решения моей проблемы, либо проекту на гитхабе (желательно максимально простому, не хотелось бы бездумно использовать какой-нибудь громоздкий инструмент на начальном этапе)
0
|
|
| 27.02.2023, 08:47 | |
|
Ответы с готовыми решениями:
79
Класс Singletone
Белый экран при входе в админку - Class 'FOF30\\Container\\Container' not found |
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||||||
| 28.02.2023, 17:33 | ||||||
|
ТС никаких проблем не озвучивал. А в вашем блестящем исполнении проблема синглетонов звучит так: вот если написать кривой код, тогда жить станет грустно. Казалось бы, а синглетоны то здесь причем, они что, как то мешают писать грамотный код? Нет, не мешают. Тогда в чем проблема? А проблема якобы в том, что вы выдумали контекст, в рамках которого криворукий ТС сам не догадается сделать параметр шаблона там, где это нужно по смыслу, и будет вынужден страдать. Вы вообще понимаете, что такое синглетон? Синглетон Container<Data> невозможно сделать членом данных класса. Вот эта фраза:
0
|
||||||
|
Комп_Оратор)
|
|||
| 28.02.2023, 17:42 | |||
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||
| 28.02.2023, 17:57 | |||||
|
1) или вызывать getInstance в push что не гибко 2) или не использовать синглтон Второй вариант предпочтительнее. Надеюсь теперь понятно.
0
|
|||||
| 28.02.2023, 18:02 | |
|
Не по теме: Спор как обычно перерос в терминологический
0
|
|
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
|||||||||||
| 28.02.2023, 18:58 | |||||||||||
|
Причем, единственное как вы смогли её обозначить, это вот такими словами: Гибкость ради гибкости не нужна. Это не делает синглетон каким то неправильным. Во-первых, вам никто не мешает биндить объект синглетона на указатель, или ссылку. Правда, не очень понятно зачем, но если очень нужно, то можно:
Это вообще какая то наивная позиция: рассуждать о предпочтениях в отрыве от реальной задачи. Если по смыслу задачи нужен именно синглетон, то второй вариант уже не будет предпочтительным. Например, есть некоторая система, в рамках которой может быть создан только и только один контекст устройства. Если ничайно создать второй, то это может нарушить работу всей системы. В таком случае и применяют синглетон. Или вот такой пример: для решения неккой задачи понадобилась глобальная точка доступа. В принципе, можно было бы использовать обычную глобальную переменную. Но у обычных глобальных переменных есть такая проблема - static order initialization fiasco В таком случае так же применяют синглетоны, потому что они по сути так же являются глобальными точками доступа, и при этом позволяют обойти озвученную выше проблему.
0
|
|||||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
| 28.02.2023, 19:06 | ||||||
|
См. первое слово и далее по тексту Он потерялся, надо подсказать, что и как, вот и вся проблема.Думаю беседу можно завершить.
0
|
||||||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
|||||||
| 28.02.2023, 19:24 | |||||||
|
Во-первых, непонятно зачем, но технически ничего не мешает организовать поддержку самых разных типов. Можно не только поддержать std::list, но и например, std::map. А во-вторых, вы называете код, который рассчитан на работу с синглетоном не гибким, только потому что он рассчитан на синглетоны! Это какой то лютый бред уже получается. Вы видимо забыли контекст беседы. У нас изначально уже имеется очередь, которая работает с синглетоном. Это вы, за каким то непонятным фигом хотите от него избавиться. Непонятно зачем. Во-первых, я такого не признавала. Вы вообще адекватный? В какой такой "этой конкретной" ситуации?
0
|
|||||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||
| 28.02.2023, 19:53 | |||
|
eva2326,
Синглтоны называют негибкими, так как их нельзя использовать так же, как обычные классы. Ну вот с той же очередью. Допустим наш Синглтон имеет необходимый интерфейс для работы нашей очереди, но мы не можем его использовать в ней. Нужна спец. очередь, и все остальное. Не об этом ли все ? Добавлено через 5 минут Хотя шапка темы вот вообще не понятна, почему ТС решил избавится от Синглтонов. Ну есть они, значит они для чего то нужны. Зачем от них избавляться ? Теперь чуть ниже : ![]() Добавлено через 1 минуту Похоже автор сражается с ветряными мельницами.
0
|
|||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||
| 28.02.2023, 20:01 | ||
|
Программист специально прилагает усилия, что бы в результате получился класс, который нельзя использовать как обычный класс. Не знаю, что в голове у людей, которые обзывают синглетон негибким за их главную особенность, ради которой они и нужны.
0
|
||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||||
| 28.02.2023, 20:27 | ||||
|
Поэтому мне и непонятно что вы обсуждали с Undisputed. ОЗнакомился с Inversion of Control (инверсия управления) и Dependency Injection (внедрение зависимостей). Но чем это поможет заменить Singltone - непонятно. Так как я понял, объект - одиночка так и остается, на него навешивается некий интерфейс ? И ради чего ? Добавлено через 1 минуту Это просто обычная практика : создание интерфейсов для уменьшения зависимостей. И никакого прямого отношения к Одиночкам она не имеет.
0
|
||||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
|||||
| 28.02.2023, 21:15 | |||||
|
Это действительно так и есть, вот только с синглетонами это никак не связанно. А он этого понять никак не может. Он почему то думает, что в негибкости версии без шаблоно-параметра виноват именно синглетон, а не отсутствие шаблонного параметра. И даже тот факт, что в версиию с синглетоном можно просто добавить недостающий шаблоно-параметр, и тогда решение будет таким же гибким, его не смущает. При этом он считает, что такое использование негибкой версии - это неправильное использование синглетона. Что именно неправильно я так и не поняла.
0
|
|||||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|||||||
| 01.03.2023, 01:21 | |||||||
|
Мне кажется это вполне очевидным. Что-ж. Пожалуйста. Рассмотрим ваш же пример синглтонов для логгинга, судя по неймингу. Пишу я свой прекрасный класс, который что-то делает и пишет в лог, используя синглтон.
Теперь мой код ЗНАЕТ о существовании некоего лога и СВЯЗАН с ним. Это увеличивает СВЯЗАННОСТЬ кода. Тут заодно уменьшается связность кода, но это огрехи всех логгеров. Этот код НЕВОЗМОЖНО использовать отдельно без функционала логгинга. И как бы вы ни старались, другие примеры использования синглтона закончатся примерно так же. Однако, если переделать под IoC и DI получится куда менее связанный код с тем же самым функционалом.
0
|
|||||||
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
|
||||||||||||||||||||||||
| 01.03.2023, 01:21 | ||||||||||||||||||||||||
|
Кликните здесь для просмотра всего текста
В случае ТС DI-контейнер позволит (позволил бы) либо: (Вариант 1) вернуть параметры конструкторов, чтобы иметь возможность передавать mock'и в тестах, например) и при этом создавать объекты в приложении без многочисленной передачи параметров: Кликните здесь для просмотра всего текста
Либо (Вариант 2) не возвращать параметры конструкторов и обращаться к контейнеру переданному в качестве параметра, при этом ни контейнер, ни любой другой класс не реализует паттерн Синглтон, но сам контейнер определяет, какие объекты создаются каждый раз заново, а какие — только один раз. Контейнеры в тестах могут быть настроен по-другому и возвращать mock'и, например: Кликните здесь для просмотра всего текста
Первый вариант предпочтительней, т.к. нет зависимости классов от DI-фреймворка.
2
|
||||||||||||||||||||||||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
||||||||||||||||
| 01.03.2023, 05:07 | ||||||||||||||||
|
Я вам такой код приведу:
Ну и что? В программировании функциональность. Что значит: "невозможно использовать отдельно без функционала логгинга" ? Это вообще как понять? Хотите удалить полностью логгирование, просто сотрите строчку с его использованием. Хотите временно отключить логгирование, тогда позовите что-то вроде:
Я не понимаю, в чем проблема? Изначально вы обмолвились о каких то проблемах: А я просила привести пример проблемы, которая возникла в следствии связанности кода, которая возникла в следствии использования синглетона.
0
|
||||||||||||||||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|||||||||||||||
| 01.03.2023, 10:38 | |||||||||||||||
|
Вы знаете что такое связанность (coupling) и связность (cohesion)? Крайне рекомендую к ознакомлению, чтоб не задавать таких вопросов. В том, что вместе со своим кодом приходится таскать все зависимости, которые могут быть не нужны или не иметь смысла в другом месте. В том, что такой код сложно расширять -- а теперь я хочу логать другим фреймворком в той же кодовой базе но в другом месте. В том, что это скрытый контракт -- поди догадайся через пять лет, что этому классу нужен какой-то синглтон и попробуй удовлетворить эту потребность. В том, что тестируемость такого кода сразу становится ниже -- как вы пишете юнит тесты на классы, которые используют синглтоны? При написании на код юнит-теста? Может я хочу не удалить а заменить? ![]() В двух словах: Singleton
3
|
|||||||||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 01.03.2023, 11:05 | |
|
Я вот читаю ветку и никак не могу понять: откуда вообще берётся противопоставление Singleton и IoC/DI ?
Это же какие-то абсолютно перпендикулярные вещи. Singleton - как гарантированно сделать единственный экземпляр класса. IoC/DI - как развязать классы, например передавая интерфейсы для реализации "внешних" функций (функционала в смысле). При этом "внешний интерфейс" может быть и Singleton, а может и не быть. Тогда почему Singleton и IoC/DI вообще сравниваются / противопоставляются? lemegeton выше привёл пример. Это отлично, это хотя бы позволяет предметно что-то обсуждать, а не кидаться на оппонента. Но в чем проблема именно Singleton в приведённом примере? а если бы это не Singleton, а просто класс, экземпляр которого мы запихали в другой класс - это что, отменит проблему? да ни на грамм. При чем здесь тогда Singleton ?
0
|
|
|
Комп_Оратор)
|
|||
| 01.03.2023, 11:16 | |||
|
eva2326, когда вы (и не только вы) говорите, так как будто от ваших слов дрожит земля и на неё падает небо, хочется куда-то спрятаться. Вот пример игры понятиями в ключе общее-частное:
Теперь о холиваре. Этот зверь может быть рассмотрен минимум в 3-х базовых ипостасях: спорт, наука, искусство. Вот вы говорите: Начнём с конца. Ваш студент не может двигаться со скоростью выше скорости света, так как его возраст не может убывая стать отрицательным. Я не спорю даже с тем, что он изменяется только на целое количество единиц. Лет наверное. Ещё хуже, то что что изучая теорию относительности студент может попасть в дурку. И не факт что вылечится. То есть, он не будет знать своего имени от слова совсем. eva2326, я тоже защитник всего действительного из числа разумного. Я тоже вижу, что неймспейсу с набором данных и функций, не будет хватать операций, и возможности наследовать. Неймспейс нельзя передать параметром в функцию, сокрыть данные и пр. Родителем наш одиночка быть не может ввиду недоступности конструктора. Но это его основная фича. А достоинство без недостатков, это как Пьер без ухОв. Готов вас поддержать в том, что - пусть живёт. Но готов и поспорить на предмет того, что - пусть живут и все остальные. В каком-то смысле мы все одиночки)
0
|
|||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
||||
| 01.03.2023, 12:05 | ||||
|
Проблема с паттерном синглтон может возникнуть только при его использовании. Если нужная сущность передаётся в класс параметром конструктора -- сама реализация паттерна синглтона теряет смысл. Абсолютно несвязанный код писать мы не умеем пока что. Да и есть сомнения, что это вообще возможно и уж совершенно маловероятно, что это имеет смысл. Зато держать количество связей минимально необходимым -- это полезно. Смотрите на аргументы.
0
|
||||
|
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
|
|||||||||||||||||||||||||||||
| 01.03.2023, 12:38 | |||||||||||||||||||||||||||||
|
Именно поэтому я предложила вам проиллюстрировать проблемы. И сейчас вы будете пытаться высосать их из пальца. Если ваш код использует неккий логгер, то вы в любом случае будете таскать с собой зависимости от него. Вот есть автомобиль. Вам приходится таскать вместе с ним его колеса. Что именно вам помешает логать другим фреймворком, в той же кодовой базе, но в другом месте? Просто берите, и логгируйте чем хотите, если вам так хочется. Есть такое понятие: "инкапсуляция". Клиентам в принципе не нужно ничего гадать, и даже думать на эту тему. А разработчикам в принципе нужно знать, что там внутри. Кстати, тема инкапсуляции к синглетонам отношения не имеет. Для классов, которые используют синглетоны, юнит тесты пишутся абсолютно точно так же, как и для любых других классов. И даже очень крупных. И даже очень очень крупных. Вот только на "всё" я так и не наткнулась. За использование конкретной реализации отвечает этот узел:
Можно по аналогии с логгерами предоставить пользователям втыкать любое количество своих собственных синков. Вы можете по аналогии с логгерами, сделать тестовый синк, и тогда можно будет легко замокать работу MyAwesomeImagePostingService. Но... если вы не протестировали работу в окружении тогда... никаких гарантий. Сравните:
Это не обязательно должен быть тип, это вообще может быть какой нибудь enum. Поэтому, можно сделать так, что бы клиентам вообще не нужно было знать ни о каких деталях, даже об интерфейсах. А во втором случае, клиентам придется быть в курсе существования наследников, и знать про их интерфейс. Но вот именно с точки зрения метрик качества кода, разницы вообще нет никакой. Выше вы жаловались: Никуда вы от этого не ушли, и уйти не сможете. Вот только не все зависимости, как вы выразились, а только инфраструктурные (обвяз из интерфейсов). А вот наследников таскать с собой не обязательно. Я пока что не увидела от вас никаких проблем связанных с тем, что синглетоны увеличивают связанность кода. Добавлено через 8 минут Есть такая самая обычная практика: где-то в main, где настраивается окружение, синглетону в конструкторе передают различные настройки. А уже в дальнейшем, другие части программы просто использут синглетон как обычно. И с чего это синглетон вдруг потерял смысл только потому, что ему там что-то передали в конструкторе ???
0
|
|||||||||||||||||||||||||||||
|
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
|
|||||||||||||
| 01.03.2023, 12:52 | |||||||||||||
|
Даже контракт у класса на методе появился. Лишняя зависимость от класса Singleton только осталась. Но может быть так и задумывалось. Если передать сущность через конструктор -- можно и от неё избавиться. Чтоб было сотни приложений, в которых библиотеки использовали библиотеки, которые используют библиотеки, использующие библиотеки в библиотеках библиотек. И всё это с TDD на ста окружениях и с интеграцией с тяжелыми внешними системами. И всё это компанией из сотен постоянно меняющихся разработчиков по всему миру на протяжении 10-15 лет. Вы ИЗМЕНИЛИ мой код, и теперь говорите что это одно и то же. ))) Как мы это называем? Именно. Dependency Injection. Интерфейс в этом случае используют лишь для одного -- фиксирование явного контракта. Можно сделать шаблонным параметром и описать в документации, чего он там должен уметь. А можно болт положить на документирование и пущай пиры гадают.
0
|
|||||||||||||
| 01.03.2023, 12:52 | |
|
Singletone для Class library Паттерн singletone и unit of work IoC контейнер
DI/IoC из коробки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|