Skip to content

Commit c94806e

Browse files
authored
Теория
1 parent 8c284d3 commit c94806e

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

theory/Theory_article.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
С точки зрения теории в интернетах гуляет очень много материала. Но есть источники, которые заслуживают отдельного упоминания, и которые мы рекомендуем прежде всего.
2+
3+
Первое, это серия статей от Five: <br>
4+
[Android Architecture: Part 1 - every new beginning is hard](http://five.agency/android-architecture-part-1-every-new-beginning-is-hard/) <br>
5+
[Android Architecture: Part 2 - the clean architecture](http://five.agency/android-architecture-part-2-clean-architecture/)<br>
6+
[Android Architecture: Part 3 - Applying clean architecture on Android](http://five.agency/android-architecture-part-3-applying-clean-architecture-android/)<br>
7+
[Android Architecture: Part 4 - Applying Clean Architecture on Android, Hands on (source code included)](http://five.agency/android-architecture-part-4-applying-clean-architecture-on-android-hands-on/)<br>
8+
[Android Architecture: Part 5 - How to Test Clean Architecture](http://five.agency/android-architecture-part-5-how-to-test-clean-architecture/)<br>
9+
10+
Очень грамотное теоретическое описание трансформации классической Clean Architecture от дядюшки Боба в Clean Architecture для Android.
11+
Единственное, вторая статья как-то немного запутала с этими input/output портами для UseCase и решением проблемы флоу данных через наследование и композицию. Немного оторвано от практики, как нам показалось. Лучше сразу к третьей части приступить, если вы также не совсем поняли.<br>
12+
Еще есть моменты, над которыми можно похоливарить.
13+
14+
Второе, это [видео 2016 года](https://www.youtube.com/watch?v=AlxMGxs2QnM&t=2509s&list=PLb1A91j1236pH1yoUvq5YDZUWAJz1T4DF&index=4) и [2017 года](https://www.youtube.com/watch?v=pmlGgIOlz9w&t=15114s) о Чистой архитектуре от Евгения Мацюка и Александра Блинова.
15+
Однако, с течением времени некоторые вещи, упомянутые в видео, уточняются и переосмысливаются. И в этом нужно сказать спасибо всем участникам архитектурного чатика. Поэтому мы настоятельно советуем пересмотреть доклады и прочитать дополнения.<br>
16+
17+
Итак дополнения:
18+
19+
1. Проектировать фичу лучше начинать сверху вниз, а не наоборот, так как вы прежде всего отталкиваетесь от того, что видит конечный пользователь.
20+
21+
2. Общая структура. По канонам интерфейсы Репозитория относятся к бизнес-логике, а конкретные имплементации - к data. Мы для упрощения решили интерфейсы и имплементации Репозиториев вынести в отдельный слой (про это в 2017 рассказываем). <br>
22+
Кроме того и структура пакетов меняется соответствующим образом. Плюс еще немного поменялось представление о том, где же должны быть модели данных.<br>
23+
Модели данных обычно представляют собой простые DTO, то есть только данные без какой-либо логики. Для упрощения все подобные модели лучше размещать в специальном пакете под названием "models" (можно подобрать более удачное название, чтобы не так созвучно было с понятием "model").<br>
24+
25+
Структура пакетов:
26+
27+
-di<br>
28+
---app<br>
29+
---payments<br>
30+
---operation<br>
31+
-presentation<br>
32+
---view<br>
33+
-----payments<br>
34+
-------PaymentsView<br>
35+
-------PaymentsFragment<br>
36+
-----operations<br>
37+
-------OperationsView<br>
38+
-------OperationsFragment<br>
39+
---presenter<br>
40+
-----payments<br>
41+
-------PaymantsPresenter<br>
42+
-----operations<br>
43+
-------OperationsPresenter<br>
44+
-domain (он же business)<br>
45+
---payments<br>
46+
-----PaymentsInteractor<br>
47+
-----PaymentsInteractorImpl<br>
48+
-----CurrencyHandler (вспомогательный класс для PaymentsInteractor)<br>
49+
---operations<br>
50+
-----OperationsInteractor<br>
51+
-------rubs<br>
52+
---------OperationsInteractorRubs<br>
53+
---------RubsManager (вспомогательный класс для OperationsInteractorRubs)<br>
54+
-------currency<br>
55+
---------OperationsInteractorCurr<br>
56+
---------CurrencyManager (вспомогательный класс для OperationsInteractorCurr)<br>
57+
-repositories<br>
58+
---payments<br>
59+
-----PaymentsRepository<br>
60+
-----PaymentsRepositoryImpl<br>
61+
---operations<br>
62+
-----OperationsRepository<br>
63+
-----OperationsRepositoryImpl<br>
64+
-data<br>
65+
---network<br>
66+
---db<br>
67+
-models (по сути хранилище всех dto)<br>
68+
---payments<br>
69+
-----PaymentsModel<br>
70+
---operations<br>
71+
-----presentation<br>
72+
-------OperationUIModel<br>
73+
-----domain<br>
74+
-------OperationsRubModel<br>
75+
-------OperationCurrModel<br>
76+
-----data<br>
77+
-------OperationsRubNetworkModel<br>
78+
-------OperationCurrNetworkModel<br>
79+
80+
3. Есть несколько вариантов трактования понятия "Репозиторий". Подробно можно почитать, например, [здесь](http://hannesdorfmann.com/android/evolution-of-the-repository-pattern). В Андроид-мире "Репозиторий" - это абстракция для получения данных, то есть она скрывает, с какого именно источника получены те или иные данные. <br>
81+
Кроме того Репозиторий может внутри себя реализовывать логику кеширования данных и соответственно выдачи либо закешированных данных, либо данных с сети.
82+
83+
4. Дядюшка Боб говорит, что *Interactor*- это объект, реализующий *Use Case*. Более того, предлагается создавать их с помощью паттерна [Команда](https://refactoring.guru/ru/design-patterns/command). У нас же сложилась тенденция объединять различные пользовательские сценарии, связанные с одним функционалом, в отдельные классы - Use case feature facade. Вдобавок, многие использует в своих проектах RxJava, и мы получаем довольно лаконичный способ описания основного функционала. Были некоторые споры о том, должны ли такие классы называться в стиле "FeatureInteractor", или "FeatureInteractors" (во множественном числе), но больше прижился первый способ наименования.
84+
85+
5. Domain ничего не знает о других слоях. По классике к domain относятся Интеракторы и интерфейсы Репозиториев. Поэтому Интерактор не может являться маппером моделей. Мапперами моделей будут выступать Репозитории (из моделей data в модели domain и наоборот) и Презентеры (из моделей domain в модели View и наоборот).<br>
86+
Когда мы проектируем фичу и разрабатываем ее по слоям, то в отношении моделей нужно исходить все-таки из принципа минимализма. Если вы знаете, что для в рамках вашей фичи вам достаточно будет просто сходить в сеть и полученный результат отобразить на экране и ничего более, и такое поведение врят-ли когда-нибудь изменится, то на все слои вашей фичи лучше держать одну модель.<br>
87+
Чаще бывает, когда полученный результат с сервера нам нужно немного подкорректировать, и уже можно отображать на экране. Тогда на фичу будет две модели (data и domain). <br>
88+
Ну и бывает, что по сути на каждый слой необходима своя модель (presentation, domain, data).
89+
90+
6. Activity, Service, BroadcastReceivers - это точки входа в приложение, это служебные классы. Поэтому относить их к какому-либо конкретному слою в Архитектуре не верно. В тот же Service вы при необходимости можете и Интерактор инжектить, и Репозиторий.
91+
92+
7. В [видео 2016 года](https://www.youtube.com/watch?v=AlxMGxs2QnM&t=2509s&list=PLb1A91j1236pH1yoUvq5YDZUWAJz1T4DF&index=4) для Интерфейса Вьюшки много методов (setName, setAccountNumber, setCardNumber, setNearestDepartments). На самом деле все эти методы можно заменить на один типа setData, и в аргументы передавать какую-то специальную модельку.
93+
94+
9. Взаимодействие между вьюшкой и презентером и решение вопроса с ЖЦ лучше деоегировать какой-то специальной библиотеке. Например, Moxy. Тогда вы избавитесь от большой части довольно нудной работы - обработка ЖЦ.
95+
96+
Кроме того про распространенные заблуждения с отсылом в первоисточники хорошо описано в [статье Василия](https://habrahabr.ru/company/mobileup/blog/335382/).
97+
98+
Вот кратко и вся теория, которую мы рекомендуем изучить в первую очередь. Остальные материалы на базе приобретенных вами знаний станут более понятными и логичными. У вас составится определенная картина, определенная база, от которой уже можно отталкиваться.
99+
100+

0 commit comments

Comments
 (0)