局部变量,在使用时再定义

简介: 关于局部变量,适时定义可以提高代码可读性并规避不必要的bug。示例代码中,为了避免误解`checkTaskApplyDTO`仅设置了`userId`,在`existAppliedTask`方法内部,可以通过将`checkTaskApplyDTO`的定义与设置属性的操作靠近,以明确其所有属性值的来源。另外,本文还展示了一个因提前定义变量`ret`而导致的bug实例。如果将此变量的定义延迟至其实际使用前,则可以避免此类问题。适时定义变量有助于减少混淆,提高代码质量。

关于局部变量,适时定义局部变量,可提高代码清晰度和可读性,并能规避不必要的代码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 语句那块的话,就完全可以规避这个问题。

image.png


目录
相关文章
|
3天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
278 116
|
18天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
394 38
Meta SAM3开源:让图像分割,听懂你的话
|
13天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
669 220
|
1天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
129 95
|
11天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1641 157