Size: a a a

Android Architecture

2020 October 07

AA

Andrey Akimov in Android Architecture
Pavel
Репозитории - максимально тонкие обертки над данными.
Презентер управляет view.
Всё, что между - бизнес-логика.
Бизнес-логика объединяет разные репозитории. Берет данные из одних, кладёт в другие.
Банальный пример - отправить запрос дёрнув метод репозитория. Потом, оказывается, надо ещё настройку сохранить. Где сохранять? Репозиторий не должен знать о настройках. Презентер тоже, т.к. его задача - управлять view. Остаётся интерактор.
Чут по-моему звучит немного наоборот. Разве решение куда сохранять данные - это дело интерактора? Это ведь не бизнес логика. Имхо это лучше делать как раз в репозитории
источник

RK

Ruslan Kim in Android Architecture
Alex Vayts
Если по канону про модели данных, то так:
1. в домене должны быть модели данныых, которые отдают репозитории
2. в дата слое должны быть свои DTO для сервера и для базы данных (желательно разные) и конвертер из них в модели данных домена.
3. в презентейшене можно смело использовать доменные модели

Про UseCases - это про бизнес-логику: если у вас вся логика приложения - это скачай и отобрази - то класс пустой-прокси. А если логика “для юзера с правами доступа покажи много данных, для юзера без прав - подбери мало” - то вот это вот и надо делать в домене, хотя иногда можно и в презентере - не канонично, зато просто)

Интерактор и entity - сложный вопрос. Иногда разные интеракаторы имеют между собой одинаковый кусочек логики. Вот этот повторяющийся кусочек можно выделить в entity и переиспользовать между разными интеркаторами
репо может отдавать entity или это должно быть что то отдельное?
источник

АЕ

Алексей Ершов... in Android Architecture
вроде изначально между ними закладывалось различие, что entity - это логика предметной области, а interactor - логика работы вашего приложения. Например, реализация какой-нибудь векторной алгебры, или правил конвертации валюты - это entity, они не зависят от того, в каком приложении используются. А interactor определяют, что вы с этими entity делаете для достижения цели пользователя, как реализуете сценарии взаимодействия с ним.
Мобильные приложения в большинстве своём действительно достаточно просты, и декомпозировать на такое количество слоёв часто бывает нечего. Бизнес-логику и даже application-логику часто держат на бэкенде, поэтому вопрос “а что положить в интерактор” весьма справедлив.
Clean не навязывает количество слоёв, лучше постараться уловить идею, чем делать пахлаву.
источник

RK

Ruslan Kim in Android Architecture
Andrey Akimov
Чут по-моему звучит немного наоборот. Разве решение куда сохранять данные - это дело интерактора? Это ведь не бизнес логика. Имхо это лучше делать как раз в репозитории
наверное имеется в виду что-то вроде сайд-эффекта, помимо сохранения самих данные нужно сохранить еще что-то
источник

P

Pavel in Android Architecture
Andrey Akimov
Чут по-моему звучит немного наоборот. Разве решение куда сохранять данные - это дело интерактора? Это ведь не бизнес логика. Имхо это лучше делать как раз в репозитории
Нет. Потому что репозиторий - тонкая абстракция над данными.
Одни и те же данные могут по-разному использоваться в разных фичах. Где-то нужно прикапывать результат запроса, где-то нет. Если логику прикапывания внести в репозиторий, то его потом будет больно переиспользовать.
источник

AA

Andrey Akimov in Android Architecture
Pavel
Нет. Потому что репозиторий - тонкая абстракция над данными.
Одни и те же данные могут по-разному использоваться в разных фичах. Где-то нужно прикапывать результат запроса, где-то нет. Если логику прикапывания внести в репозиторий, то его потом будет больно переиспользовать.
ну, звучит логично. Но на куче примеров видел обратную историю. Ох уж этот клин - у каждого он свой)
источник

RK

Ruslan Kim in Android Architecture
Pavel
Нет. Потому что репозиторий - тонкая абстракция над данными.
Одни и те же данные могут по-разному использоваться в разных фичах. Где-то нужно прикапывать результат запроса, где-то нет. Если логику прикапывания внести в репозиторий, то его потом будет больно переиспользовать.
тогда и откуда брать данные - из кэша или из реста - надо решать на уровне интерактора получается
источник

P

Pavel in Android Architecture
Насчет кэша - вопрос спорный. Если кэш возвращает данные точно в том виде, в котором они возвращаются с бэка (или сконверченная модель), то можно этот кэш и в репозитории сделать. И я часто встречал такое.
Но по-хорошему, это действительно скорее бизнес- логика.
источник

