【问题标题】:Is it common to have code that looks "imperative" supporting reactive code?看起来“势在必行”的代码支持响应式代码是否很常见?
【发布时间】:2019-08-14 03:54:16
【问题描述】:

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

@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);
    }
}

【问题讨论】:

    标签: java project-reactor reactor imperative-programming


    【解决方案1】:

    混合命令式代码和响应式/函数式代码有时是最清晰的做事方式 - 它本质上没有任何问题。 (有时这样做是因为作者不知道“更好”的功能方式,但只要它是可读的,本质上也没有任何问题。)

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

    这是正常的,是否被接受?两者都是。此处适用的规则与“正常”OO 编程相同,即将代码分离为可测试、可重用(或潜在可重用)元素。

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

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

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

    【讨论】:

    • Michael - 感谢您的反馈,并记录了两个附加点。相当笨重的 println 调试是因为这是“丢弃”代码,我只是用来探索反应式编程的特定方面。尽管如此,Flux.log() 上的信息还是值得赞赏的。
    猜你喜欢
    • 2019-01-27
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2015-01-15
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多