Skip to content

Commit b1274a6

Browse files
authored
Подсветка кода в Practice_article.md
1 parent a3271af commit b1274a6

File tree

1 file changed

+26
-14
lines changed

1 file changed

+26
-14
lines changed

practice/Practice_article.md

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,10 @@ Dagger 2 имеет следующие преимущества перед "ру
175175
Есть возражения, что если осуществлять еще и кеширование, то как-то много всего будет в Репозитории. Ну тут остается только посоветовать - делегируйте во вспомогательные классы. У Фернандо показан хороший пример делегирования через Фабрику и DataStore (в [статье Ханнеса](http://hannesdorfmann.com/android/evolution-of-the-repository-pattern), раздел Evolution of the Repository Pattern term). Там фабрика решает, какой DataStore задействовать для конкретного id. <br>
176176
Если для принятия решения о кешировании нужна информация с другого Репозитория, то пускай Интерактор передаст через аргумент метода нужную инфу в Репозиторий. Вообщем тут Интерактор отвечает за взаимодействием и необходимый обмен информацией между Репозиториями. Например у одного репозитория запросил, какой режим сейчас (пользовательский или демо), а в другой репозиторий передал эти данные для получения корректного списка операций.<br>
177177

178-
modeRepository.getMode()
179-
.flatMap(mode -> operationsRepository.getOperations(mode))
178+
``` java
179+
modeRepository.getMode()
180+
.flatMap(mode -> operationsRepository.getOperations(mode))
181+
```
180182

181183
Исходя из вышесказанного Репозиторий должен тестироваться.<br>
182184
Если вам нужно сделать приложение быстро, можно, конечно, не заморачиваться с маппингом, а передавать модель, полученную с запроса. Но если приложение чуть более серьезное и долгое, то лучше маппить. Так как по опыту, по Дате-уровне или по логике получения данных всегда что-то может поменяться. Бизнес-логика про это вообще не должна знать.<br>
@@ -215,13 +217,17 @@ Dagger 2 имеет следующие преимущества перед "ру
215217
Есть интерфейс Репозитория. Скажем, IAppRepository<br>
216218
У него есть метод :<br>
217219

218-
public Observable<Point> getLocation()
220+
```java
221+
public Observable<Point> getLocation()
222+
```
219223

220224
В конкретной реализации интерфейса - AppRepository будет такой код примерно:<br>
221225

222-
public Observable<Point> getLocation() {
223-
return geoApiProvider.getLocation()
224-
}
226+
```java
227+
public Observable<Point> getLocation() {
228+
return geoApiProvider.getLocation()
229+
}
230+
```
225231

226232
geoApiProvider - это специальный класс, которому мы делегируем работу с сервисом и т.д. Внутри у этого класса будет работа с сервисом и Subject, через который будут отдаваться данные. Заметим, что наружу мы выдаем не Subject, а Observable - ни к чему пользователям знать большее.<br>
227233
Могут быть вопросы по тому, а как потом убить сервис, если он стартующий, например.<br>
@@ -417,20 +423,26 @@ SubscriveOn() происходит уже в интеракторе, или ре
417423

418424
Презентер:<br>
419425

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+
```
424432

425433
Интерактор:<br>
426434

427-
repository.downloadUserInfo();
435+
```java
436+
repository.downloadUserInfo();
437+
```
428438

429439
Репозиторий (в более сложном кейсе, Schedulers зависи от источника данных, тут упрощённый пример с нетворком):<br>
430440

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+
```
434446

435447
Переключение потоков может быть как частью бизнес-логики, так и частью слоя данных. Зависит от того, какой класс имеет необходимую информацию для принятия решения.<br>
436448
При передаче между слоями можно всегда прокидывать данные через главный поток - таким образом, при получении observable в новом слое мы знаем, на каком потоке он выполнится. Минус подхода - зачастую, будут излишние переключения.<br>

0 commit comments

Comments
 (0)