想象你住在一栋十来年的老房子里:墙皮开始起鼓,厨房动线绕远,次卧采光昏暗,楼梯转角特别窄。住着住着终于忍不了,你请来一位专业的房屋改造师。这位改造师不急着抡锤子,他先翻出房子的构造图纸,又拿着本子在各个房间走一圈,把问题记成清单,再按轻重缓急排出改造顺序——先修漏水的墙,再改绕远的动线,最后才轮到换墙纸。改造过程中他常驻工地,每完成一步都让你验收签字,改完三个月还会回访,看有没有新问题冒出来。 AI 给程序员提“代码重构建议”,干的就是这位改造师的活儿:先读懂代码的“构造图纸”(抽象语法树),再在全代码库“巡房”找出坏味道,开出可执行的改造处方,排好优先级,常驻在 IDE 和 CI 里,最后帮团队稳步还清技术债。这篇文章,就用“旧房改造”这条线,把 AI 重构建议的原理、检测、流程、排序、集成和落地实践一次讲透。

岗位关联

学会理解 AI 重构建议的生成逻辑,你就能在代码质量工具开发或团队重构规划中,准确筛选高价值建议、避免噪音干扰,成为团队里那个“最会提意见”的人。

目录
  1. 可视化演示
  2. 建议生成原理
  3. 坏味道识别
  4. 建议生成流程
  5. 质量与排序
  6. 工具链集成
  7. 落地实践
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示AI代码重构建议的完整流程:AST分析识别代码坏味道、LLM生成重构方案、质量评估排序与IDE集成。切换模式查看不同环节的核心机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

AST代码结构分析 抽象语法树将源码解析为树形结构,精确表示语法元素 检测重复代码、过深嵌套、过长函数、魔法数字等坏味道 AST = parse(source) AST分析确保重构建议不破坏代码正确性

建议生成原理

住久了的老房子,墙皮为什么鼓?得拆开看才知道是水管渗水还是地基问题。改造师的第一件事,是从物业调出构造图纸,弄清承重墙在哪、管线怎么走。AI 看代码也一样,它先要把源代码变成一份“构造图纸”——AST(抽象语法树,Abstract Syntax Tree),把“函数”“循环”“判断”这些结构变成一棵层次分明的树。有了这棵树,重复、嵌套、魔法数字这些“结构问题”就被钉死在坐标上,AI 才能开口提建议。

但图纸不知道人的感受:图纸看不出厨房动线让你每天多走 200 米,也看不出次卧不见阳光让你冬天心情低落。代码同理,AST 看不懂注释里的业务意图,看不懂这个变量为什么叫 retryCount 而不是 n。这时需要第二只眼:大模型。它像改造师的行业经验,能根据上下文、变量名、注释推断“这块代码原本想干什么”,判断该不该动。

靠谱的重构建议 = 结构确定性 + 语义灵活性。AST 负责“精确指认”,大模型负责“判断轻重”。例如“重复代码”不是一句感觉,而是两段 AST 子树的相似度超过阈值。设两段代码的结构标记集合为 A 和 B,用集合的交并比衡量相似度:

改造师看完图纸,心里有底才敢说“这面墙能拆”。AI 读完 AST、问过大模型,才敢把一条建议递到你面前。有了图纸眼和经验眼,这份建议才叫“靠谱”。

Sim(A,B)=∣A∩B∣∣A∪B∣\displaystyle \text{Sim}(A,B)=\frac{|A \cap B|}{|A \cup B|}
  1. A 与 B 是两段候选代码结构把两段代码分别拆成语法标记集合,每个标记是一个结构单元。
    A={func,for,if},B={func,for,if}A=\{\text{func}, \text{for}, \text{if}\}, \quad B=\{\text{func}, \text{for}, \text{if}\}
  2. A∩B 是共同结构两段代码中完全一致的标记个数,交集越大越像。
    ∣A∩B∣=相同结构标记数|A \cap B|=\text{相同结构标记数}
  3. A∪B 是全部结构两段代码去重后的总标记数,作为归一化分母,防止“都很大”误判。
    ∣A∪B∣=去重后总标记数|A \cup B|=\text{去重后总标记数}
  4. 比值判断是否重复Sim 越接近 1 越像,超过阈值(如 0.8)AI 就判定为重复代码。
    Sim(A,B)>0.8⇒标记为重复代码\text{Sim}(A,B)>0.8 \Rightarrow \text{标记为重复代码}

