rx-java - 我应该使用响应式(Reactive)编程(RxJava)来解决复杂问题吗?

标签 rx-java reactive-programming rx-java2

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

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

虽然我确信如果不使用 RxJava,代码至少会变得像现在一样复杂,但我担心以下事情:

  1. 所有内容都是以响应式风格编写的,我认为这对于大多数新人来说很难实现,而且我担心这会对项目的进一步贡献造成限制。
  2. 我的一位 friend (也在参与该项目)多次提到 RxJava 应该使用得更简单。他说他见过的任何基于 RxJava 的项目都使用简单的运算符,而无需相互嵌套自定义转换器。
  3. 测试代码变得很困难。除非我模拟较小的变压器,否则我必须一起测试所有内容,但否则我必须将它们用作使用它们的变压器的构造函数参数,即使使用注入(inject),这也感觉不对。

我相信我的问题必须有一个明确的答案:RxJava 是否应该解决复杂的问题,如果是,以什么方式?这些解决方案应该如何测试?现在我只能想出需要将代码组织到单独单元中的解决方案,这样我就不会用数百行连续代码摆弄 groupyBy、flatMap、scan 和 mergeLatest 运算符彼此嵌套了好几层。

感谢您的回答!

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

最佳答案

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

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

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

响应式(Reactive)风格是需要学习的。不要因为它很困难,或者因为其他人可能不理解它而放弃它。响应式风格为您提供的最重要的功能是推理代码的能力,甚至跨越线程边界以及时间和空间本身:)。

关于rx-java - 我应该使用响应式(Reactive)编程(RxJava)来解决复杂问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47817432/

相关文章:

java - 如何实现单次使用有序的ReplaySubject?

javascript - 可观察事件限制/在内存中只保留一个事件/背压

java - Spring Web-Flux 中的背压机制

java - Android RxJava 将嵌套的自定义列表组合在一个列表中

rx-java - 房间 : LiveData or RxJava? 使用哪个

android - 带 Android 开关的 RxView

android - 使用 rxjava2 遍历列表

android - 带有 RxJava2 的 Android Room 中的交易

reactive-programming - RxJava : Can you give me a real live scenario to use flatMap instead of map

java - 用于组合映射的 RxJava 组合器?