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

简介: 关于局部变量,适时定义可以提高代码可读性并规避不必要的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


目录
相关文章
|
2天前
|
人工智能 API 开发工具
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
Claude Code是我目前最推荐的AI编程工具,没有之一。 它可能不是最简单的,但绝对是上限最高的。一旦跑通安装、接上模型、定好规范,你会发现很多原本需要几小时的工作,现在几分钟就能搞定。 这套方案的核心优势就三个字:可控性。你不用依赖任何不稳定服务,所有组件都在自己手里。模型效果不好?换一个。框架更新了?自己决定升不升。 这才是AI时代开发者该有的姿势——不是被动等喂饭,而是主动搭建自己的生产力基础设施。 希望这篇保姆教程,能帮你顺利上车。做出你自己的作品。
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
|
9天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
3798 21
|
5天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
2377 8
|
4天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
1986 4
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
21天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
18884 60
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
2天前
|
SQL 人工智能 弹性计算
阿里云发布 Agentic NDR,威胁检测与响应进入智能体时代
欢迎前往阿里云云防火墙控制台体验!
1168 2

热门文章

最新文章