坏味道识别

改造师进房巡第一圈,手里的小本子会记下:墙皮起泡、窗框变形、楼梯扶手松动。这些不是“塌房级”大问题,但积累起来,住着就是不舒服。代码里也有这样的小本子,专业词叫“坏味道”(Code Smell)——不是 bug,但闻到就知道该打扫了。

坏味道有四大家族。第一,重复代码:同一段逻辑被复制粘贴了三回,改了一个忘了另外两个;第二,魔法数字:代码里凭空冒出 86400,只有老程序员知道那是“一天的秒数”;第三,过长函数:一个函数 200 行,看到一半忘了开头;第四,条件嵌套:if 套 for 再套 while,剥洋葱一样剥到流泪。

检测坏味道不能靠感觉,要靠可计算的指标。重复代码用相似度公式;魔法数字用 AST 遍历所有数字节点,排除 0、1、-1 和已命名的常量;过长函数统计 AST 节点规模或行数;嵌套深度统计 if/for/while 的最大层数。其中最综合的指标是圈复杂度,它把函数的“分支混乱程度”量化成一个数。控制流图中,边数 E、节点数 N、连通分量 P 与复杂度 M 的关系是:

病害清单写得越细,后头的处方越精准。AI 的坏味道清单每条都带行号、类型和严重度,就像改造师的本子上画着具体点位,施工队拿到就能干活。

M=E−N+2P\displaystyle M=E-N+2P
  1. M 是圈复杂度得分数值越大,分支越绕,越难读、越容易藏 bug。
    M=圈复杂度M=\text{圈复杂度}
  2. E 是控制流图的边数把函数画成流程图,每一条箭头都是一条边。
    E=控制流图的边E=\text{控制流图的边}
  3. N 是节点数每个顺序块、判断、循环收尾都是一个节点。
    N=控制流图的节点N=\text{控制流图的节点}
  4. P 是连通分量数正常函数只有一个入口一个出口,P 通常为 1。
    P=连通分量数(通常为 1)P=\text{连通分量数(通常为 1)}
  5. 阈值判断业内经验是 M 超过 10 就该拆函数,超过 20 基本是“代码雷区”。
    M>10⇒建议拆分函数M>10 \Rightarrow \text{建议拆分函数}

建议生成流程

改造师不会只丢给你一张“这里不行、那里不行”的问题清单,真正值钱的是处方:拆哪面墙、动哪根管、用什么材料、工期几天。AI 也一样,光说“这段代码不好”没人爱听,得给出“怎么改、改成什么样”。

一条靠谱的建议,要走完四步。第一步,解析预分析:AI 把代码建成 AST,跑一遍坏味道检测,拿到候选位置清单;第二步,语义推理裁剪:大模型读函数体,过滤掉“结构重复但语义上不能合并”的误报——比如两个同名方法属于不同业务,合了反而出事;第三步,建议模板生成:把验证过的位置套进“提取函数”“简化条件”“定义常量”这些模板里,生成带 diff 预览的具体建议;第四步,人工复核确认:工程师看 diff、跑测试,点头后建议才真正进入代码库。

AI 还会给每条建议附一个“靠谱概率”。核心思想是同时给“改”和“不改”打分,分差越大越自信。用 softmax 把两种打分压成概率,改的建议概率为:

