SuperAPI AI 工具集

safe-incremental-coding

编程与开发

查看项目

更新于 10-16 01:56

技能介绍

用途

Safe Incremental Coding 用于在修改未经测试的遗留代码、且变更存在风险时,先保护现有行为。它来自 Dave Farley《The Software Developers' Guidebook》中的遗留代码变更方法,核心目标是让受影响代码变得“易于修改”,即可以在安全前提下被改动。该方法要求在重构之前先建立表征测试网,并把工作范围限制在完成所请求变更所需的区域内。

主要能力

  • 建立表征测试网:识别受影响的行为,以及能够驱动该行为的可观察边界。
  • 捕获当前输出或副作用:使用代表性输入,覆盖相关的边界与失败情况;即使现有行为包含已知缺陷,也先固定现状,有意改变行为属于单独步骤。
  • 控制变量:对时间戳、标识符、随机种子等可变值进行控制或归一化,但不隐藏对本次变更重要的行为。
  • 选择测试层级:当单元测试会依赖当前内部结构时,优先在验收或集成边界编写测试。
  • 建立观察接缝:若没有现成边界暴露目标行为,只做最小限度的生产代码改动来提供观察口,保持业务逻辑不变,并在此之后先捕获基线。
  • 验证测试有效性:确认测试在基线上通过,并且能够检测到相关行为变化。
  • 补齐覆盖率:通过的基线只保护它实际执行的用例;当所请求变更依赖缺失用例时,需补充覆盖。

使用方式

  1. 先建立测试网,确认基线通过且具备检测行为变化的能力。
  2. 识别阻碍请求变更被测试的障碍,并选择仅移除该障碍的结构性技术:
    • 死代码或注释遮挡受影响路径:在请求范围内移除这些材料;仅凭测试覆盖不能证明代码未被使用。
    • 一个代码块混合了多个决策,而变更需要隔离其中某个:抽取一个命名能说明用途的内聚操作。
    • 控制流隐藏了需要测试的行为:在保持行为不变的前提下简化受影响的条件或流程。
    • 依赖妨碍控制输入或观察输出:添加窄接缝,或将相关决策与其副作用分离。
    • 无关职责妨碍聚焦测试:在受影响边界内拆分这些职责。
  3. 选择与周边代码及所需测试相匹配的结构;在能降低风险时使用受支持的重构工具。
  4. 每次结构性改动都必须保持行为不变;每完成一个内聚的结构性改动后,运行相关表征检查,再开始下一个。失败要先调查再继续;若改动或失败暴露出更大风险,应扩大检查范围。

完成与交接

准备阶段在以下条件满足时停止:相关现有行为已有通过的表征测试;请求的变更可以通过可用的测试边界被执行;任何所需的结构性改动都保持了已捕获的行为。若在测试网建立后这些条件已成立,直接进入请求的工作。随后应用 tdd 进行有意的行为改变,同时保留表征测试作为保护,只有在替代测试能够证明覆盖相同行为时,才可退役原有测试。最后报告受保护的行为、可测性改动、已运行的检查,以及剩余的证据缺口。

适用场景与边界

适用于需要安全修改未测试遗留代码的场景。应保持有意的行为改变与表征、重构相互分离;当异常行为需要先解释才能安全固定时,应改用 diagnose;受测试保护后的局部清理可应用 clean-code,测试价值可应用 test-lens,模块边界决策可应用 architecture-lens。关于模型选择:应先选择分支再选择模型;协调者工作和确定性命令在调用权限内进行;该方法在当前角色中应用,不派发 worker;若要派发 worker,应使用 shared/references/model-preview.md 及其唯一批准的路线快照;嵌套技能与 runner 消费它时无需再次选择或派发 worker。不得引用或重建书中原文。