【发布时间】:2020-01-22 23:53:47
【问题描述】:
我继承了使用 Spring 和包括 Reactor 在内的相关库用 Java 编写的 REST 服务的责任。对于 REST 调用或数据库操作等昂贵的操作,代码将结果广泛包装在 Reactor Mono 中。
代码中有各种各样的事情需要解决,但不断出现的事情是嵌套在 flatMaps 上 Monos 用于一系列昂贵的操作,这些操作最终会缩进几个层次,导致无法阅读混乱。我觉得这很烦人,因为我来自 Scala,这种使用 flatMap 的方式并没有那么糟糕,因为 for comprehension 语法糖将所有内容保持在大致相同的范围内,而不是更深入。
到目前为止,除了大规模重构之外,我还没有成功找到一种方法来使其更具可读性(即使这样我也不确定从哪里开始这样的重构)。
基于代码的匿名示例,(所有语法错误均来自匿名):
public Mono<OutputData> userActivation(InputData input) {
Mono<DataType1> d1 = service.expensiveOp1(input);
Mono<OutputData> result =
d1
.flatMap(
d1 -> {
return service
.expensiveOp2(d1.foo())
.flatMap(
d2 -> {
if (Status.ACTIVE.equals(d2.getStatus())) {
throw new ConflictException("Already active");
}
return service
.expensiveOp3(d1.bar(), d2.baz())
.flatMap(
d3 -> {
d2.setStatus(Status.ACTIVE);
return service
.expensiveOp5(d1, d2, d3)
.flatMap(
d4 -> {
return service.expensiveOp6(d1, d4.foobar())
});
});
});
})
return result;
}
【问题讨论】:
标签: java spring project-reactor idioms