改造师的处方不是写给自己看的,是给业主拍的板。AI 的建议也必须是“可审的”:有位置、有理由、有概率、有 diff。诊断 → 处方 → 确认三步咬合,才叫完整闭环。

P(ok)=exp⁡(sgood)exp⁡(sgood)+exp⁡(sbad)\displaystyle P(\text{ok})=\frac{\exp(s_{\text{good}})}{\exp(s_{\text{good}})+\exp(s_{\text{bad}})}
  1. s_good 是“改造方案”得分大模型评估重构后代码的语义质量,越高代表越合理。
    sgood=重构方案的语义得分s_{\text{good}}=\text{重构方案的语义得分}
  2. s_bad 是“保持原样”得分评估不改的合理性,两者分差越大,AI 越有把握开口。
    sbad=保持原状的语义得分s_{\text{bad}}=\text{保持原状的语义得分}
  3. exp 指数放大差异指数函数对正分数更友好,让小小的打分差变成明显的概率差。
    exp⁡(s)=指数加权权值\exp(s)=\text{指数加权权值}
  4. 比值得到建议置信度P(ok) 超过 0.7 的建议被标记为“高置信”,低于 0.5 则默认不展示。
    P(ok)>0.7⇒高置信建议P(\text{ok})>0.7 \Rightarrow \text{高置信建议}

质量与排序

改造师手里的清单会按红黄绿标色:屋顶漏水标红,明天就得修;墙纸翻新标黄,下个月再说;阳台加个花架标绿,有空再搞。AI 一次能提 50 条建议,不可能让工程师全都立刻改。排优先级是建议从“有用”到“真香”的分水岭。

排序主要看四样。影响范围:这条改动牵连多少个调用方?动了核心模块还是边缘工具?风险等级:改的是支付流程还是展示文案?修复成本:改一行还是重构三百行?收益大小:改完圈复杂度降多少、重复代码少几处?四个因素放一起,最该先做的自然浮出水面。

把这些因素压缩成一个分数,最省事的公式是“收益除以成本”,分子是影响范围与置信度的乘积,分母是修复成本加风险等级:

改造师让你先修漏水再换窗帘,不是嫌事小,是怕你预算花错地方。AI 排序的意义也正在此:把有限的 code review 时间,投给回报最高的那几处改动。

Priority=Impact×ConfidenceEffort+Risk\displaystyle \text{Priority}=\frac{\text{Impact}\times\text{Confidence}}{\text{Effort}+\text{Risk}}
  1. Impact 影响范围受影响的代码行数、调用函数数,范围越大越值得优先。
    Impact=影响行数与调用方规模\text{Impact}=\text{影响行数与调用方规模}
  2. Confidence 置信度沿用上一步算出的 P(ok),AI 越自信,建议越可执行。
    Confidence=P(ok)\text{Confidence}=P(\text{ok})
  3. Effort 修复成本预估的改动量,用户以人天或修改行数近似。
    Effort=预计工作量\text{Effort}=\text{预计工作量}
  4. Risk 风险等级改动后出回归 bug 的可能性,取值 0 到 1。
    Risk=风险等级∈[0,1]\text{Risk}=\text{风险等级}\in[0,1]
  5. 排序应用按 Priority 从大到小排列,前几条默认置顶展示给工程师。
    Priority∝收益成本\text{Priority} \propto \frac{\text{收益}}{\text{成本}}

工具链集成

改造师不能等房子塌了才出现,他最好常驻物业:平时巡楼、定期检查、有事随叫随到。AI 重构建议也一样,藏在网页里让人手动上传代码?没人会用。真正落地要靠“常驻”在工程师手边。

三个常驻位置。IDE 实时提示:你刚写完第 4 层 if,旁边就浮出“建议提前 return”,像物业巡楼看到消防通道堆了杂物当场提醒;CI 流水线检查:每次提交代码先跑一轮坏味道扫描,严重问题直接阻塞合并,像消防验收不过不给开业;一键自动修复:魔法数字、多余括号这种低风险问题直接生成 patch,工程师一行命令应用,像物业自带螺丝刀顺手拧紧松动的扶手。

