Size: a a a

Android Architecture

2017 February 08

М

Михаил in Android Architecture
Проект с 2010 года расчехлили
источник

AZ

Alexandr Zherebtsov in Android Architecture
Eugene Matsyuk
Наконец-то подоспел ответ =)

 1. Бизнес-логика и модели данных. Знаете, я соглашусь с тем, что Бизнес-логика не должна ничего знать о моделях данных Даты-уровня и UI-уровня. Эти знания ей ни к чему. Плюс да, во всех источниках бизнес-логика представляется максимально изолированной от всех слоев. А тут я ее наоборот загружаю лишними данными и серьезно завязываю на конкретные модели. Поэтому Репозиторий должен предоставлять Интерактору уже готовые бизнес-модели, а Интерактор выдает ui уже обновленные, но тоже свои бизнес-модели, UI при необходимости мапит их.
 2. Место Репозитория. Я бы не стал относить Репозиторий чисто к бизнес-логике. Но это это и не Дата-уровень. По мне, Репозиторий - это надстройка над Датой, с которой непосредственно взаимодействует бизнес-логика. Именно Репозиторий решает, откуда брать данные и как.
 3. Обязанности Репозитория + вопросы кеширования. С осознанием того, что Бизнес-логика ничего не знает о моделях Даты, и что она получает уже готовые бизнес-модели от Репозитория, роль Репозитория несколько меняется. Теперь это не просто проводник запросов в сеть или БД. Теперь Репозиторий отвечает за маппинг данных, выбор источников данных, а также за кеширование. Интерактору выдается просто готовые модели. Раньше у меня Интерактор знал о моделях Даты и мог сам принимать решения, как кешировать. Но это не верно и не очень красиво.
Есть возражения, что если осуществлять еще и кеширование, то как-то много всего будет в Репозитории. Ну тут остается только посоветовать - делегируйте во вспомогательные классы. У Фернандо показан хороший пример делегирования через Фабрику и DataStore (в статье http://hannesdorfmann.com/android/evolution-of-the-repository-pattern, раздел Evolution of the Repository Pattern term). Там фабрика решает, какой DataStore задействовать для конкретного id.
Если для принятия решения о кешировании нужна информация с другого Репозитория, то пускай Интерактор передаст через аргумент метода нужную инфу в Репозиторий. Вообщем тут Интерактор отвечает за взаимодействием и необходимый обмен информацией между Репозиториями. Например у одного репозитория запросил, какой режим сейчас (пользовательский или демо), а в другой репозиторий передал эти данные для получения корректного списка операций.
modeRepository.getMode()
   .flatMap(mode -> operationsRepository.getOperations(mode))
 4. Исходя из вышесказанного Репозиторий должен тестироваться.
 5. Если вам нужно сделать приложение быстро, можно, конечно, не заморачиваться с маппингом, а передавать модель, полученную с запроса. Но если приложение чуть более серьезное и долгое, то лучше маппить. Так как по своему опыту, по Дате-уровне или по логике получения данных всегда что-то может поменяться. Бизнес-логика про это вообще не должна знать.
 6. Про проектирование. У меня в докладе показано проектирование снизу вверх. Но почитав источники Александра соглашусь, что проектирование сверху-вниз намного более привлекательней, да и позволяет быстро получить результат.


Один бы я не дошел до этого. Вот что значит коллективный разум! Еще раз спасибо Александру за отличный вопрос и очень развернутое свое мнение. Заставил меня несколько переосмыслить некоторые вещи.
супер! 👍теперь буду изучать ваш ответ))
источник

EM

Eugene Matsyuk in Android Architecture
Alexandr Zherebtsov
супер! 👍теперь буду изучать ваш ответ))
Жду)
источник

ZZ

Zahar Zolotarev in Android Architecture
Михаил
Такой вопрос. Есть проект, как в сказках про 3к строк кода в простой активити. Нужен рефактор и разделение на слои. Вопрос: с чего начать переезд?
Я бы начал так:
1) удаление дублирования кода
2) дробить на отдельные методы в рамках активити логику
3) выносить в презентер логику
источник

М

Михаил in Android Architecture
С дублированием кода вроде проблем нету, проблема именно в том, что активити это god objectы
источник

М

Михаил in Android Architecture
Ну и проект в принципе помойка
источник

AI

Alexey Illarionov in Android Architecture
тогда сначала заменить неверные абстракции дублированием
источник

DC

Denis Chuvasov in Android Architecture
Eugene Matsyuk
Наконец-то подоспел ответ =)

 1. Бизнес-логика и модели данных. Знаете, я соглашусь с тем, что Бизнес-логика не должна ничего знать о моделях данных Даты-уровня и UI-уровня. Эти знания ей ни к чему. Плюс да, во всех источниках бизнес-логика представляется максимально изолированной от всех слоев. А тут я ее наоборот загружаю лишними данными и серьезно завязываю на конкретные модели. Поэтому Репозиторий должен предоставлять Интерактору уже готовые бизнес-модели, а Интерактор выдает ui уже обновленные, но тоже свои бизнес-модели, UI при необходимости мапит их.
 2. Место Репозитория. Я бы не стал относить Репозиторий чисто к бизнес-логике. Но это это и не Дата-уровень. По мне, Репозиторий - это надстройка над Датой, с которой непосредственно взаимодействует бизнес-логика. Именно Репозиторий решает, откуда брать данные и как.
 3. Обязанности Репозитория + вопросы кеширования. С осознанием того, что Бизнес-логика ничего не знает о моделях Даты, и что она получает уже готовые бизнес-модели от Репозитория, роль Репозитория несколько меняется. Теперь это не просто проводник запросов в сеть или БД. Теперь Репозиторий отвечает за маппинг данных, выбор источников данных, а также за кеширование. Интерактору выдается просто готовые модели. Раньше у меня Интерактор знал о моделях Даты и мог сам принимать решения, как кешировать. Но это не верно и не очень красиво.