E

Eugene in Android Architecture
Pavel
Нет. Потому что репозиторий - тонкая абстракция над данными.
Одни и те же данные могут по-разному использоваться в разных фичах. Где-то нужно прикапывать результат запроса, где-то нет. Если логику прикапывания внести в репозиторий, то его потом будет больно переиспользовать.
ну тонкие это datasource, а репозиторий фичи берет разные datasource и что-то делает, тк это не бизнеслогика
источник

AA

Andrey Akimov in Android Architecture
Eugene
ну тонкие это datasource, а репозиторий фичи берет разные datasource и что-то делает, тк это не бизнеслогика
вот именно такое часто встречаю. Что репозиторий - набор Dao/Datasource, который и разруливает что откуда брать и куда класть. Не похоже это на бизнес-логику просто
источник

E

Eugene in Android Architecture
я стараюсь datasource максимально абстрагировать от библиотек, чтобы наружу не торчали аннотации, но моделек получается больше)
источник

RK

Ruslan Kim in Android Architecture
похоже не на бизнес-логику, а на логику приложения, место которой в domain, если я правильно понял
источник

RK

Ruslan Kim in Android Architecture
сложная штука эта ваша архитектура
источник

E

Eugene in Android Architecture
я не думаю что будет единогласное мнение по поводу , кто-то так делает, кто-то по другому, придешь в другую компанию а у них будет по третьему
источник

A

ABI in Android Architecture
коллеги, может кто поделится видео с последнего мебиуса, там был доклад про Флиппер... оч. хочется посмотреть?
источник

P

Pavel in Android Architecture
Не будем забывать, что clean - это прежде всего, простота разработки и поддержки кода.
Если возникает необходимость полдня чесать репу и думать что куда поместить - то нафиг тогда этот clean?
По опыту репозиторий лучше воспринимать как тонкую обертку (=data source).
Объясню почему.
Вот вы, джедай клина, пишите репозиторий, который объединяет 2 дата-сорса (net и db). Ok, всё круто.
Потом приходит другой разраб. Ага, надо перед запросом прочитать настройку. Чешет репу, куда поместить дата сорс настроек. Аха, настройка связана с данным запросом, значит в репозиторий. Потом другой разраб хочет ещё один запрос сделать. Чешет репу, добавляет в тот же репозиторий. Третий разраб хочет ещё писать настройки ..

В итоге в репозитории получаются инжнкекты левых дата-сорсов, других репозиториев и другой хрени.
А потом... Этот репозиторий понадобилось переиспользовать, но без настроек. Что делает 4-й разраб? Правильно, добавляет флажки в параметры методов. Или того хуже, добавляет state в репозиторий.

Так что лучше всё-таки дать установку, что репозиторий - тонкая обертка. Чтобы не чесать репу что в него пихать.
источник

AU

Andrey Ubububu in Android Architecture
Pavel
Не будем забывать, что clean - это прежде всего, простота разработки и поддержки кода.
Если возникает необходимость полдня чесать репу и думать что куда поместить - то нафиг тогда этот clean?
По опыту репозиторий лучше воспринимать как тонкую обертку (=data source).
Объясню почему.
Вот вы, джедай клина, пишите репозиторий, который объединяет 2 дата-сорса (net и db). Ok, всё круто.
Потом приходит другой разраб. Ага, надо перед запросом прочитать настройку. Чешет репу, куда поместить дата сорс настроек. Аха, настройка связана с данным запросом, значит в репозиторий. Потом другой разраб хочет ещё один запрос сделать. Чешет репу, добавляет в тот же репозиторий. Третий разраб хочет ещё писать настройки ..

В итоге в репозитории получаются инжнкекты левых дата-сорсов, других репозиториев и другой хрени.
А потом... Этот репозиторий понадобилось переиспользовать, но без настроек. Что делает 4-й разраб? Правильно, добавляет флажки в параметры методов. Или того хуже, добавляет state в репозиторий.

Так что лучше всё-таки дать установку, что репозиторий - тонкая обертка. Чтобы не чесать репу что в него пихать.
То есть если сначала писать по клину, потом дорабатывать не по клину, то всё посыпется. Поэтому мы делаем вывод, что лучше сразу писать не по клину?
источник

P

Pavel in Android Architecture
По клину, но с четкими установками и контролем :)
источник

AU

Andrey Ubububu in Android Architecture
тогда и в первом случае ничего страшного не произойдёт
источник

AU

Andrey Ubububu in Android Architecture
просто будет больше абстракций, хоть и результат будет один
источник