但“常驻”最怕一件事:话太多。物业要是天天发 20 条“这里可以更好”,业主直接当骚扰电话拉黑。AI 也一样,误报太多,工程师会关掉整个插件。衡量“建议值不值得看”的核心指标是精确率——提的建议里有多少真正被采纳:

改造师常驻物业的底气是“专业、克制、说到点子上”。AI 集成进 IDE 和 CI 后,唯一的活路同样是少而准——宁可每天报 3 条好建议,也不要 30 条正确的废话。

Precision=TPTP+FP\displaystyle \text{Precision}=\frac{TP}{TP+FP}
  1. TP 是真阳性AI 提的建议中,工程师实际采纳并合入的数量。
    TP=被采纳的有用建议数TP=\text{被采纳的有用建议数}
  2. FP 是假阳性AI 提的建议中,被工程师忽略或否掉的噪音建议数。
    FP=被拒绝的噪音建议数FP=\text{被拒绝的噪音建议数}
  3. 比值是精确率精确率越高,说明工具越克制,每条建议都打在关键点上。
    Precision=有用建议全部建议\text{Precision}=\frac{\text{有用建议}}{\text{全部建议}}
  4. 调优策略精确率低于 0.5 时,调高严重度阈值、扩大白名单豁免范围。
    Precision<0.5⇒调阈值、加白名单\text{Precision}<0.5 \Rightarrow \text{调阈值、加白名单}

落地实践

最后说回整栋楼。有经验的物业绝不会一个周末把楼全拆了,而是分批:先修漏水最狠的 1 号楼,再改管道老化的 2 号楼,每批施工完验收,再开下一批。团队做代码重构,节奏也是这个道理。

第一步,重构路线规划:把坏味道清单按模块分组,挑出“收益高风险低”的模块当试点。第二步,渐进式重构:一次只动一个函数、一个文件,改完跑测试、合入、发布,绝不搞大爆炸式重写。第三步,效果度量:每次迭代后看复杂度降了多少、重复代码少了多少、测试通过率稳不稳,让进度看得见。用一个最简单朴素的指标衡量技术债偿还进度——已完成项除以总检测项:

改造这事儿,慢就是快。AI 负责把建议说得足够明白,团队负责把握节奏,指标负责反馈成效,三件事咬合好,老房子总有一天变成人人都羡慕的样子。代码库也终有技术债清零、人人愿意接手的一天。

Progress=∑resolved∑detected\displaystyle \text{Progress}=\frac{\sum \text{resolved}}{\sum \text{detected}}
  1. detected 是检测出的坏味道总量由全量扫描得到,是技术债的“本金”。
    ∑detected=坏味道总数\sum \text{detected}=\text{坏味道总数}
  2. resolved 是已完成整改数已合入并通过测试的重构项,是“已还本金”。
    ∑resolved=已完成重构数\sum \text{resolved}=\text{已完成重构数}
  3. 比值是完成率从 0 到 1,直观反映团队还欠多少“技术债”。
    Progress∈[0,1]\text{Progress}\in[0,1]
  4. 迭代对比每次版本发布后对比该指标,稳步上升说明节奏健康。
    Progress本次迭代>Progress上次迭代\text{Progress}_{\text{本次迭代}}>\text{Progress}_{\text{上次迭代}}

AI 应用场景

场景一:IDE 实时坏味道提示

阶段:代码理解与修复

解决的问题:传统 IDE 只做语法高亮和编译报错,发现不了“这段新函数和三天前提交的另一个函数 90% 相似”。AI 在后台持续解析 AST,趁开发正写代码时只报高价值的坏味道,避免代码写完才被发现要返工。

具体案例:后端工程师小王写订单处理函数时,IDE 提示“此函数与 3 小时前提交的 refund_order 相似度 0.86,建议提取公共方法”。小王一键预览 diff,确认后应用,顺手删掉了一段重复逻辑。

