我已经在我的项目中使用RxJava一年左右了。
随着时间的推移,我越来越喜欢它 - 现在我开始认为可能是太喜欢了...
现在,我注意到有些方法需要大量工作来组合不同的可观察方法。 我感觉虽然我现在理解自己写的东西,但下一个程序员很难理解我的代码。
在我说到重点之前,让我直接给出一个来自Kotlin代码的例子吧(不要深入研究):
简单来说,它的作用是:
- 从存储中检索一些带有时间戳的数据 - 如果数据不是最新的,则从网络中获取数据
- 同步网络数据与存储(以更新数据)
- 如果出现网络错误,则再次检索旧数据和错误信息
我的实际问题是:
响应式编程提供了一些非常强大的概念。但是我们知道“伟大的力量伴随着巨大的责任”。
我们该如何把握度?是否可以在整个程序中填充令人惊叹的响应式一行代码,或者只在真正平凡的操作中使用它?
显然这很主观,但我希望有更多经验的人分享他的知识和缺点。
让我更好地表达它:
如何设计反应性代码以使其易于阅读?
现在,我注意到有些方法需要大量工作来组合不同的可观察方法。 我感觉虽然我现在理解自己写的东西,但下一个程序员很难理解我的代码。
在我说到重点之前,让我直接给出一个来自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))
}
简单来说,它的作用是:
- 从存储中检索一些带有时间戳的数据 - 如果数据不是最新的,则从网络中获取数据
- 同步网络数据与存储(以更新数据)
- 如果出现网络错误,则再次检索旧数据和错误信息
我的实际问题是:
响应式编程提供了一些非常强大的概念。但是我们知道“伟大的力量伴随着巨大的责任”。
我们该如何把握度?是否可以在整个程序中填充令人惊叹的响应式一行代码,或者只在真正平凡的操作中使用它?
显然这很主观,但我希望有更多经验的人分享他的知识和缺点。
让我更好地表达它:
如何设计反应性代码以使其易于阅读?