确定的东西,用断言。
不确定的东西,走校验。
cases:
页面上选择的东西,校验时,可用断言。
页面上输入的东西,校验时,不用断言。
结算提交页面,客户选择taskId、输入支付密码,提交发起结算申请,这时,后端判断taskId、支付密码是否为空,走校验。根据taskId查询到task记录后,可以断言task不为null。
getById(id) 方法里,不能对id断言。
下面代码,第2个 private 方法 getCardBinFromCache,在判断入参 cardNo时, 可以使用断言。
public ResultX<CardBinDTO> selectByCardNo (String cardNo) { if (StringUtils.isEmpty(cardNo)){ return ResultX.error("请求参数为空"); } if (cardNo.length() < BANK_CARD_LENGTH_MIN){ return ResultX.error("小于卡bin最小限制,无法解析"); } CardBinDTO cardBinDTO = getCardBinFromCache(cardNo); if (cardBinDTO == null) { 。。。 } return ResultX.success(cardBinDTO); } private CardBinDTO getCardBinFromCache (String cardNo){ CardBinDTO cardBinDTO = null; //todo: codereview:改用断言更合适 if (StringUtils.isEmpty(cardNo)){ log.info("getCardBinForCache请求参数为空"); return cardBinDTO; } for (final Integer integer : CARD_BIN_LENS) { 。。。 } return cardBinDTO; }
当然,程序校验比较多时,使用 断言+异常捕获 不失是一种比较好的编码方式,因为可以提高代码的整洁度和可维护性。
原始程序校验代码 | 代码重构后 |
---|---|
if (StringUtils.isEmpty(bankCardNo)){ log.info("银行卡号请求参数为空"); return Result.error("银行卡号请求参数为空"); } if (bankCardNo.length() < BANK_CARD_LENGTH_MIN){ log.info("bankCardNo={},无效的银行卡号", bankCardNo); return Result.error("无效的银行卡号"); } if (taskId==null || taskId<=0) { log.info("请求参数taskId非法"); return Result.error("请求参数taskId非法"); } if (***) { log.info("..."); return Result.error("..."); } | try { AssertUtil.notEmptyString(bankCardNo, "银行卡号请求参数为空"); AssertUtil.isTrue(bankCardNo.length() >= BANK_CARD_LENGTH_MIN, "无效的银行卡号"); AssertUtil.isTrue(NumberUtil.isPositive(taskId), "请求参数taskId非法"); AssertUtil.***; } catch (IllegalArgumentException e) { log.info(e.getMessage()); return Result.error(e.getMessage()); } |
添加评论