cswork / AI 辅助编程轮全部练习

重构 · 约 40 分钟

注册表单校验:只重构,不改行为

src/signup.py 里的 validate_signup() 负责账号服务注册表单的校验。它能用,测试也全部通过;但它是一个 170 行的函数,分支嵌套五层,同一段检查数字的循环按国家复制粘贴了好几份。下一个来加字段的人,多半会改坏点什么。

这次的任务是纯重构:

  • 函数名和参数不变;对任何表单,返回的错误码列表必须完全一样,顺序也一样;
  • 不加新东西:不加校验、不改提示文案,也不顺手修"bug"(说不定有人依赖它);
  • 结构要改到 tests/test_metrics.py 通过为止。

tests/test_metrics.py 用 Python 自带的 ast 模块统计 src/,并在程序输出里把起始代码的数值和你的数值并排打印出来:

指标上限
最长函数的行数25
单个函数或 lambda 里的分支数(if/elif、for、while、条件表达式、推导式里的每个 if、match 的每个 case,and/or 每多一个操作数算一个)8
重复代码块(连续三条语句,或三行以上的 if/for/while,忽略字面量和变量名后比较)1

src/ 里不能用 exec、eval 或 compile:从字符串运行的代码,上面哪一项都量不到。

建议的做法:

  1. 先读代码和 tests/ 里的测试。动手之前,把拿不准的边界情况补成测试:可以让 AI 助手起草,但每个期望值都要对照现有代码核实。
  2. 一次只把一个字段挪进它自己的小函数,每一步之后都跑一遍测试。
  3. 把复制粘贴的循环换成数据:一张规则表往往比它替换掉的分支短得多。

隐藏测试保留了一份原函数,会在精选的边界情况和几千个随机生成的表单上逐一比对你的结果,并且同样检查结构指标。你只能看到通过了几个。

正在打开项目…