Rx java 我应该使用反应式编程(RxJava)来解决复杂的问题吗?

Rx java 我应该使用反应式编程(RxJava)来解决复杂的问题吗?,rx-java,reactive-programming,rx-java2,Rx Java,Reactive Programming,Rx Java2,我有一个应用程序,在这个应用程序中,我开始将事件流表示为一个RxJava可观察对象。事件的需求和结构在一开始很简单,RxJava附带的操作符非常适合进行所需的简单转换 然而,从那时起,需求和业务逻辑变得更加复杂。需要以非常特殊的方式将事件关联起来,而之前对可观察对象的操作非常友好,变成了大量的代码。我必须编写自定义变压器,我从其他自定义变压器等使用 尽管我确信如果不使用RxJava,代码至少会变得像现在一样复杂,但我关心以下几点: 所有内容都是以反应式的风格编写的,我认为这对于大多数新手来说是很

我有一个应用程序,在这个应用程序中,我开始将事件流表示为一个RxJava可观察对象。事件的需求和结构在一开始很简单,RxJava附带的操作符非常适合进行所需的简单转换

然而,从那时起,需求和业务逻辑变得更加复杂。需要以非常特殊的方式将事件关联起来,而之前对可观察对象的操作非常友好,变成了大量的代码。我必须编写自定义变压器,我从其他自定义变压器等使用

尽管我确信如果不使用RxJava,代码至少会变得像现在一样复杂,但我关心以下几点:

  • 所有内容都是以反应式的风格编写的,我认为这对于大多数新手来说是很难做到的,我担心这会对项目的进一步贡献造成限制
  • 我的一位朋友(他也在这个项目中工作)多次提到RxJava的使用应该简单得多。他说,他所看到的任何基于RxJava的项目都使用简单的操作符,而没有在彼此之间嵌套自定义转换器
  • 测试代码变得很困难。除非我模仿我的小变压器,否则我必须一起测试所有东西,否则我必须使用它们作为使用它们的变压器的构造函数参数,这感觉不正确,即使使用注入
  • 我相信对我的问题必须有一个明确的答案:RxJava应该处理复杂的问题吗?如果是,用什么方式?这些解决方案应该如何测试?现在我只能提出一些解决方案,这些解决方案需要将代码组织到单独的单元中,这样我就不会有数百行连续的代码来摆弄groupby、flatMap、scan和combineLatest操作符,它们相互嵌套在几个层次上

    谢谢你的回答


    (顺便说一句,我越来越喜欢反应式编程,因为它在某些问题上被证明更直接,尤其是在它帮助我避免直接处理可变状态的情况下。也许可测试性是我最担心的。我通常在kotlin中使用依赖项注入,并为所有问题编写单独的单元测试,但我怀疑这是否是我所担心的。)RxJava是RxJava中最好的解决方案)

    RxJava就像任何好的工具一样:如果使用得当,它会做得很好。你让代码随着需求的增长而增长,你的“好工具”开始让你感到压力

    RxJava对于解决需要跨线程边界进行复杂协调的问题非常有用。运算符允许您将数据“从众”到所需的线程,并确保线程安全操作,而在大多数情况下,无需过度使用
    synchronized
    volatile
    构造

    重构代码 如果某个东西很难进行单元测试,则重构它。如果某个东西很难理解,则重构它和/或重新设计它


    反应式风格是需要学习的。不要因为它很难,或者因为其他人可能不理解它而退缩。反应式风格给你的最重要的能力是思考代码的能力,甚至跨越线程边界,以及时间和空间本身:)。

    谢谢Bob Dalgleish!我重构了我的代码,最后我达到了一个程度,它的长度和估计的复杂性与面向对象的代码相似。然而,我不能再改进它了,我们最终采用了面向对象的方法,因为时间不多了。尽管如此,我还是从中学到了很多,并将借此机会再次使用它。我同意你的观点,它是一个很棒的工具。多线程之间的同步和协调不是这个问题的一部分,这也是我们最终没有使用RxJava的另一个原因。