场景二:CI 流水线重构建议门禁

阶段:代码质量门禁

解决的问题:团队 code review 靠人眼,重复代码、魔法数字、过深嵌套经常漏进主干。AI 在 CI 里自动扫描整个 MR,把严重度高于阈值的建议置为“必须处理”,否则不允许合并。

具体案例:DevOps 在 GitLab CI 中接入坏味道扫描节点,每次 MR 自动生成建议报告;核心支付模块的嵌套深度超过 4 层直接阻塞合并,团队两周内把主干圈复杂度中位数从 18 降到 9。

场景三:技术债看板与重构路线规划

阶段:团队重构规划

解决的问题:重构优先级靠拍脑袋,大家各执一词。AI 对全代码库做一次完整扫描打分,自动生成技术债热力分布,让排期有数据支撑。

具体案例:技术经理用 AI 报告发现老订单系统的圈复杂度中位数 18,而新系统只有 5,于是排期三个版本逐步重构老模块;每次发布后用 Progress 指标对比,三个月后老模块的坏味道总量下降了 62%。

Python 演示

python103 行
import ast MAGIC_OK = {0, 1, -1}MAX_FUNC_NODES = 10MAX_NEST_DEPTH = 2  class SmellDetector(ast.NodeVisitor):    def __init__(self):        self.magic_lines = []        self.nest_lines = []        self.func_sizes = []        self.depth = 0     def visit_Constant(self, node):        if isinstance(node.value, (int, float)) and node.value not in MAGIC_OK:            self.magic_lines.append(node.lineno)        self.generic_visit(node)     def visit_If(self, node):        self._check_nest(node)        self.generic_visit(node)        self.depth -= 1     def visit_For(self, node):        self._check_nest(node)        self.generic_visit(node)        self.depth -= 1     def visit_While(self, node):        self._check_nest(node)        self.generic_visit(node)        self.depth -= 1     def visit_FunctionDef(self, node):        self.func_sizes.append((node.name, node.lineno, len(list(ast.walk(node)))))        self.generic_visit(node)     def _check_nest(self, node):        self.depth += 1        if self.depth > MAX_NEST_DEPTH:            self.nest_lines.append(node.lineno)  def build_smells(tree):    detector = SmellDetector()    detector.visit(tree)    smells = []     for name, lineno, size in detector.func_sizes:        if size > MAX_FUNC_NODES:            smells.append({                'type': '过长函数',                'line': lineno,                'target': name,                'suggestion': '将 {} 拆分为多个小函数'.format(name),                'impact': size,                'risk': 0.3            })     for lineno in detector.magic_lines:        smells.append({            'type': '魔法数字',            'line': lineno,            'target': '字面量',            'suggestion': '为第 {} 行的数字定义命名常量'.format(lineno),            'impact': 3,            'risk': 0.1        })     for lineno in detector.nest_lines:        smells.append({            'type': '嵌套过深',            'line': lineno,            'target': '条件/循环',            'suggestion': '第 {} 行建议提前返回或提取函数'.format(lineno),            'impact': 5,            'risk': 0.5        })     for s in smells:        s['score'] = round(s['impact'] / (1 + s['risk']), 2)    smells.sort(key=lambda s: s['score'], reverse=True)    return smells  if __name__ == '__main__':    demo_code = '''def process(data, size):    if len(data) > size:        for i in range(len(data)):            if data[i] > 1000:                while data[i] > 1000:                    data[i] = data[i] - 1000                print("capped", data[i])    total = 0    for i in range(len(data)):        total = total + data[i] * 2    return total + 365'''    tree = ast.parse(demo_code)    for item in build_smells(tree):        print(item['line'], item['type'], item['suggestion'], item['score'])
目的:用 Python 标准库 ast 实现一个迷你版“坏味道检测器”,解析源码找出魔法数字、嵌套过深和过长函数,并按影响与风险打分排序,输出重构建议。
  1. tree = ast.parse(demo_code)把源码字符串解析成 AST,这是整个检测的基础,相当于改造师拿到构造图纸。
  2. class SmellDetector(ast.NodeVisitor)继承 AST 遍历器,逐个访问语法节点,像一个巡房的改造师。
  3. if isinstance(node.value, (int, float)) and node.value not in MAGIC_OK:命中数字常量且不是 0/1/-1,记为魔法数字。
  4. self.func_sizes.append((node.name, node.lineno, len(list(ast.walk(node)))))用 AST 节点总数近似函数规模,数量越大函数越长。
  5. if self.depth > MAX_NEST_DEPTH:记录嵌套超过阈值的行号,越深的代码越难维护。
  6. 'suggestion': '将 {} 拆分为多个小函数'.format(name)命中坏味道后套用建议模板,生成可读的重构建议。
  7. s['score'] = round(s['impact'] / (1 + s['risk']), 2)用收益除以成本计算优先级分数,风险作为分母会拉低排序。
  8. smells.sort(key=lambda s: s['score'], reverse=True)按分数从高到低排序,让工程师先看到性价比最高的建议。

