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
@@ -175,8 +175,10 @@ Dagger 2 имеет следующие преимущества перед "ру
175
175
Есть возражения, что если осуществлять еще и кеширование, то как-то много всего будет в Репозитории. Ну тут остается только посоветовать - делегируйте во вспомогательные классы. У Фернандо показан хороший пример делегирования через Фабрику и DataStore (в [статье Ханнеса](http://hannesdorfmann.com/android/evolution-of-the-repository-pattern), раздел Evolution of the Repository Pattern term). Там фабрика решает, какой DataStore задействовать для конкретного id. <br>
176
176
Если для принятия решения о кешировании нужна информация с другого Репозитория, то пускай Интерактор передаст через аргумент метода нужную инфу в Репозиторий. Вообщем тут Интерактор отвечает за взаимодействием и необходимый обмен информацией между Репозиториями. Например у одного репозитория запросил, какой режим сейчас (пользовательский или демо), а в другой репозиторий передал эти данные для получения корректного списка операций.<br>
Исходя из вышесказанного Репозиторий должен тестироваться.<br>
182
184
Если вам нужно сделать приложение быстро, можно, конечно, не заморачиваться с маппингом, а передавать модель, полученную с запроса. Но если приложение чуть более серьезное и долгое, то лучше маппить. Так как по опыту, по Дате-уровне или по логике получения данных всегда что-то может поменяться. Бизнес-логика про это вообще не должна знать.<br>
@@ -215,13 +217,17 @@ Dagger 2 имеет следующие преимущества перед "ру
215
217
Есть интерфейс Репозитория. Скажем, IAppRepository<br>
216
218
У него есть метод :<br>
217
219
218
-
public Observable<Point> getLocation()
220
+
```java
221
+
publicObservable<Point> getLocation()
222
+
```
219
223
220
224
В конкретной реализации интерфейса - AppRepository будет такой код примерно:<br>
221
225
222
-
public Observable<Point> getLocation() {
223
-
return geoApiProvider.getLocation()
224
-
}
226
+
```java
227
+
publicObservable<Point> getLocation() {
228
+
return geoApiProvider.getLocation()
229
+
}
230
+
```
225
231
226
232
geoApiProvider - это специальный класс, которому мы делегируем работу с сервисом и т.д. Внутри у этого класса будет работа с сервисом и Subject, через который будут отдаваться данные. Заметим, что наружу мы выдаем не Subject, а Observable - ни к чему пользователям знать большее.<br>
227
233
Могут быть вопросы по тому, а как потом убить сервис, если он стартующий, например.<br>
@@ -417,20 +423,26 @@ SubscriveOn() происходит уже в интеракторе, или ре
417
423
418
424
Презентер:<br>
419
425
420
-
userInteractor.downloadUserInfo()
421
-
.map(mapper::entityToView);
422
-
.observeOn(AndroidSchedulers.mainThread())
423
-
.subscribe(view::showUserInfo);
426
+
```java
427
+
userInteractor.downloadUserInfo()
428
+
.map(mapper::entityToView);
429
+
.observeOn(AndroidSchedulers.mainThread())
430
+
.subscribe(view::showUserInfo);
431
+
```
424
432
425
433
Интерактор:<br>
426
434
427
-
repository.downloadUserInfo();
435
+
```java
436
+
repository.downloadUserInfo();
437
+
```
428
438
429
439
Репозиторий (в более сложном кейсе, Schedulers зависи от источника данных, тут упрощённый пример с нетворком):<br>
430
440
431
-
api.downloadUserInfo()
432
-
.subscribeOn(Schedulers.io)
433
-
.map(mapper::networkToEntity);
441
+
```java
442
+
api.downloadUserInfo()
443
+
.subscribeOn(Schedulers.io)
444
+
.map(mapper::networkToEntity);
445
+
```
434
446
435
447
Переключение потоков может быть как частью бизнес-логики, так и частью слоя данных. Зависит от того, какой класс имеет необходимую информацию для принятия решения.<br>
436
448
При передаче между слоями можно всегда прокидывать данные через главный поток - таким образом, при получении observable в новом слое мы знаем, на каком потоке он выполнится. Минус подхода - зачастую, будут излишние переключения.<br>
0 commit comments