Skip to content

Commit e09a319

Browse files
authored
Merge pull request #7 from OsipXD/patch-2
Подсветка кода в Practice_article.md
2 parents ac101c1 + b1274a6 commit e09a319

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
@@ -178,8 +178,10 @@ Dagger 2 имеет следующие преимущества перед "ру
178178
Есть возражения, что если осуществлять еще и кеширование, то как-то много всего будет в Репозитории. Ну тут остается только посоветовать - делегируйте во вспомогательные классы. У Фернандо показан хороший пример делегирования через Фабрику и DataStore (в [статье Ханнеса](http://hannesdorfmann.com/android/evolution-of-the-repository-pattern), раздел Evolution of the Repository Pattern term). Там фабрика решает, какой DataStore задействовать для конкретного id. <br>
179179
Если для принятия решения о кешировании нужна информация с другого Репозитория, то пускай Интерактор передаст через аргумент метода нужную инфу в Репозиторий. Вообщем тут Интерактор отвечает за взаимодействием и необходимый обмен информацией между Репозиториями. Например у одного репозитория запросил, какой режим сейчас (пользовательский или демо), а в другой репозиторий передал эти данные для получения корректного списка операций.<br>
180180

181-
modeRepository.getMode()
182-
.flatMap(mode -> operationsRepository.getOperations(mode))
181+
``` java
182+
modeRepository.getMode()
183+
.flatMap(mode -> operationsRepository.getOperations(mode))
184+
```
183185

184186
Исходя из вышесказанного Репозиторий должен тестироваться.<br>
185187
Если вам нужно сделать приложение быстро, можно, конечно, не заморачиваться с маппингом, а передавать модель, полученную с запроса. Но если приложение чуть более серьезное и долгое, то лучше маппить. Так как по опыту, по Дате-уровне или по логике получения данных всегда что-то может поменяться. Бизнес-логика про это вообще не должна знать.<br>
@@ -218,13 +220,17 @@ Dagger 2 имеет следующие преимущества перед "ру
218220
Есть интерфейс Репозитория. Скажем, IAppRepository<br>
219221
У него есть метод :<br>
220222

221-
public Observable<Point> getLocation()
223+
```java
224+
public Observable<Point> getLocation()
225+
```
222226

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

225-
public Observable<Point> getLocation() {
226-
return geoApiProvider.getLocation()
227-
}
229+
```java
230+
public Observable<Point> getLocation() {
231+
return geoApiProvider.getLocation()
232+
}
233+
```
228234

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

421427
Презентер:<br>
422428

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

428436
Интерактор:<br>
429437

430-
repository.downloadUserInfo();
438+
```java
439+
repository.downloadUserInfo();
440+
```
431441

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

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

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

0 commit comments

Comments
 (0)