看起来“必须”支持反应式代码的代码是否常见?

时间:2019-08-14 03:54:16

标签: java project-reactor reactor imperative-programming

似乎我正在开始编写“命令式”方法来支持反应式链的功能/可读性。这可能不是最技术性的问题,但这很常见吗?

@Component
public class MyRequestHandler {

    public Mono<ServerResponse> add(ServerRequest request) {
        return request.bodyToMono(MyPOJO.class).flatMap(this::add)
                                                 .switchIfEmpty(ServerResponse.noContent().build());
    }

    /*
     * this code supports add(ServerRequest)
     *   also simplifies returning a Mono<ServerResponse>
     */
    private Mono<ServerResponse> add(MyPOJO myPOJO) {
        System.out.println("Received >> " + myPOJO.toString());
        return (myPOJO.getValue() % 2 == 0 ) ? ServerResponse.ok()
                                                               .body(Mono.just(true), Boolean.class)
                                               : ServerResponse.ok()
                                                               .body(Mono.just(false), Boolean.class);
    }
}

1 个答案:

答案 0 :(得分:2)

混合命令式代码和响应式/功能性代码有时是最清晰的处理方式-它没有内在的错误。 (有时这样做是因为作者不知道“更好”的功能方式,但是只要可读性强,这也就没有本质上的错误。)

但是,这里的代码没有什么特别的“必要”,您只需将内部flatMap()代码提取到一个单独的方法中即可。该方法仍返回一个反应性元素,并且由一个反应性流调用组成。

这是正常现象吗,被接受了吗?双方都同意。这里的规则与“普通” OO编程一样,适用于将代码分成可测试,可重用(或可能可重用)的元素。

我还要在这里指出两点。首先,在您的示例中根本不需要三元运算符,更好的是:

return ServerResponse.ok()
        .body(Mono.just(myPOJO.getValue() % 2 == 0), Boolean.class)

第二,您可以在Flux上使用log()并使用“ TRACE”调试级别为您提供更详细的日志记录,而不是随意在钩子中打印出“已接收”的值以进行调试。