常见误区

误区很多初学者拿到 AI 的重构建议,觉得“机器都分析过了肯定没错”,直接点击“应用修复”,连 diff 都不看。

正解不对。AI 的建议基于结构和语义,但不知道你的业务约束——比如某个“重复函数”其实是两套不同的定价规则,合并了会出大事故。建议永远是改造师的“处方”,要不要动刀得业主(工程师)拍板。正确做法是看 diff、跑测试、确认没有破坏边界情况后再合入。

为何常见:AI 能给出精确的行号和理由,输出形式太像“权威结论”,初学者很容易被说服,忘了它只是辅助工具。

误区认为一个重构工具能报出 100 条建议,说明它分析能力很强,值得引入团队。

正解恰恰相反,噪音建议会摧毁信任。精确率低意味着工程师每天要人工过滤几十条废话,很快就干脆忽略工具。真正强的工具是“少报但报得准”,每条建议都带置信度和严重度,让工程师愿意认真对待。

为何常见:人们容易把“检出数量”误当成能力指标,忘了工具的目的是帮人做决策,而不是刷存在感。

误区以为解析出 AST 就能检测一切问题,包括“命名太差”“逻辑写反了”“注释过时”这类语义问题。

正解AST 只懂“结构”不懂“意图”。它能算出嵌套深度、重复子树,但看不出变量名叫 foo 是否合适、这个分支条件是否与业务相反。语义层面的坏味道要靠大模型兜底。两者是分工合作:图纸标出承重墙歪了,但写不出“这扇窗挡光”。

为何常见:AST 听起来“科学严谨”,大家容易高估结构化分析的能力,低估语义理解的难度。

误区认为 Priority 分数最高的建议就是最紧急、必须马上改的,照着做总没错。

正解排序分数只是按权重公式算出来的参考值,不是一个“真理排行榜”。不同团队权重不同:核心交易系统更重视风险,新业务模块更重视影响范围。而且分数会随代码变更动态变化,今天排第一的明天可能就不重要了。

为何常见:数字天然有“正确”的错觉,人们把排序结果当成事实而非建议,忽略了它背后是可配置的假设。

面试题

Q1. AI 分析代码结构时,最核心的中间表示是什么?

单选题 · easy

  • A.抽象语法树← 正确答案
  • B.数据库索引
  • C.编译日志
  • D.会话记录

答案:A。AST(抽象语法树)把源码变成层次化结构,AI 可以精确标注重复、嵌套、魔法数字的位置,相当于改造师手里的构造图纸。数据库索引、编译日志、会话记录都不承载代码的结构信息。

Q2. 下列哪一项不属于常见的代码坏味道?

