一、模拟业务需求
假设我们现在需要在我们的系统中导入一批关于学生信息的Excel的数据,其主要的信息有:学号、姓名、年龄、性别等等,在导入系统的时候,我们肯定不能直接的保存到数据库,我们肯定是先要对这个Excel的数据进行校验,看是否符合系统的要求,只有都符合了系统的要求了,我们把这些数据保存到数据库中去。假如我们的学生对应的实体类如下:
@Data public class Student { /** * 学生编号 */ private String stNo; /** * 学生姓名 */ private String stName; /** <p>本文来源gao!daima.com搞$代!码#网#</p> * 学生年龄 */ private Integer age; /** * 性别 */ private String gender; }
那么假设我们现在的需求是:在我们的StudentServiceImpl业务实现类里面已经接收到了一个List studentList集合的数据,这个集合的数据就是刚刚从Excel里导进来的学生的数据信息,但是集合里面的每个Student对象的属性都没有进行过校验,现要求你对这些属性进行校验完全通过后再把这些学生的信息保存到数据库中去。
二、小步小跑的迭代开发
好,一开始,业务那边的小姑娘小美说这些学生的数据没有什么重要的,只要校验这个学生的姓名不能为空就行且不超过20个字就行了,这个对于你来说就是个小意思,于是你可能在业务代码中先对集合进行遍历然后写下这样的判断:
//判断学生的姓名是否符合条件 if(Objects.nonNull(stu.getStName()) && stu.getStName().length() < 20) { //TODO ...对符合的数据进行下一步的处理 }
过了不久,小美害羞的看着你,对你说:这个年龄也要做判断,必填且不能小于0,不能大于60,改好了请你吃饭。你看着她甜美的笑容,果断的对好说:简单。于是你又加上了这样的代码:
//判断学生的姓名是否符合条件 if(Objects.nonNull(stu.getStName()) && stu.getStName().length() < 20) { if(Objects.nonNull(stu.getStAge()) && stu.getStAge() > 0 && stu.getStAge() < 60) { //TODO ...对符合的数据进行下一步的处理 } }
又过了几天,你又看到小美跑过来,你满怀期待的觉得她是通知你今天下班了一起共进晚餐。但是她却支支吾吾的想说又说不出,这里你心想,完蛋了,会不会共进晚餐的机会泡汤了。这时她说:这个学生的性别也要做校验,且只能是“男”或“女”,加上之前的都要校验通过了才能在到系统里面。听到这里,你不由得松了一口气,共进晚餐的机会还有。于是你说:没问题。于是你又在原先的代码里面进行了迭代:
//判断学生的姓名是否符合条件 if(Objects.nonNull(stu.getStName()) && stu.getStName().length() < 20) { if(Objects.nonNull(stu.getStAge()) && stu.getStAge() > 0 && stu.getStAge() < 60) { if(Object.notNull(stu.getGender()) && ("男".equest(stu.getGender()) || "女".equest(stu.getGender()))) { //TODO ...对符合的数据进行下一步的处理 } } }
你很快的改完了,但是在检查的时候,看着这个代码,总感觉有总说不出来的问题,但是又好像没有什么问题。实然,你想到以后小美肯定还会经常来找你,如果再继续的这样if的写下去,以后越来越难维护了,以后和小美吃饭的时间都没有了。想到这,你不由得直冒冷汗。于是你闭关半天,终于把这个潜在的阻止你和小美吃饭的的拦路虎给解决了。
三、系统对数据的校验要求
- stName(学生姓名):不能为空,不能超过20个字符。
- age(学生年龄):只能为整数,且小于60。
- gender(学生性别):只能是”男”或”女”。
- stNo(学生编号):要求唯一,不能为空,不能超过20个字符,且在数据库中不能已经存在。