Есть возражения, что если осуществлять еще и кеширование, то как-то много всего будет в Репозитории. Ну тут остается только посоветовать - делегируйте во вспомогательные классы. У Фернандо показан хороший пример делегирования через Фабрику и DataStore (в статье http://hannesdorfmann.com/android/evolution-of-the-repository-pattern, раздел Evolution of the Repository Pattern term). Там фабрика решает, какой DataStore задействовать для конкретного id.
Если для принятия решения о кешировании нужна информация с другого Репозитория, то пускай Интерактор передаст через аргумент метода нужную инфу в Репозиторий. Вообщем тут Интерактор отвечает за взаимодействием и необходимый обмен информацией между Репозиториями. Например у одного репозитория запросил, какой режим сейчас (пользовательский или демо), а в другой репозиторий передал эти данные для получения корректного списка операций.
modeRepository.getMode()
   .flatMap(mode -> operationsRepository.getOperations(mode))
 4. Исходя из вышесказанного Репозиторий должен тестироваться.
 5. Если вам нужно сделать приложение быстро, можно, конечно, не заморачиваться с маппингом, а передавать модель, полученную с запроса. Но если приложение чуть более серьезное и долгое, то лучше маппить. Так как по своему опыту, по Дате-уровне или по логике получения данных всегда что-то может поменяться. Бизнес-логика про это вообще не должна знать.
 6. Про проектирование. У меня в докладе показано проектирование снизу вверх. Но почитав источники Александра соглашусь, что проектирование сверху-вниз намного более привлекательней, да и позволяет быстро получить результат.


Один бы я не дошел до этого. Вот что значит коллективный разум! Еще раз спасибо Александру за отличный вопрос и очень развернутое свое мнение. Заставил меня несколько переосмыслить некоторые вещи.
Интерфейс репозитория это домен, а конкретная реализация это дата уровень. Это не я такой умный)) это я в книжке "Внедрение зависимостей в .NET" Симона прочитал.
источник

DC

Denis Chuvasov in Android Architecture
Это я ко второму пункту,  не знаю как в телеграме цитировать конкретный текст, цитирует все сообщение в PC-версии
источник

B

Beka in Android Architecture
Denis Chuvasov
Интерфейс репозитория это домен, а конкретная реализация это дата уровень. Это не я такой умный)) это я в книжке "Внедрение зависимостей в .NET" Симона прочитал.
Да так и есть.
источник

B

Beka in Android Architecture
Интерфейс это домен
источник

EM

Eugene Matsyuk in Android Architecture
Denis Chuvasov
Интерфейс репозитория это домен, а конкретная реализация это дата уровень. Это не я такой умный)) это я в книжке "Внедрение зависимостей в .NET" Симона прочитал.
По разбиению по пакетам можно ещё подумать. Саша писал, что интерфейсы и реализации должны быть в разных местах. Но на сколько это вообще целесообразно в андроиде?
Когда интерфейс и реализации рядом лежат, это даже визуальнее удобнее, как мне кажется
@mansonheart
источник

B

Beka in Android Architecture
До есть баундари.
источник

B

Beka in Android Architecture
А как реализуется И так далее это уде дата слой
источник

DC

Denis Chuvasov in Android Architecture
Просто у меня ща "архитектура головного мозга" и я выеживаюсь))) Думаю с опытом это пройдет)))
источник

B

Beka in Android Architecture
Eugene Matsyuk
По разбиению по пакетам можно ещё подумать. Саша писал, что интерфейсы и реализации должны быть в разных местах. Но на сколько это вообще целесообразно в андроиде?
Когда интерфейс и реализации рядом лежат, это даже визуальнее удобнее, как мне кажется
@mansonheart
В Андроиде... В целом я думаю клиан архитектура это чуток перебор))) Трудно. Много классов) Боль)) Я думаю лучше реализовать такие слои как в Спринге сейчас)
источник

B

Beka in Android Architecture
Все было бы намного легче)
источник

EM

Eugene Matsyuk in Android Architecture
@senneco @xanderblinov кстати что думаете тоже?)
источник

AZ

Alexandr Zherebtsov in Android Architecture
Eugene Matsyuk
По разбиению по пакетам можно ещё подумать. Саша писал, что интерфейсы и реализации должны быть в разных местах. Но на сколько это вообще целесообразно в андроиде?
Когда интерфейс и реализации рядом лежат, это даже визуальнее удобнее, как мне кажется
@mansonheart
вначале я себе искуственно ограничил возможность затащить что то из андроида в бизнес-логику, поэтому единственный возможный путь кторый был, это разделить интерфейс и реализацию по разным пакетам, я не могу положить интерфейс от репозитория в дату, так как java модуль не может зависеть от android модуля технически,  и не могу положить репозиторий в бизнес-логику тоже по техническим причинам, единственный вариант это инверсия зависимостей и разделить интерфейс и реализацию, т.е. само все разрулилось, потом понял, что мне так удобно
источник

EM

Eugene Matsyuk in Android Architecture
Beka
В Андроиде... В целом я думаю клиан архитектура это чуток перебор))) Трудно. Много классов) Боль)) Я думаю лучше реализовать такие слои как в Спринге сейчас)
А как в Спринге кстати? Я с ним никогда не работал)
источник