单选题 · easy

  • A.重复代码
  • B.魔法数字
  • C.恰当命名← 正确答案
  • D.过长函数

答案:C。坏味道是代码里让人不舒服、容易积累问题的结构特征。重复代码、魔法数字、过长函数都是典型坏味道。“恰当命名”恰恰是消除坏味道的正确做法,它不是坏味道。

Q3. 圈复杂度公式 M=E-N+2P 中,P 代表什么?

单选题 · mid

  • A.分支个数
  • B.连通区域数← 正确答案
  • C.参数个数
  • D.函数个数

答案:B。P 是控制流图的连通分量数,正常函数通常 P=1。E 是边数,N 是节点数。P 增大说明代码存在多个独立出口或复杂路径,复杂度随之上升,与分支数、参数数、函数数无关。

Q4. 重构建议排序时,最不能忽略的因素是哪一项?

单选题 · mid

  • A.影响范围与风险← 正确答案
  • B.建议文本的长度
  • C.生成建议的时间
  • D.函数定义的位置

答案:A。排序的核心是“收益除以成本”。影响范围决定收益上限,风险决定改动的安全底线。建议文本长度、生成时间、函数位置都不影响一条建议是否值得优先处理。

Q5. 工具链中过滤“噪音建议”最常用的指标是?

单选题 · hard

  • A.精确率← 正确答案
  • B.召回率
  • C.吞吐量
  • D.内存占用

答案:A。精确率 = 有用的建议 ÷ 全部建议,衡量的是“提的建议靠谱比例”。噪音过滤要的是少报但报得准,所以精确率是核心。召回率只管漏没漏报,吞吐量和内存与建议质量无关。

Q6. 为什么检测重复代码常用 AST 子树相似度?

单选题 · single

  • A.子树结构基本一致← 正确答案
  • B.函数注释各不相同
  • C.机器读不懂源代码
  • D.无需解析即可判断

答案:A。重复代码意味着两段代码的语法结构几乎一样,AST 子树能把结构变成可比较的形状,相似度超过阈值即判定重复。注释不同、机器理解能力都与这种结构性判断关系不大。

Q7. AI 生成重构建议的流程包含哪些步骤?

多选题 · mid

  • A.代码解析← 正确答案
  • B.语义推理← 正确答案
  • C.随机生成
  • D.人工复核← 正确答案

答案:ABD。标准流程是:解析预分析(AST + 坏味道检测)、语义推理裁剪(大模型过滤误报)、模板生成建议、人工复核确认。随机生成不是流程的一部分,AI 的建议必须基于结构和语义分析,不能随机产生。

Q8. 以下哪个属于“魔法数字”?

单选题 · easy

  • A.定义良久的常量
  • B.裸写的数字 86400← 正确答案
  • C.循环中的变量 i
  • D.命名规范的函数名

答案:B。魔法数字指代码中直接出现的无注释、无命名的字面量,比如裸写的 86400,读者不知道它代表“一天的秒数”。已经定义的常量、循环变量和函数名都不是魔法数字。

Q9. 以下哪些做法能有效减少重构建议的噪音?

多选题 · hard

  • A.设定严重度阈值← 正确答案
  • B.增加白名单豁免← 正确答案
  • C.无视全部建议
  • D.按精确率调优← 正确答案

答案:ABD。设阈值能过滤低价值建议,白名单豁免能排除历史遗留或第三方代码,按精确率迭代调优能让工具越用越准。无视全部建议是放弃工具而不是减少噪音。

Q10. 渐进式重构相比一次性大重写的优点有哪些?

多选题 · mid

  • A.降低回归风险← 正确答案
  • B.快速获得反馈← 正确答案
  • C.一次性全部重写
  • D.团队逐步适应← 正确答案

答案:ABD。小步重构每次改动量小、回归范围可控,测试能快速反馈问题,团队也有时间逐步适应新结构。一次性全部重写正是要避免的“大爆炸式改造”,风险极高。