有没有一种方法可以简化该源代码?

肖恩·辛:

我目前正在使用Spring Boot来实现公告板API。我将向您展示的源代码场景是关于公告板或注释的修改,

修改之前,都必须在输入评论或公告板时都提交密码。

因此,我只使用'isBoard'作为input:hidden值来执行'boardRepository'中的'findById',并将其与passwordEncoder的匹配功能进行比较,然后更新布尔值。

但是,以下代码显示重复并使用了相同的逻辑。有没有办法使它更简单?

 @Transactional
public boolean tryToUpdateArticleOrReply(Long id, String password, boolean isBoard) throws ApiException {
    AtomicBoolean result = new AtomicBoolean(false);

    if(isBoard) {
         boardRepository.findById(id).ifPresent(
                board -> {
                    result.compareAndSet(passwordEncoder.matches(board.getUserPass(), password), true);
                }
         );
    } else {
        replyRepository.findById(id).ifPresent(
                reply -> {
                    result.compareAndSet(passwordEncoder.matches(reply.getUserPass(), password), true);
                }
        );
    }
    if(result.get())
      return result.get();

    throw new ApiException("INVALID_USER_PASS", "you submitted invaild password.", new ApiExceptionData().add("user_pass", password));
}
亡灵:

如果您的findByIdgetUserPass方法来自接口(并且findById方法返回来自接口的接口getUserPass),那么您可以简单地执行以下操作:

private boolean check(FindByIdInterface repository,
                      Long id,
                      String password) {
    return repository.findById(id)
            .map(result -> 
                passwordEncoder.matches(
                    result.getUserPass(), password))
            .orElse(false); 
}

然后只需调用它,repository即可根据isBoard变量选择要传递的位置isBoard ? boardRepository : replyRepository


如果它们不是来自共享接口,则可以使用Java中的某些功能接口来有效地“假装”它们。

/* R = repository type, T = return type of 'findById' */
private <R, T> check(Function<R, Optional<T>> getByIdMapper,
                     Function<T, String> getUserPassMapper,
                     R repository,
                     Long id,
                     String password) {
    return getByIdMapper.apply(repository)
            .map(result ->
                passwordEncoder.matches(
                    getUserPassMapper.apply(result),
                    password))
            .orElse(false);
}

然后用类似这样的名称:

if (isBoard) {
    return check(BoardRepository::getById,
                 Board::getUserPass,
                 boardRepository, id, password);
} else {
    // ...
}

请注意,在任何情况下都没有AtomicBoolean必要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有一种方法可以简化此代码?该代码在3张纸上重复。

在AFNetworking 2.0中,有没有一种方法可以简化这样的代码?

有没有一种方法可以简化针对Flask WTForms错误的代码,这是我当前的代码

有没有一种方法可以将以下代码简化为一个if语句?

Python-有没有一种方法可以简化网络抓取代码?

有没有一种方法可以简化此代码?Visual Basic在这里

有没有一种方法可以用更少的代码来简化此过程?

有没有一种方法可以强制Checkstyle忽略源代码中的特定警告?

有没有一种方法可以从网站的源代码以编程方式运行javascript函数

有没有一种方法可以让用户上传SVG文件,然后呈现SVG源代码?

有没有一种方法可以实时跟踪网站源代码的类更改?

有没有一种方法可以简化此基本联接查询?

有没有一种方法可以简化document.getElementById?

有没有一种方法可以简化Swift尾随闭包的键入?

有没有一种方法可以简化R中利用循环的函数?

有没有一种方法可以简化Python中的“循环” /“循环”交互?

有没有一种方法可以优化该代码?Go中的TCP服务器

有没有一种方法可以简化没有宏将Option转换为Result的方法?

有没有一种快速的方法可以在gdb的断点处显示源代码?

有没有一种方法可以简化具有多对一关系的Linq查询?

有没有一种方法可以创建包含源代码的发行版。没有__init__.py的子包?

有没有一种方法可以简化这段代码,而不必一遍又一遍地调用相同的函数?

触发Pry时,有没有一种方法可以自动执行代码?

有没有一种方法可以缩短我的SQL Server代码

有没有一种方法可以从代码中调用GoogleSpreadSheet插件?

有没有一种方法可以更实用地编写此代码?

有没有一种方法可以直接“装饰” Python代码块?

有没有一种方法可以使代码分析忽略“ InternalsVisibleTo”?

有没有一种方法可以为RESTful堆栈生成样板代码?