最近在重构些老项目,发现了些比较典型的代码块。

想到这些常见的写法,可能初学者还是比较容易‘产出’的,所以决定拎出来说说。

实例:


可以看到,这是一个用于新增&修改前的一个名称检测是否重复的函数。

    /**
     * 检测标签名是否重复
     * @param Id
     * @param name
     * @return
     */
    Boolean checkLabelNameExist(Integer Id,String name);

因为糅合了新增和修改,所以多了一个ID 入参,作为判断是否为新增(ID为空则为新增,不为空则为修改)。

那么,对于新增来说, 意是,查出来这个 名称 的数据存在就是重复了。

而对于,修改来说,意是,查出来这个 名称 的数据 需要排除本身,还存在才算是重复了。

那么一起来看看 丑陋的产出

    /**
     * 编辑或新增前 ,判断名称是否已存在
     * @param id
     * @param name
     * @return true 为存在  ; false 为不存在
     */
    @Override
    public Boolean checkLabelNameExist(Integer id, String name) {
        Label label = labelService.queryOneByName(name);
        if (Objects.isNull(id)){
            if (Objects.isNull(label)){
                return  false;
            }else {
                return  true;
            }
        }else {
            if (Objects.isNull(label)){
                return  false;
            }else {
                if (!label.getId().equals(id)){
                    return  true;
                }else {
                    return  false;
                }
            }
        }
    }

第一眼看到上面的代码, 你是否会有些熟悉? 

是不是曾经或是现在依然还是在做类似的产出。

我们再来看看 使用  卫语句(guard statement) 方式后,代码是怎么样的(是不是简洁了非常多) :

    @Override
    public Boolean checkLabelNameExist(Integer id, String name) {
        Label label = labelService.queryOneByName(name);
        //查出来是空的,代表肯定不存在
        if (Objects.isNull(label)){
            return  false;
        }
        //如果是新增,查询出来不为空,则代表已存在
        if (Objects.isNull(id)){
            return  true;
        }
        //若是编辑,仅需要判断传入的ID 和查询出来的是否一致,不一致则代表 存在
        return !label.getId().equals(id);
    }

一开始的流水账代码也是没问题的,但是确实看着烦乱很多,见步走步,没有从更上一层角度去统筹梳理。

刚开始,不熟悉使用卫语句的思路。没关系。

可以在写完之后,对着代码自己再去一行行读。

找到guard条件 ,哪些条件是可以不需要嵌入到if 深层里面的,可以提前拿出来判断的。

 初学者可以多看看上面2个代码片段,自己琢磨思考。

11-27 15:02