214 похожих чатов

Может кто-нибудь пояснить как именно реализуется принцип DIP на примере

приложения?Есть класс ViewModel и класс Repo(в который инжектится база данных и ретрофит).Repo в свою очередь инжектится в ViewModel. И Уже напрямую во ViewModel вызываются методы класса Repo,но это неправильно с точки зрения DIP,насколько я понимаю, так как это проектирование на уровне реализаций ,а не интерфейсов. Как сделать на уровне интерфейсов?

38 ответов

21 просмотр

А почему неправильно? Ты инжектишь в реп дао (который интерфейс) и сервис ретрофита (тоже интерфейс). Во ViewModel ты инжектишь интерфейс репозитория, а какую именно его реализацию так это пусть di или сервис локатор решает

Anatoliy-Kernokus Автор вопроса
Roman Chumachenko
А почему неправильно? Ты инжектишь в реп дао (кото...

а у меня класс Repo не интерфейс ,а обычный класс

Anatoliy Kernokus
а у меня класс Repo не интерфейс ,а обычный класс

Так да, вынеси сигнатуры основные для твоей репы в интерфейс и пусть твой, а класс будет его реализовать. Соль в том, чтобы все остальные классы использовали не реализацию, а интерфейс

Мартина читать начали?

Anatoliy Kernokus
да

на какой сейчас главе?

Anatoliy Kernokus
4

ваш вопрос разбирается на 5 главе (тольлько нужно не просто прочесть, а понять)

Anatoliy Kernokus
4

переделал схему Мартина, чтобы вам понятней было

Jorik Fat
переделал схему Мартина, чтобы вам понятней было

Наследовать модели репозитория(респонсы там всякие) от entity?

Jorik Fat
А почему нет?

Структура данных может отличаться

Денис
Структура данных может отличаться

Ну как-то же она будет похожа. Она не будет прям вообще иной

Jorik Fat
Ну как-то же она будет похожа. Она не будет прям в...

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

Денис
В плане модели респонса к примеру могут не соответ...

Это полная модель, для идеальных условий. Так то и интерфейс Presentatio мало кто пишет

Денис
В плане модели респонса к примеру могут не соответ...

Контекст такой: человек уже делает по клину, но не понимает как сделать/улучшить до каноничного клина

Roman Chumachenko
Так да, вынеси сигнатуры основные для твоей репы в...

А мне вот лом интерфейс выделят для репозитория. Всегда делаю обычный класс. И вот такой вопрос не могу понять. Репозиторий - это абстракция для всего приложения/модуля? Или репозиторий - это абстракция для отдельной фитчи/интерактора/юзКеса?

sankarshana
А мне вот лом интерфейс выделят для репозитория. В...

Репозиторий это абстракция для конкретной сущности, а-ля UserRepository

Nick
Репозиторий это абстракция для конкретной сущности...

Да! В этом и вопрос! Если у меня есть интерес UserRepository, и есть UserRepositoryImpl, который имплементирует единственный интерфейс UserRepository. Ведь я могу не делать интерфейс? В чём его польза а данном случае? Чем это может обернуться в будущем, если нужно будет что то менять?

sankarshana
Да! В этом и вопрос! Если у меня есть интерес User...

Если пишешь на котлине, то замокать в тестах не сможешь обычным способом

sankarshana
Да! В этом и вопрос! Если у меня есть интерес User...

Сложно тестировать, невозможно разделить слои приложения и вынести их в отдельные модули в случае потребности, нарушение SOLID

sankarshana
Да! В этом и вопрос! Если у меня есть интерес User...

Это уже будет не clean architecture, так как domain слой будет знать про data слой

Habanero Red
Это уже будет не clean architecture, так как domai...

Да, теорию я знаю. Но в чём проблема на практике?

sankarshana
Да! В этом и вопрос! Если у меня есть интерес User...

Ничем. Если одна имплементация и не нужны моки то интерфейс не нужен

Ilya Nikolaev
Ничем. Если одна имплементация и не нужны моки то ...

Предерживаюсь такого мнения. Хочу понять, на сколько это плохо?

Ilya Nikolaev
Можно использовать mockk фреймворк

И powermock. И ещё пачку всякого, что для тестов легаси. А можно просто писать по клину

sankarshana
А какой именно аспект solid нарушается?

Принцип инверсии зависимостей

sankarshana
Да! В этом и вопрос! Если у меня есть интерес User...

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

M
Я обычно использую их для разделения приложения на...

А если класс одного модуля ссылается на конкретный класс другого? В чём проблема?

sankarshana
А если класс одного модуля ссылается на конкретный...

DI principle как раз гласит, что не нужно делать зависимости на что-то конкретное

sankarshana
А если класс одного модуля ссылается на конкретный...

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

Roman Chumachenko
Если пишешь на котлине, то замокать в тестах не см...

Мокито давно уже умеет мокать финальные классы, достаточно прописать небольшой конфиг в тестовом res. А так согласен что для репозитория нужен интерфейс если фичи разбиты по модулям. А вот с интерактором у нас все проще это в 90% просто класс с бизнес логикой.

Yakov Weber
Мокито давно уже умеет мокать финальные классы, до...

Прикольно, надо будет почитать на счет мокито тогда. Окей, тогда этот аргумент не самый удачный

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта