最近在重构些老项目,发现了些比较典型的代码块。
想到这些常见的写法,可能初学者还是比较容易‘产出’的,所以决定拎出来说说。
实例:
可以看到,这是一个用于新增&修改前的一个名称检测是否重复的函数。
/**
* 检测标签名是否重复
* @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个代码片段,自己琢磨思考。