看起来 "imperative" 支持响应式代码的代码是否常见?
Is it common to have code that looks "imperative" supporting reactive code?
看来我开始编写 "imperative looking" 方法来支持反应链的 functionality/readability。这可能不是最技术性的问题,但这常见吗?
@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);
}
}
混合命令式代码和反应式/函数式代码有时是最清晰的做事方式——它本身并没有错。 (有时这样做是因为作者不知道 "better" 函数式方式,但只要它是可读的,那也没有什么内在的错误。)
但是,这里的代码没有什么特别的 "imperative" - 您只是将内部 flatMap()
代码提取到一个单独的方法中。该方法仍然返回一个反应元素,并由一个反应流调用组成。
这是否正常,是否被接受?对两者都是。此处适用与 "normal" OO 编程相同的规则,即将代码分离为可测试、可重用(或潜在可重用)的元素。
这里我还要注意两点。首先,在您的示例中根本不需要三元运算符,最好是:
return ServerResponse.ok()
.body(Mono.just(myPOJO.getValue() % 2 == 0), Boolean.class)
其次,您可以在 Flux 上使用 log()
并使用 "TRACE" 调试级别,而不是为了调试目的在钩子中任意打印出 "received" 值更详细的日志记录。
看来我开始编写 "imperative looking" 方法来支持反应链的 functionality/readability。这可能不是最技术性的问题,但这常见吗?
@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);
}
}
混合命令式代码和反应式/函数式代码有时是最清晰的做事方式——它本身并没有错。 (有时这样做是因为作者不知道 "better" 函数式方式,但只要它是可读的,那也没有什么内在的错误。)
但是,这里的代码没有什么特别的 "imperative" - 您只是将内部 flatMap()
代码提取到一个单独的方法中。该方法仍然返回一个反应元素,并由一个反应流调用组成。
这是否正常,是否被接受?对两者都是。此处适用与 "normal" OO 编程相同的规则,即将代码分离为可测试、可重用(或潜在可重用)的元素。
这里我还要注意两点。首先,在您的示例中根本不需要三元运算符,最好是:
return ServerResponse.ok()
.body(Mono.just(myPOJO.getValue() % 2 == 0), Boolean.class)
其次,您可以在 Flux 上使用 log()
并使用 "TRACE" 调试级别,而不是为了调试目的在钩子中任意打印出 "received" 值更详细的日志记录。