1)不要随意增加null判断,通过异常来明确业务要求
下面代码的业务逻辑:如果bspcalendar.getHasProduction() is true,那么billPeriodService.queryBillPeriod一定有值,这个限制时通过界面控制实现的,这样的话下面的if (billp != null) 判断是没有意义的,由于开发阶段的数据准备问题会导致billPeriodService.queryBillPeriod可能会为空,所以增加if (billp != null) 判断,使得程序不会出现空指针,但如果真得为空了会导致逻辑错误(代码没有报错,但结果不对,给调式问题带来的困难),数据为空的原因是其他代码的错误导致的。更好的做法是如果为空就抛出异常,使得程序中断而不是按错误的路径执行,明确提示开发人员是数据问题导致的,这样开发人员一眼就能知道原因了。并且一定不能为空也是业务逻辑上的要求。
int month = 1;
int period = 1;
BspCalendar bspcalendar = bspCalendarService.queryBspCalendar(param.getYear());
if (bspcalendar.getHasProduction()) {
BillPeriod billp = billPeriodService.queryBillPeriod(userInfo.getBspCode(),
param.getStartDate());
if (billp != null) {
month = praseBillPeriod(billp.getBillPeriod().substring(2))[0];
period = praseBillPeriod(billp.getBillPeriod().substring(2))[1];
}
} else {
if (yearHeader.compareTo(param.getStartDate()) > 0) {
month = 1;
} else {
month = DateUtils.getMonth(param.getStartDate());
}
}
改进后的代码,增加了为空后的异常。
int month = 1;
int period = 1;
BspCalendar bspcalendar = bspCalendarService.queryBspCalendar(param.getYear());
if (bspcalendar.getHasProduction()) {
BillPeriod billp = billPeriodService.queryBillPeriod(userInfo.getBspCode(),
param.getStartDate());
if (billp != null) {
month = praseBillPeriod(billp.getBillPeriod().substring(2))[0];
period = praseBillPeriod(billp.getBillPeriod().substring(2))[1];
} else {
throw new RuntimeException("not exist BillPeriod,it's StartDate is:"
+ DateUtils.dateToString(param.getStartDate(), "yyyyMMdd"));
}
} else {
if (yearHeader.compareTo(param.getStartDate()) > 0) {
month = 1;
} else {
month = DateUtils.getMonth(param.getStartDate());
}
}