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

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

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

38 ответов

18 просмотров

А почему неправильно? Ты инжектишь в реп дао (который интерфейс) и сервис ретрофита (тоже интерфейс). Во 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
Мокито давно уже умеет мокать финальные классы, до...

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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта