Комментарии 11
Зачем для разового запроса в doRequest возвращается flow (с единственным emit-ом)? почему бы не сделать просто suspend-функцию
Если запрос предполагает один ответ, то flow там избыточен
suspend fun <T> doRequest(
...
): Either<String, T> = withContext(Dispatchers.IO) {
// ...
// Either.Left() or Either.Right()
}
К тому же doSomethingInSuccess - это лишний side effect. Зачем возвращать результат (который игнорится) отдельно через функцию и через колбэк
Согласен с комментарием о doSomethingInSuccess, калбэк видится лишним, ведь если запрос упадёт, выпадет исключение и выполнение функции прекратится.
От себя ещё замечу, что наследование BaseRepository так же можно заменить на internal top level функцию или композицию
А хотелось бы узнать почему вам видиться метод doSomethingInSuccess
лишним. Я хочу вам дать такой кейс. Сделали мы такую функцию как doRequest
окей сделали по нему запрос, но эти данные нам нужно каким-то образом сохранить куда-то в результате как мы можем это все разграничить и правильно написать? Вижу я это вот так в своей реализации:
class SignInRepositoryImpl @Inject constructor(
private val service: SignInApiService,
private val userData: UserData
) : BaseRepository(), SignInRepository {
override fun signIn(userSignIn: UserSignIn) = doRequest(this::setupSignInSuccess) {
service.signIn(userSignIn.fromDomain()).toDomain()
}
private fun setupSignInSuccess(signIn: SignIn) {
// Сохраняем здесь токен в SharedPreferences или же DataStore для дальнейшего использования
userData.saveToken(signIn.token)
}
}
Хотелось бы услышать от вас как бы вы реализовали эту логику?
А насчет internal top функции согласен с вами можно и так вынести, но просто изначально в коде ещё есть такой же метод для запроса с пагинацией. Просто не видел смысла выносить.
А насчет internal top функции согласен с вами можно и так вынести, но просто изначально в коде ещё есть такой же метод для запроса с пагинацией. Просто не видел смысла выносить.
Для себя выучил, что наследование - последнее, к чему надо прибегать.
Хотелось бы услышать от вас как бы вы реализовали эту логику?
class SignInRepositoryImpl @Inject constructor(
private val service: SignInApiService,
private val userData: UserData
) : BaseRepository(), SignInRepository {
override fun signIn(userSignIn: UserSignIn) = doRequest {
service.signIn(userSignIn.fromDomain()).toDomain()
.also { userData.saveToken(it.token) }
}
}
А вопрос если захочу кастомно обработать ошибку правильнее ли будет добавить в этот же код ещё раз catch
override fun fetchFoo() = doRequest {
service.fetchFoo().toDomain().also {
// do something in success
}
}.catch { exception ->
// do something in error
}
Для себя выучил, что наследование — последнее, к чему надо прибегать.
Можно уточнить почему? Впринципе понял скорее всего тогда возьму и выведу
Интересно и полезно, спасибо за материал :)
Запросы в сеть с Clean Architecture и MVVM. Boilerplate ч. 2