关于局部变量,适时定义局部变量,可提高代码清晰度和可读性,并能规避不必要的代码bug
局部变量,在使用时再定义,提高代码可读性
下面代码中的2个方法,第1个 verifyTaskApply
调用第2个 existAppliedTask
。 请问,在 existAppliedTask
中调用 taskApplyService.getUserTaskApply
时, checkTaskApplyDTO 有哪些属性值?
private void verifyTaskApply(OrderDetailVO detail,List<UserSignVO> signedList) {log.info("收款人任务领取单校验,detailVO:{}", detail);if (detail == null || StringUtils.isBlank(detail.getUserIdcardNo()) ||detail.getTaskId() == null || detail.getProviderId() == null ||detail.getEnterpriseId() == null) {log.error("收款人任务领取单校验,参数错误,detailVO:{}", detail);throw new VerifyException(VerifyStatusResult.failedWithMessage("收款人任务领取单校验,参数错误"));}if (CollectionUtils.isEmpty(signedList)) {throw new VerifyException(VerifyStatusResult.failedWithMessage("签约记录未获取到"));}CheckTaskApplyDTO checkTaskApplyDTO = new CheckTaskApplyDTO();checkTaskApplyDTO.setProviderId(detail.getProviderId());checkTaskApplyDTO.setTaskId(detail.getTaskId());checkTaskApplyDTO.setEnterpriseId(detail.getEnterpriseId());checkTaskApplyDTO.setProductEnum(ProductEnum.BossKG);boolean exists = existAppliedTask(detail, checkTaskApplyDTO,signedList);if (!exists) {throw new VerifyException(VerifyStatusResult.failedWithMessage("收款人未领取任务"));}
}
private boolean existAppliedTask(OrderDetailVO detail, CheckTaskApplyDTO checkTaskApplyDTO, List<UserSignVO> signedList){for (UserSignVO signVO : signedList) {detail.setUserId(signVO.getUserId());detail.setUserSignBankCard(signVO.getUserBankCard());checkTaskApplyDTO.setUserId(signVO.getUserId());ResultX<TaskApplyVO> result = taskApplyService.getUserTaskApply(checkTaskApplyDTO);if (!result.isSuccess() || result.getResult() == null) {log.warn("收款人任务领取单校验,未领取任务,taskApplyQuery:{}", checkTaskApplyDTO);continue;}TaskApplyVO taskApplyVO = result.getResult();detail.setTaskApplyId(taskApplyVO.getApplyId());detail.setSignId(signVO.getSignId());if (TaskApplyStatusEnum.TASKAPPLY_PASS == TaskApplyStatusEnum.getBean(taskApplyVO.getApplyStatus())) {return true;}log.warn("收款人任务领取单校验,收款人任务领取单未领取,taskApplyQuery:{}", checkTaskApplyDTO);}return false;
}
有没有一种可能,你认为checkTaskApplyDTO只给了一个 userId属性值?
如果有,如何消除这种“可能的认为”呢?
so easy!下面隐藏的代码,告诉你答案。
private void verifyTaskApply(OrderDetailVO detail,List<UserSignVO> signedList) {...boolean exists = existAppliedTask(detail, signedList);...
}
private boolean existAppliedTask(OrderDetailVO detail, List<UserSignVO> signedList){CheckTaskApplyDTO checkTaskApplyDTO = new CheckTaskApplyDTO();checkTaskApplyDTO.setProviderId(detail.getProviderId());checkTaskApplyDTO.setTaskId(detail.getTaskId());checkTaskApplyDTO.setEnterpriseId(detail.getEnterpriseId());checkTaskApplyDTO.setProductEnum(ProductEnum.BossKG);for (UserSignVO signVO : signedList) {detail.setUserId(signVO.getUserId());detail.setUserSignBankCard(signVO.getUserBankCard());checkTaskApplyDTO.setUserId(signVO.getUserId());ResultX<TaskApplyVO> result = taskApplyService.getUserTaskApply(checkTaskApplyDTO);if (!result.isSuccess() || result.getResult() == null) {log.warn("收款人任务领取单校验,未领取任务,taskApplyQuery:{}", checkTaskApplyDTO);continue;}...}return false;
}
是否依然有一种可能,你认为checkTaskApplyDTO只给了一个 userId属性值?
如果有,如何消除这种“可能”呢?
so easy!下面隐藏的代码,告诉你答案。
private void verifyTaskApply(OrderDetailVO detail,List<UserSignVO> signedList) {...
}
private boolean existAppliedTask(OrderDetailVO detail, List<UserSignVO> signedList){ for (UserSignVO signVO : signedList) {detail.setUserId(signVO.getUserId());detail.setUserSignBankCard(signVO.getUserBankCard());CheckTaskApplyDTO checkTaskApplyDTO = new CheckTaskApplyDTO();checkTaskApplyDTO.setProviderId(detail.getProviderId());checkTaskApplyDTO.setTaskId(detail.getTaskId());checkTaskApplyDTO.setEnterpriseId(detail.getEnterpriseId());checkTaskApplyDTO.setProductEnum(ProductEnum.BossKG);checkTaskApplyDTO.setUserId(signVO.getUserId());ResultX<TaskApplyVO> result = taskApplyService.getUserTaskApply(checkTaskApplyDTO);if (!result.isSuccess() || result.getResult() == null) {log.warn("收款人任务领取单校验,未领取任务,taskApplyQuery:{}", checkTaskApplyDTO);continue;}...}return false;
}
局部变量,在使用时再定义,规避bug
下图,再一次证明 “变量在使用时再定义” 这句话的正确性。
方法的开头定义了 ret 变量,从这个方法的逻辑,不难看出,这个 ret 是方法的返回值。 而在后面打印日志时,开发者不慎,误将 cardBinDTO 敲成了 ret ,显然,这是一个失误!
如果将 ret 变量的定义延后到 return 语句那块的话,就完全可以规避这个问题。