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

时间:2017-12-14 15:55:29

标签: rx-java reactive-programming rx-java2

我有一个应用程序,我开始将事件流表示为RxJava Observable。事件的要求和结构在开始时很简单,RxJava附带的操作符非常适合所需的简单转换。

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

Altough我确信代码在不使用现有RxJava的情况下至少会变得复杂,我关注以下事项:

  1. 一切都是以反应式的方式写成,我认为对大多数新人来说很难得到,而且我担心这对项目的进一步贡献会带来限制。
  2. 我的一位朋友(他也参与了这个项目)多次提到RxJava应该更简单地使用。他说,他见过的任何基于RxJava的项目都使用简单的运算符,而没有相互嵌套自定义变换器。
  3. 测试代码变得困难。除非我模拟我的小变形金刚,否则我必须一起测试所有变形金刚,否则我必须使用它们作为使用它们的变形金刚的构造函数参数,即使注射也感觉不对。
  4. 我相信我的问题必须有一个明确的答案: RxJava是否应该解决复杂的问题,如果是这样,以什么方式?这些解决方案应该如何测试?现在我只能提出需要将代码组织成单独单元的解决方案,这样我就不会有数百行连续代码摆弄groupyBy,flatMap,scan和combineLatest运算符彼此嵌套了几层深。

    感谢您的回答!

    (顺便说一句,我非常喜欢反应式编程,因为事实证明它在某些问题上更直接,特别是它帮助我避免直接​​处理可变状态。也许可测试性是我最担心的。我通常在kotlin中使用依赖注入并为所有内容编写单独的单元测试,但我怀疑这是RxJava中的最佳解决方案)

1 个答案:

答案 0 :(得分:2)

RxJava就像任何好工具一样:当正确使用它时,它做得很好。随着需求的增长,您可以让代码增长,并且您的优秀工具可以使用#34;开始让你失望。

RxJava对于解决需要跨线程边界进行复杂协调的问题非常有用。运营商允许您进入"牧群"您的数据到达所需的线程并确保线程安全的操作,在大多数情况下,不需要过度使用synchronizedvolatile构造。

重构您的代码 如果某些事情难以进行单元测试,请重构它。如果某些内容难以理解,请对其进行重构和/或重新设计。

反应式是学到的东西。不要因为这很困难,或者因为其他人可能不理解它而不再支持它。反应式风格最重要的功能是能够推理代码,甚至跨越线程边界,以及时间和空间本身:)。