使用 return if 语句重构验证

Refactor validation with return if statement

提问人:Justin Xu 提问时间:6/27/2023 更新时间:6/27/2023 访问量:68

问:

我有很多方法,在每个方法上我都必须进行验证。目前,我的代码看起来像这样,工作正常。

@Service
public class UserService {
    @Autowired
    private UserValidation userValidation;

    public BaseResponse<AuthenticationResponse> login(UserLoginRequest request) {
        List<ErrorCode> errors = userValidation.validateUserLoginRequest(request);
        if (!errors.isEmpty()) return Utils.constructFailedBaseResponse(errors);
        // ...
    }

    public BaseResponse<AuthenticationResponse> register(UserRegisterRequest request) {
        List<ErrorCode> errors = userValidation.validateUserRegisterRequest(request);
        if (!errors.isEmpty()) return Utils.constructFailedBaseResponse(errors);
        // ...
    }

    public BaseResponse<User> view(String username) {
        List<ErrorCode> errors = userValidation.validateUserUsernameExists(username);
        if (!errors.isEmpty()) return Utils.constructFailedBaseResponse(errors);
        // ...
    }

    public BaseResponse<Void> edit(UserEditRequest request) {
        List<ErrorCode> errors = userValidation.validateUserEditRequest(request);
        if (!errors.isEmpty()) return Utils.constructFailedBaseResponse(errors);
        // ...
    }
}

但是,我很好奇有没有办法重构代码,这样我就不需要对每个方法都执行重复的 if 语句。下面的代码是我试图实现的,但我不知道怎么做。知道如何将上面的代码转换为下面的代码吗?另一种重构解决方案非常受欢迎。

(或者我应该坚持上面的代码?为什么?

@Service
public class UserService {
    @Autowired
    private UserValidation userValidation;

    public BaseResponse<AuthenticationResponse> login(UserLoginRequest request) {
        userValidation.validateUserLoginRequest(request);
        // ...
    }

    public BaseResponse<AuthenticationResponse> register(UserRegisterRequest request) {
        userValidation.validateUserRegisterRequest(request);
        // ...
    }

    public BaseResponse<User> view(String username) {
        userValidation.validateUserUsernameExists(username);
        // ...
    }

    public BaseResponse<Void> edit(UserEditRequest request) {
        userValidation.validateUserEditRequest(request);
        // ...
    }
}
Java 重构 编码样式 代码清理 非重复

评论

0赞 chameerar 6/27/2023
由于您在 if 条件部分执行相同的操作,因此可以将其提取到单独的方法中。这样看起来会更干净。
0赞 Justin Xu 6/27/2023
@chameerar我不确定这部分。我想不可能将 if 提取到方法中。return
1赞 Bohemian 6/27/2023
您想要实现的称为方面编程。我会相应地对方法进行注释,并让注释背后的代码处理它。要么是像 AspectJ 这样的东西,你可以编写代码,要么是 Spring Security,它主要是神奇地完成的。

答: 暂无答案