最近在重构些老项目,发现了些比较典型的代码块。
想到这些常见的写法,可能初学者还是比较容易‘产出’的,所以决定拎出来说说。
实例:
可以看到,这是一个用于新增&修改前的一个名称检测是否重复的函数。
/*** 检测标签名是否重复* @param Id* @param name* @return*/Boolean checkLabelNameExist(Integer Id,String name);
因为糅合了新增和修改,所以多了一个ID 入参,作为判断是否为新增(ID为空则为新增,不为空则为修改)。
那么,对于新增来说, 意是,查出来这个 名称 的数据存在就是重复了。
而对于,修改来说,意是,查出来这个 名称 的数据 需要排除本身,还存在才算是重复了。
那么一起来看看 丑陋的产出 :
/*** 编辑或新增前 ,判断名称是否已存在* @param id* @param name* @return true 为存在 ; false 为不存在*/@Overridepublic 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) 方式后,代码是怎么样的(是不是简洁了非常多) :
@Overridepublic 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个代码片段,自己琢磨思考。
卫语句是通过对原条件进行逻辑分析,将某些要害(guard)条件优先作判断,从而简化程序的流程走向,因此称为卫语句。