SOLID и RxJava архитектура приложения

118
19 января 2021, 16:40

Предположим что разрабатывается приложение. Выбран паттерн MVP. И необходимо придерживаться SOLID принципов.

Например, создали класс репозиторий, методы репозитория обвернуты в observable от rxJava. Используем этот репозиторий в презентере. Как в этом случае работает dependency inversion principle? Получается, необходимо для репозитория сделать интерфейс, с описанием методов которые возвращают observable? - вроде, где-то читал что вообще по правильному не должны зависит от каких то сторонних фреймворков, а где-то читал что нужно считать rx как стандартную библиотеку и не париться по этому поводу.

Насколько это правильно? Можете привести какой нибудь пример с реального проекта с rx?

Answer 1

Да, все верно нужно создать интерфейс репозитория. Инжектим этот интерфейс в презентер. Тогда наш презентер не будет зависеть от реализации репозитория, а будет зависеть от абстракции. Это помогает в тех случаях, когда нам нужно поменять класс репозитория на другой класс совсем с другой логикой. Например, сначала у нас был репозиторий с тестовыми данными, потом бекенд закончил делать апи и мы подменили репозиторий на реальный, так как интерфейс репозитория остался такой же, то код презентера мы не меняем.

Наверное, вы читали в статьях о clean architecture, что проект не должен зависеть от каких-то фреймфорков. Это правда и RxJava во всех слоях приложения это нарушение этого принципа. Но правда и то, что в андроиде сейчас RxJava это стандарт (как Stream API в java) поэтому она есть во всем проекте.

Примеров в интернете очень много, один из фундаментальных это вот этот. Там как раз то, что я описал выше есть. На хабре есть статья по этому репозиторию, чтобы лечге понимать, что происходит в коде.

Еще есть такая статья для большего понимания

READ ALSO
Timeout async/await

Timeout async/await

Я промисифицирую функцию function example() {

120
Qt5: Запрос представления в QTableView

Qt5: Запрос представления в QTableView

Есть некоторые представленияНужно вывести их в QTableView, а так же запрос всех представления существующих в БД, результат это

106
c++: неопределённый тип при наследовании

c++: неопределённый тип при наследовании

Подскажите, как разрешить следующую ситуацию - у меня есть базовый контейнер от которого наследуется 2 различных:

105