You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: practice/Practice_article.md
+26-14Lines changed: 26 additions & 14 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -178,8 +178,10 @@ Dagger 2 имеет следующие преимущества перед "ру
178
178
Есть возражения, что если осуществлять еще и кеширование, то как-то много всего будет в Репозитории. Ну тут остается только посоветовать - делегируйте во вспомогательные классы. У Фернандо показан хороший пример делегирования через Фабрику и DataStore (в [статье Ханнеса](http://hannesdorfmann.com/android/evolution-of-the-repository-pattern), раздел Evolution of the Repository Pattern term). Там фабрика решает, какой DataStore задействовать для конкретного id. <br>
179
179
Если для принятия решения о кешировании нужна информация с другого Репозитория, то пускай Интерактор передаст через аргумент метода нужную инфу в Репозиторий. Вообщем тут Интерактор отвечает за взаимодействием и необходимый обмен информацией между Репозиториями. Например у одного репозитория запросил, какой режим сейчас (пользовательский или демо), а в другой репозиторий передал эти данные для получения корректного списка операций.<br>
Исходя из вышесказанного Репозиторий должен тестироваться.<br>
185
187
Если вам нужно сделать приложение быстро, можно, конечно, не заморачиваться с маппингом, а передавать модель, полученную с запроса. Но если приложение чуть более серьезное и долгое, то лучше маппить. Так как по опыту, по Дате-уровне или по логике получения данных всегда что-то может поменяться. Бизнес-логика про это вообще не должна знать.<br>
@@ -218,13 +220,17 @@ Dagger 2 имеет следующие преимущества перед "ру
218
220
Есть интерфейс Репозитория. Скажем, IAppRepository<br>
219
221
У него есть метод :<br>
220
222
221
-
public Observable<Point> getLocation()
223
+
```java
224
+
publicObservable<Point> getLocation()
225
+
```
222
226
223
227
В конкретной реализации интерфейса - AppRepository будет такой код примерно:<br>
224
228
225
-
public Observable<Point> getLocation() {
226
-
return geoApiProvider.getLocation()
227
-
}
229
+
```java
230
+
publicObservable<Point> getLocation() {
231
+
return geoApiProvider.getLocation()
232
+
}
233
+
```
228
234
229
235
geoApiProvider - это специальный класс, которому мы делегируем работу с сервисом и т.д. Внутри у этого класса будет работа с сервисом и Subject, через который будут отдаваться данные. Заметим, что наружу мы выдаем не Subject, а Observable - ни к чему пользователям знать большее.<br>
230
236
Могут быть вопросы по тому, а как потом убить сервис, если он стартующий, например.<br>
@@ -420,20 +426,26 @@ SubscriveOn() происходит уже в интеракторе, или ре
420
426
421
427
Презентер:<br>
422
428
423
-
userInteractor.downloadUserInfo()
424
-
.map(mapper::entityToView);
425
-
.observeOn(AndroidSchedulers.mainThread())
426
-
.subscribe(view::showUserInfo);
429
+
```java
430
+
userInteractor.downloadUserInfo()
431
+
.map(mapper::entityToView);
432
+
.observeOn(AndroidSchedulers.mainThread())
433
+
.subscribe(view::showUserInfo);
434
+
```
427
435
428
436
Интерактор:<br>
429
437
430
-
repository.downloadUserInfo();
438
+
```java
439
+
repository.downloadUserInfo();
440
+
```
431
441
432
442
Репозиторий (в более сложном кейсе, Schedulers зависи от источника данных, тут упрощённый пример с нетворком):<br>
433
443
434
-
api.downloadUserInfo()
435
-
.subscribeOn(Schedulers.io)
436
-
.map(mapper::networkToEntity);
444
+
```java
445
+
api.downloadUserInfo()
446
+
.subscribeOn(Schedulers.io)
447
+
.map(mapper::networkToEntity);
448
+
```
437
449
438
450
Переключение потоков может быть как частью бизнес-логики, так и частью слоя данных. Зависит от того, какой класс имеет необходимую информацию для принятия решения.<br>
439
451
При передаче между слоями можно всегда прокидывать данные через главный поток - таким образом, при получении observable в новом слое мы знаем, на каком потоке он выполнится. Минус подхода - зачастую, будут излишние переключения.<br>
0 commit comments