【发布时间】:2016-03-13 18:28:20
【问题描述】:
我已经在我的项目中使用 RxJava 大约一年了。 随着时间的推移,我越来越喜欢它——现在我想的可能太多了......
我现在编写的大多数方法都包含某种形式的 Rx,这太棒了! (直到不是)。 我现在注意到有些方法需要大量工作来组合不同的可观察生成方法。 我有一种感觉,虽然我现在理解我写的东西,但下一个程序员将很难理解我的代码。
在深入了解之前,让我直接从我在 Kotlin 中的代码中举一个例子(不要深入研究它):
private fun <T : Entity> getCachedEntities(
getManyFunc: () -> Observable<Timestamped<List<T>>>,
getFromNetwork: () -> Observable<ListResult<T>>,
getFunc: (String) -> Observable<Timestamped<T>>,
insertFunc: (T) -> Unit,
updateFunc: (T) -> Unit,
deleteFunc: (String) -> Unit)
= concat(
getManyFunc().filter { isNew(it.timestampMillis) }
.map { ListResult(it.value, "") },
getFromNetwork().doOnNext {
syncWithStorage(it.entities, getFunc, insertFunc, updateFunc, deleteFunc)
}).first()
.onErrorResumeNext { e -> // If a network error occurred, return the cached data and the error
concat(getManyFunc().map { ListResult(it.value, "") }, error(e))
}
简而言之,它的作用是:
- 从存储中检索一些带时间戳的数据
- 如果数据不是新的,从网络获取数据
- 再次将网络数据与存储同步(以进行更新)
- 如果发生网络错误,请再次检索旧数据和错误
- 如果数据不是新的,从网络获取数据
我的实际问题来了:
反应式编程提供了一些非常强大的概念。但我们知道with great power comes great responsibility。
我们在哪里画线?是否可以用很棒的响应式单行器填充我们的整个程序,还是应该只将其保存用于真正平凡的操作?
显然这是非常主观的,但我希望有更多经验的人可以分享他的知识和陷阱。 让我更好地表达它
如何将我的代码设计为既反应灵敏又易于阅读的代码?
【问题讨论】:
标签: system.reactive rx-java rx-android