Мне недавно пришлось пройти технический тест для заявления о приеме на работу, спецификация для которого здесь .В их отзывах одной из вещей, которые им не понравились, была моя логика Rx для Screen 2 - объединение информации из трех отдельных вызовов API.Их точные слова были:
- Для подробностей публикации ведущий очень неуклюж в логике Rx для объединения разных источников данных.Было бы действительно полезно иметь вариант использования вместо этого.
- Знание операторов Rx отсутствует, часто используя неудобные решения
Ниже приведен код, на который они ссылаются:
apiService.getPost(view.postId)
.subscribeOn(Schedulers.io())
.map { posts -> posts[0] }
.flatMap { post ->
Observable.zip<String, String, String, String, PostDetails>(
Observable.just(post.title),
Observable.just(post.body),
apiService.getUser(post.userId).subscribeOn(Schedulers.io()).map { it[0].username },
apiService.getComments(post.id).subscribeOn(Schedulers.io()).map { it.size.toString() },
Function4 { title, body, name, comments -> PostDetails(title, body, name, comments) }
)
}
.observeOn(view.scheduler)
.subscribe { view.showDetails(it) }
Ниже приведены интерфейсы Retrofit для некоторого контекста:
@GET("posts") fun getPost(@Query("id") postId: Int?): Observable<List<Post>>
@GET("users") fun getUser(@Query("id") userId: Int?): Observable<List<User>>
@GET("comments") fun getComments(@Query("postId") postId: Int?): i Observable<List<Comment>>
Пока я писал его, я на самом деле думал, что код был настолько лаконичен, насколько это возможно в данных обстоятельствах.Однако, глядя на это снова и учитывая их комментарии, я должен признать, что это выглядит немного многословно.
Как я могу улучшить это?В частности, какие операторы помогут привести это в порядок?