←

AI 编程时代,为什么代码重构越来越重要?

Why Code Refactoring Matters More Than Ever in the AI Programming Era
📄 文章 🌐 公开 👁 21 次
📋 列表 ✏️ 编辑 🎨 画布版 📋 复制MD 🌐 复制HTML ☆ 收藏 🔊 TTS 🔗 复制链接

AI 编程时代,为什么代码重构越来越重要?

很多人使用 AI 编程时,都会遇到一种情况:刚开始开发很快,增加功能也很快,但随着项目不断迭代,代码逐渐变得混乱。一个功能修改完,又出现新的问题;同样的逻辑散落在多个文件里;一个类越来越大,连 AI 自己都需要反复阅读才能弄清楚代码的作用。

这时候,我们往往会继续让 AI 修复问题、增加判断、补充代码。短期看,软件还在不断进步;长期看,代码却可能越来越难维护。

这正是 AI 编程容易忽视的一个问题:生成代码的速度提高了,不代表维护软件的成本也降低了。

解决这个问题的重要方法之一,就是代码重构。

一、什么是代码重构?

代码重构,简单来说,就是在不改变软件原有功能和外部行为的前提下,改善代码内部的组织结构,让代码更容易理解、修改、测试和扩展。

举个简单的例子。

假设一个软件需要完成三件事:读取图片、检测缺陷、显示结果。最初,AI 可能直接把这些逻辑全部写在一个方法里:

void ProcessImage(string path)
{
    // 读取图片
    // 检查图片是否有效
    // 加载检测模型
    // 执行缺陷检测
    // 处理检测结果
    // 更新界面
    // 保存检测记录
}

刚开始,这样写完全可以运行。但随着功能增加,这个方法可能变成几百行,包含大量条件判断、异常处理和特殊情况。

以后想更换检测模型,可能影响图片处理;想调整界面,可能误改检测逻辑;想单独测试算法,也很困难。

重构后,可以将职责拆开:

var image = imageService.Load(path);
var result = detector.Detect(image);
resultView.Display(result);

图片读取、缺陷检测和结果展示分别由不同模块负责。

注意,这只是简化示例。真正的重构还需要考虑异常处理、资源释放、数据类型、线程安全以及原有功能是否保持一致。

重构的价值并不是代码行数减少了,而是每个模块的职责更加明确,修改一个功能时,不必担心牵连整个系统。

二、为什么 AI 编程尤其需要代码重构?

传统软件开发同样需要重构,但 AI 编程有一些值得特别注意的地方。

1. AI 容易解决眼前的问题,却忽略长期结构

当你告诉 AI“修复这个 Bug”,它通常会围绕当前问题寻找解决办法。如果原有代码结构不合理,AI 可能继续增加条件判断、辅助方法或特殊分支,而不是先调整整体设计。

例如:

  • 第一次修复:增加一个判断。
  • 第二次修复:增加一个例外处理。
  • 第三次修复:增加一个状态变量。
  • 第四次修复:发现前面三个修改互相影响,又增加补丁。

每次修改都可能有局部合理性,但叠加之后,整体结构可能变得越来越复杂。

这并不意味着 AI 一定会写出糟糕的代码,而是说明:如果开发任务只要求完成功能,没有明确要求维护代码质量,长期结构就容易被忽略。

2. 代码越乱,AI 后续修改的难度越大

AI 修改代码,需要理解已有实现、调用关系、数据结构和业务规则。

如果这些内容分散在几十个文件里,存在重复实现和隐含依赖,AI 就更容易遗漏某个调用方,或者误解一个变量的真实含义。

重构可以通过明确模块边界、统一数据结构、减少重复逻辑,降低后续修改的理解成本。

但要注意,重构并不能自动保证 AI 不犯错。复杂项目依然需要测试、代码审查和版本控制。

3. 功能开发越快,技术债务可能积累得越快

所谓技术债务,就是为了快速实现当前目标,而留下的、会增加未来维护成本的设计或实现问题。

快速增加功能

重复代码、复杂依赖、特殊分支逐渐增加

每次修改需要理解更多上下文

开发速度下降,回归错误增加

如果一直不治理技术债务,AI 可能从最初的开发加速器,逐渐变成不断修补复杂代码的工具。

反过来,如果定期重构,就有机会把快速开发的优势长期保留下来。

三、代码重构有哪些实际好处?

Keeping code simple: moving fast by avoiding over-engineering

好处一:降低后续开发成本

模块职责明确后,增加新功能时更容易定位修改范围,减少无关代码的阅读和修改。

Close-up of software developer pointing at source code on large monitor, reviewing programming details and debugging software issues to improve system reliability and development workflow.

好处二:更容易排查 Bug

数据从哪里来、经过哪些处理、在哪里出现异常,都更容易追踪。

Building an Enterprise-Ready SonarCloud Dashboard with Streamlit & Azure - DEV Community

好处三:提高测试效率

独立模块更容易单独测试,问题也更容易被定位到具体职责。

C4架构图-组件图-代码分层图 流程图模板_ProcessOn思维导图、流程图

好处四:让软件更容易扩展

更换算法、存储方式或界面时,如果模块边界合理,就不必重写整个系统。

AI Colleague Is Not Just An AI Fixer

好处五:提高 AI 的持续开发能力

AI 更容易理解清晰的代码结构,后续任务也更容易被分解为边界明确的小任务。

需要强调的是,重构本身也要投入时间。拆分过度、抽象过多、引入不必要的设计模式,反而可能让代码更难理解。因此,重构追求的是降低整体维护成本,而不是追求复杂的架构或更多的类。

四、除了重构代码,还应该使用哪些工具?

这是很重要的一点。

当软件越来越复杂时,单纯让 AI 阅读源代码并不总是最佳方案。流程图、数据流图、模块依赖图和调用关系图,可以把隐藏在代码里的结构显式表达出来。

它们解决的是不同问题,不能互相完全替代。

DAG vs. Autonomous Agents vs. Micro-Agents + LLM-Assisted DAG Planning | by Avi Goldfinger | Medium

1. 流程图:程序是怎样运行的?

适合描述执行步骤、条件分支、循环和异常处理。

例如:图片导入 → 格式检查 → 模型检测 → 判断是否存在缺陷 → 输出结果。

适用场景: 复杂业务流程、状态处理、算法步骤、异常分支。

Data Flow Diagram (DFD)

2. 数据流图:数据从哪里来,又去了哪里?

适合描述数据的输入、处理、存储、传递和输出。

例如:原始图片 → 图像预处理 → 检测模型 → 缺陷坐标与置信度 → 结果数据库和显示界面。

适用场景: 图像处理、AI 推理、数据分析、文件转换、训练流水线。

Layered Architecture - Junhyunny’s Devlogs

3. 模块依赖图:哪些模块依赖哪些模块?

用节点表示模块,用箭头表示依赖关系。可以发现循环依赖、依赖过多的核心类,以及不合理的跨层调用。

适用场景: 大型项目、拆分类、调整架构、识别高耦合模块。

Sequence Diagram

4. 调用时序图:一次操作具体调用了谁?

按时间顺序展示对象或服务之间的调用与返回。

适用场景: 异步任务、线程通信、API 调用、事件系统和复杂 Bug 排查。

这几种图有什么区别?

工具 主要回答的问题 最适合发现的问题
流程图 程序怎么走? 分支遗漏、流程重复、异常路径不清楚
数据流图 数据怎么走? 数据丢失、重复转换、状态不一致
模块依赖图 模块怎么连接? 循环依赖、职责混乱、耦合过高
调用时序图 一次操作怎么执行? 调用顺序错误、异步问题、接口协作异常

这些图不一定要全部绘制。应该根据问题选择工具,而不是为了文档齐全而增加维护负担。

五、用一个真实的软件场景理解这些图的价值

假设我们正在开发一个轮胎表面缺陷检测软件,包含图像读取、预处理、模型推理、缺陷标注和结果保存。

1. 先看流程图

流程图(ChatGPT 已渲染过的 SVG 源代码,无法再编译)

#chatgpt-mermaid-_rkr\{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:16px;fill:rgb(237, 237, 237);}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#chatgpt-mermaid-_rkr\ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#chatgpt-mermaid-_rkr\ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#chatgpt-mermaid-_rkr\ .error-icon{fill:rgb(48, 48, 48);}#chatgpt-mermaid-_rkr\ .error-text{fill:rgb(237, 237, 237);stroke:rgb(237, 237, 237);}#chatgpt-mermaid-_rkr\ .edge-thickness-normal{stroke-width:1px;}#chatgpt-mermaid-_rkr\ .edge-thickness-thick{stroke-width:3.5px;}#chatgpt-mermaid-_rkr\ .edge-pattern-solid{stroke-dasharray:0;}#chatgpt-mermaid-_rkr\ .edge-thickness-invisible{stroke-width:0;fill:none;}#chatgpt-mermaid-_rkr\ .edge-pattern-dashed{stroke-dasharray:3;}#chatgpt-mermaid-_rkr\ .edge-pattern-dotted{stroke-dasharray:2;}#chatgpt-mermaid-_rkr\ .marker{fill:rgb(175, 175, 175);stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rkr\ .marker.cross{stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rkr\ svg{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:16px;}#chatgpt-mermaid-_rkr\ p{margin:0;}#chatgpt-mermaid-_rkr\ .label{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";color:rgb(237, 237, 237);}#chatgpt-mermaid-_rkr\ .cluster-label text{fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rkr\ .cluster-label span{color:rgb(237, 237, 237);}#chatgpt-mermaid-_rkr\ .cluster-label span p{background-color:transparent;}#chatgpt-mermaid-_rkr\ .label text,#chatgpt-mermaid-_rkr\ span{fill:rgb(237, 237, 237);color:rgb(237, 237, 237);}#chatgpt-mermaid-_rkr\ .node rect,#chatgpt-mermaid-_rkr\ .node circle,#chatgpt-mermaid-_rkr\ .node ellipse,#chatgpt-mermaid-_rkr\ .node polygon,#chatgpt-mermaid-_rkr\ .node path{fill:rgb(9, 23, 44);stroke:rgb(31, 78, 148);stroke-width:1px;}#chatgpt-mermaid-_rkr\ .rough-node .label text,#chatgpt-mermaid-_rkr\ .node .label text,#chatgpt-mermaid-_rkr\ .image-shape .label,#chatgpt-mermaid-_rkr\ .icon-shape .label{text-anchor:middle;}#chatgpt-mermaid-_rkr\ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#chatgpt-mermaid-_rkr\ .rough-node .label,#chatgpt-mermaid-_rkr\ .node .label,#chatgpt-mermaid-_rkr\ .image-shape .label,#chatgpt-mermaid-_rkr\ .icon-shape .label{text-align:center;}#chatgpt-mermaid-_rkr\ .node.clickable{cursor:pointer;}#chatgpt-mermaid-_rkr\ .root .anchor path{fill:rgb(175, 175, 175)!important;stroke-width:0;stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rkr\ .arrowheadPath{fill:rgb(175, 175, 175);}#chatgpt-mermaid-_rkr\ .edgePath .path{stroke:rgb(175, 175, 175);stroke-width:1px;}#chatgpt-mermaid-_rkr\ .flowchart-link{stroke:rgb(175, 175, 175);fill:none;}#chatgpt-mermaid-_rkr\ .edgeLabel{background-color:rgb(0, 0, 0);text-align:center;}#chatgpt-mermaid-_rkr\ .edgeLabel p{background-color:rgb(0, 0, 0);}#chatgpt-mermaid-_rkr\ .edgeLabel rect{opacity:0.5;background-color:rgb(0, 0, 0);fill:rgb(0, 0, 0);}#chatgpt-mermaid-_rkr\ .labelBkg{background-color:rgba(0, 0, 0, 0.5);}#chatgpt-mermaid-_rkr\ .cluster rect{fill:rgb(48, 48, 48);stroke:rgba(255, 255, 255, 0.15);stroke-width:1px;}#chatgpt-mermaid-_rkr\ .cluster text{fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rkr\ .cluster span{color:rgb(237, 237, 237);}#chatgpt-mermaid-_rkr\ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:12px;background:rgb(48, 48, 48);border:1px solid rgba(255, 255, 255, 0.15);border-radius:2px;pointer-events:none;z-index:100;}#chatgpt-mermaid-_rkr\ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rkr\ rect.text{fill:none;stroke-width:0;}#chatgpt-mermaid-_rkr\ .icon-shape,#chatgpt-mermaid-_rkr\ .image-shape{background-color:rgb(0, 0, 0);text-align:center;}#chatgpt-mermaid-_rkr\ .icon-shape p,#chatgpt-mermaid-_rkr\ .image-shape p{background-color:rgb(0, 0, 0);padding:2px;}#chatgpt-mermaid-_rkr\ .icon-shape .label rect,#chatgpt-mermaid-_rkr\ .image-shape .label rect{opacity:0.5;background-color:rgb(0, 0, 0);fill:rgb(0, 0, 0);}#chatgpt-mermaid-_rkr\ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#chatgpt-mermaid-_rkr\ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#chatgpt-mermaid-_rkr\ .node .neo-node{stroke:rgb(31, 78, 148);}#chatgpt-mermaid-_rkr\ [data-look="neo"].node rect,#chatgpt-mermaid-_rkr\ [data-look="neo"].cluster rect,#chatgpt-mermaid-_rkr\ [data-look="neo"].node polygon{stroke:url(#chatgpt-mermaid-_rkr\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rkr\ [data-look="neo"].swimlane.cluster rect{filter:none;}#chatgpt-mermaid-_rkr\ [data-look="neo"].node path{stroke:url(#chatgpt-mermaid-_rkr\-gradient);stroke-width:1px;}#chatgpt-mermaid-_rkr\ [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rkr\ [data-look="neo"].node .neo-line path{stroke:rgb(31, 78, 148);filter:none;}#chatgpt-mermaid-_rkr\ [data-look="neo"].node circle{stroke:url(#chatgpt-mermaid-_rkr\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rkr\ [data-look="neo"].node circle .state-start{fill:#000000;}#chatgpt-mermaid-_rkr\ [data-look="neo"].icon-shape .icon{fill:url(#chatgpt-mermaid-_rkr\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rkr\ [data-look="neo"].icon-shape .icon-neo path{stroke:url(#chatgpt-mermaid-_rkr\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rkr\ .node text{font-size:14px;font-weight:600;letter-spacing:normal;fill:rgb(153, 206, 255);}#chatgpt-mermaid-_rkr\ .edgeLabels text{font-size:13px;font-weight:600;letter-spacing:-0.08px;fill:rgb(153, 206, 255);}#chatgpt-mermaid-_rkr\ .node tspan[font-weight="normal"],#chatgpt-mermaid-_rkr\ .edgeLabels tspan[font-weight="normal"]{font-weight:600;}#chatgpt-mermaid-_rkr\ .edgeLabel .label rect{opacity:1;rx:13px;ry:13px;fill:rgb(0, 14, 26);stroke:rgb(26, 62, 95);stroke-width:1px;}#chatgpt-mermaid-_rkr\ .node rect,#chatgpt-mermaid-_rkr\ .node circle,#chatgpt-mermaid-_rkr\ .node ellipse,#chatgpt-mermaid-_rkr\ .node polygon,#chatgpt-mermaid-_rkr\ .node path{fill:rgb(0, 40, 77);stroke:rgba(255, 255, 255, 0.1);stroke-width:1px;}#chatgpt-mermaid-_rkr\ .node rect{rx:16px;ry:16px;}#chatgpt-mermaid-_rkr\ .node.mermaid-decision .label-container{fill:rgb(0, 14, 26);stroke:rgb(26, 62, 95);stroke-dasharray:2,2;}#chatgpt-mermaid-_rkr\ .edgePaths .flowchart-link{stroke:rgb(175, 175, 175);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;}#chatgpt-mermaid-_rkr\ .marker{fill:rgb(175, 175, 175);stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rkr\ :root{--mermaid-font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";}导入轮胎图片图片有效?提示错误并记录日志图像预处理模型推理检测到缺陷?生成缺陷标注生成正常结果显示并保存结果否是是否

通过流程图,我们可能发现:正常结果和缺陷结果最终都需要保存,如果两条分支分别编写保存逻辑,就可能产生重复代码。

重构时,可以将两条分支统一为标准的检测结果对象,再交给同一个结果处理模块。

2. 再看数据流图

流程图(ChatGPT 已渲染过的 SVG 源代码,无法再编译)

#chatgpt-mermaid-_rl4\{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:16px;fill:rgb(237, 237, 237);}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#chatgpt-mermaid-_rl4\ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#chatgpt-mermaid-_rl4\ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#chatgpt-mermaid-_rl4\ .error-icon{fill:rgb(48, 48, 48);}#chatgpt-mermaid-_rl4\ .error-text{fill:rgb(237, 237, 237);stroke:rgb(237, 237, 237);}#chatgpt-mermaid-_rl4\ .edge-thickness-normal{stroke-width:1px;}#chatgpt-mermaid-_rl4\ .edge-thickness-thick{stroke-width:3.5px;}#chatgpt-mermaid-_rl4\ .edge-pattern-solid{stroke-dasharray:0;}#chatgpt-mermaid-_rl4\ .edge-thickness-invisible{stroke-width:0;fill:none;}#chatgpt-mermaid-_rl4\ .edge-pattern-dashed{stroke-dasharray:3;}#chatgpt-mermaid-_rl4\ .edge-pattern-dotted{stroke-dasharray:2;}#chatgpt-mermaid-_rl4\ .marker{fill:rgb(175, 175, 175);stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rl4\ .marker.cross{stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rl4\ svg{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:16px;}#chatgpt-mermaid-_rl4\ p{margin:0;}#chatgpt-mermaid-_rl4\ .label{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";color:rgb(237, 237, 237);}#chatgpt-mermaid-_rl4\ .cluster-label text{fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rl4\ .cluster-label span{color:rgb(237, 237, 237);}#chatgpt-mermaid-_rl4\ .cluster-label span p{background-color:transparent;}#chatgpt-mermaid-_rl4\ .label text,#chatgpt-mermaid-_rl4\ span{fill:rgb(237, 237, 237);color:rgb(237, 237, 237);}#chatgpt-mermaid-_rl4\ .node rect,#chatgpt-mermaid-_rl4\ .node circle,#chatgpt-mermaid-_rl4\ .node ellipse,#chatgpt-mermaid-_rl4\ .node polygon,#chatgpt-mermaid-_rl4\ .node path{fill:rgb(9, 23, 44);stroke:rgb(31, 78, 148);stroke-width:1px;}#chatgpt-mermaid-_rl4\ .rough-node .label text,#chatgpt-mermaid-_rl4\ .node .label text,#chatgpt-mermaid-_rl4\ .image-shape .label,#chatgpt-mermaid-_rl4\ .icon-shape .label{text-anchor:middle;}#chatgpt-mermaid-_rl4\ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#chatgpt-mermaid-_rl4\ .rough-node .label,#chatgpt-mermaid-_rl4\ .node .label,#chatgpt-mermaid-_rl4\ .image-shape .label,#chatgpt-mermaid-_rl4\ .icon-shape .label{text-align:center;}#chatgpt-mermaid-_rl4\ .node.clickable{cursor:pointer;}#chatgpt-mermaid-_rl4\ .root .anchor path{fill:rgb(175, 175, 175)!important;stroke-width:0;stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rl4\ .arrowheadPath{fill:rgb(175, 175, 175);}#chatgpt-mermaid-_rl4\ .edgePath .path{stroke:rgb(175, 175, 175);stroke-width:1px;}#chatgpt-mermaid-_rl4\ .flowchart-link{stroke:rgb(175, 175, 175);fill:none;}#chatgpt-mermaid-_rl4\ .edgeLabel{background-color:rgb(0, 0, 0);text-align:center;}#chatgpt-mermaid-_rl4\ .edgeLabel p{background-color:rgb(0, 0, 0);}#chatgpt-mermaid-_rl4\ .edgeLabel rect{opacity:0.5;background-color:rgb(0, 0, 0);fill:rgb(0, 0, 0);}#chatgpt-mermaid-_rl4\ .labelBkg{background-color:rgba(0, 0, 0, 0.5);}#chatgpt-mermaid-_rl4\ .cluster rect{fill:rgb(48, 48, 48);stroke:rgba(255, 255, 255, 0.15);stroke-width:1px;}#chatgpt-mermaid-_rl4\ .cluster text{fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rl4\ .cluster span{color:rgb(237, 237, 237);}#chatgpt-mermaid-_rl4\ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:12px;background:rgb(48, 48, 48);border:1px solid rgba(255, 255, 255, 0.15);border-radius:2px;pointer-events:none;z-index:100;}#chatgpt-mermaid-_rl4\ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rl4\ rect.text{fill:none;stroke-width:0;}#chatgpt-mermaid-_rl4\ .icon-shape,#chatgpt-mermaid-_rl4\ .image-shape{background-color:rgb(0, 0, 0);text-align:center;}#chatgpt-mermaid-_rl4\ .icon-shape p,#chatgpt-mermaid-_rl4\ .image-shape p{background-color:rgb(0, 0, 0);padding:2px;}#chatgpt-mermaid-_rl4\ .icon-shape .label rect,#chatgpt-mermaid-_rl4\ .image-shape .label rect{opacity:0.5;background-color:rgb(0, 0, 0);fill:rgb(0, 0, 0);}#chatgpt-mermaid-_rl4\ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#chatgpt-mermaid-_rl4\ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#chatgpt-mermaid-_rl4\ .node .neo-node{stroke:rgb(31, 78, 148);}#chatgpt-mermaid-_rl4\ [data-look="neo"].node rect,#chatgpt-mermaid-_rl4\ [data-look="neo"].cluster rect,#chatgpt-mermaid-_rl4\ [data-look="neo"].node polygon{stroke:url(#chatgpt-mermaid-_rl4\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rl4\ [data-look="neo"].swimlane.cluster rect{filter:none;}#chatgpt-mermaid-_rl4\ [data-look="neo"].node path{stroke:url(#chatgpt-mermaid-_rl4\-gradient);stroke-width:1px;}#chatgpt-mermaid-_rl4\ [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rl4\ [data-look="neo"].node .neo-line path{stroke:rgb(31, 78, 148);filter:none;}#chatgpt-mermaid-_rl4\ [data-look="neo"].node circle{stroke:url(#chatgpt-mermaid-_rl4\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rl4\ [data-look="neo"].node circle .state-start{fill:#000000;}#chatgpt-mermaid-_rl4\ [data-look="neo"].icon-shape .icon{fill:url(#chatgpt-mermaid-_rl4\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rl4\ [data-look="neo"].icon-shape .icon-neo path{stroke:url(#chatgpt-mermaid-_rl4\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rl4\ .node text{font-size:14px;font-weight:600;letter-spacing:normal;fill:rgb(153, 206, 255);}#chatgpt-mermaid-_rl4\ .edgeLabels text{font-size:13px;font-weight:600;letter-spacing:-0.08px;fill:rgb(153, 206, 255);}#chatgpt-mermaid-_rl4\ .node tspan[font-weight="normal"],#chatgpt-mermaid-_rl4\ .edgeLabels tspan[font-weight="normal"]{font-weight:600;}#chatgpt-mermaid-_rl4\ .edgeLabel .label rect{opacity:1;rx:13px;ry:13px;fill:rgb(0, 14, 26);stroke:rgb(26, 62, 95);stroke-width:1px;}#chatgpt-mermaid-_rl4\ .node rect,#chatgpt-mermaid-_rl4\ .node circle,#chatgpt-mermaid-_rl4\ .node ellipse,#chatgpt-mermaid-_rl4\ .node polygon,#chatgpt-mermaid-_rl4\ .node path{fill:rgb(0, 40, 77);stroke:rgba(255, 255, 255, 0.1);stroke-width:1px;}#chatgpt-mermaid-_rl4\ .node rect{rx:16px;ry:16px;}#chatgpt-mermaid-_rl4\ .node.mermaid-decision .label-container{fill:rgb(0, 14, 26);stroke:rgb(26, 62, 95);stroke-dasharray:2,2;}#chatgpt-mermaid-_rl4\ .edgePaths .flowchart-link{stroke:rgb(175, 175, 175);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;}#chatgpt-mermaid-_rl4\ .marker{fill:rgb(175, 175, 175);stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rl4\ :root{--mermaid-font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";}原始图片图像读取预处理图像检测模型标准化检测结果结果展示结果存储统计分析

这里的重要发现是:展示、存储和统计都使用同一份标准化结果。

假如过去每个模块都自行解析模型输出,那么更换模型时,三个模块都可能需要修改。

如果增加统一的结果转换层,只要新模型能够转换成标准格式,其他模块就可能不需要改动。

这就是数据流设计带来的实际收益。

3. 最后看模块依赖图

流程图(ChatGPT 已渲染过的 SVG 源代码,无法再编译)

#chatgpt-mermaid-_rld\{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:16px;fill:rgb(237, 237, 237);}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#chatgpt-mermaid-_rld\ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#chatgpt-mermaid-_rld\ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#chatgpt-mermaid-_rld\ .error-icon{fill:rgb(48, 48, 48);}#chatgpt-mermaid-_rld\ .error-text{fill:rgb(237, 237, 237);stroke:rgb(237, 237, 237);}#chatgpt-mermaid-_rld\ .edge-thickness-normal{stroke-width:1px;}#chatgpt-mermaid-_rld\ .edge-thickness-thick{stroke-width:3.5px;}#chatgpt-mermaid-_rld\ .edge-pattern-solid{stroke-dasharray:0;}#chatgpt-mermaid-_rld\ .edge-thickness-invisible{stroke-width:0;fill:none;}#chatgpt-mermaid-_rld\ .edge-pattern-dashed{stroke-dasharray:3;}#chatgpt-mermaid-_rld\ .edge-pattern-dotted{stroke-dasharray:2;}#chatgpt-mermaid-_rld\ .marker{fill:rgb(175, 175, 175);stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rld\ .marker.cross{stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rld\ svg{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:16px;}#chatgpt-mermaid-_rld\ p{margin:0;}#chatgpt-mermaid-_rld\ .label{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";color:rgb(237, 237, 237);}#chatgpt-mermaid-_rld\ .cluster-label text{fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rld\ .cluster-label span{color:rgb(237, 237, 237);}#chatgpt-mermaid-_rld\ .cluster-label span p{background-color:transparent;}#chatgpt-mermaid-_rld\ .label text,#chatgpt-mermaid-_rld\ span{fill:rgb(237, 237, 237);color:rgb(237, 237, 237);}#chatgpt-mermaid-_rld\ .node rect,#chatgpt-mermaid-_rld\ .node circle,#chatgpt-mermaid-_rld\ .node ellipse,#chatgpt-mermaid-_rld\ .node polygon,#chatgpt-mermaid-_rld\ .node path{fill:rgb(9, 23, 44);stroke:rgb(31, 78, 148);stroke-width:1px;}#chatgpt-mermaid-_rld\ .rough-node .label text,#chatgpt-mermaid-_rld\ .node .label text,#chatgpt-mermaid-_rld\ .image-shape .label,#chatgpt-mermaid-_rld\ .icon-shape .label{text-anchor:middle;}#chatgpt-mermaid-_rld\ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#chatgpt-mermaid-_rld\ .rough-node .label,#chatgpt-mermaid-_rld\ .node .label,#chatgpt-mermaid-_rld\ .image-shape .label,#chatgpt-mermaid-_rld\ .icon-shape .label{text-align:center;}#chatgpt-mermaid-_rld\ .node.clickable{cursor:pointer;}#chatgpt-mermaid-_rld\ .root .anchor path{fill:rgb(175, 175, 175)!important;stroke-width:0;stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rld\ .arrowheadPath{fill:rgb(175, 175, 175);}#chatgpt-mermaid-_rld\ .edgePath .path{stroke:rgb(175, 175, 175);stroke-width:1px;}#chatgpt-mermaid-_rld\ .flowchart-link{stroke:rgb(175, 175, 175);fill:none;}#chatgpt-mermaid-_rld\ .edgeLabel{background-color:rgb(0, 0, 0);text-align:center;}#chatgpt-mermaid-_rld\ .edgeLabel p{background-color:rgb(0, 0, 0);}#chatgpt-mermaid-_rld\ .edgeLabel rect{opacity:0.5;background-color:rgb(0, 0, 0);fill:rgb(0, 0, 0);}#chatgpt-mermaid-_rld\ .labelBkg{background-color:rgba(0, 0, 0, 0.5);}#chatgpt-mermaid-_rld\ .cluster rect{fill:rgb(48, 48, 48);stroke:rgba(255, 255, 255, 0.15);stroke-width:1px;}#chatgpt-mermaid-_rld\ .cluster text{fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rld\ .cluster span{color:rgb(237, 237, 237);}#chatgpt-mermaid-_rld\ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:12px;background:rgb(48, 48, 48);border:1px solid rgba(255, 255, 255, 0.15);border-radius:2px;pointer-events:none;z-index:100;}#chatgpt-mermaid-_rld\ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rld\ rect.text{fill:none;stroke-width:0;}#chatgpt-mermaid-_rld\ .icon-shape,#chatgpt-mermaid-_rld\ .image-shape{background-color:rgb(0, 0, 0);text-align:center;}#chatgpt-mermaid-_rld\ .icon-shape p,#chatgpt-mermaid-_rld\ .image-shape p{background-color:rgb(0, 0, 0);padding:2px;}#chatgpt-mermaid-_rld\ .icon-shape .label rect,#chatgpt-mermaid-_rld\ .image-shape .label rect{opacity:0.5;background-color:rgb(0, 0, 0);fill:rgb(0, 0, 0);}#chatgpt-mermaid-_rld\ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#chatgpt-mermaid-_rld\ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#chatgpt-mermaid-_rld\ .node .neo-node{stroke:rgb(31, 78, 148);}#chatgpt-mermaid-_rld\ [data-look="neo"].node rect,#chatgpt-mermaid-_rld\ [data-look="neo"].cluster rect,#chatgpt-mermaid-_rld\ [data-look="neo"].node polygon{stroke:url(#chatgpt-mermaid-_rld\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rld\ [data-look="neo"].swimlane.cluster rect{filter:none;}#chatgpt-mermaid-_rld\ [data-look="neo"].node path{stroke:url(#chatgpt-mermaid-_rld\-gradient);stroke-width:1px;}#chatgpt-mermaid-_rld\ [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rld\ [data-look="neo"].node .neo-line path{stroke:rgb(31, 78, 148);filter:none;}#chatgpt-mermaid-_rld\ [data-look="neo"].node circle{stroke:url(#chatgpt-mermaid-_rld\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rld\ [data-look="neo"].node circle .state-start{fill:#000000;}#chatgpt-mermaid-_rld\ [data-look="neo"].icon-shape .icon{fill:url(#chatgpt-mermaid-_rld\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rld\ [data-look="neo"].icon-shape .icon-neo path{stroke:url(#chatgpt-mermaid-_rld\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rld\ .node text{font-size:14px;font-weight:600;letter-spacing:normal;fill:rgb(153, 206, 255);}#chatgpt-mermaid-_rld\ .edgeLabels text{font-size:13px;font-weight:600;letter-spacing:-0.08px;fill:rgb(153, 206, 255);}#chatgpt-mermaid-_rld\ .node tspan[font-weight="normal"],#chatgpt-mermaid-_rld\ .edgeLabels tspan[font-weight="normal"]{font-weight:600;}#chatgpt-mermaid-_rld\ .edgeLabel .label rect{opacity:1;rx:13px;ry:13px;fill:rgb(0, 14, 26);stroke:rgb(26, 62, 95);stroke-width:1px;}#chatgpt-mermaid-_rld\ .node rect,#chatgpt-mermaid-_rld\ .node circle,#chatgpt-mermaid-_rld\ .node ellipse,#chatgpt-mermaid-_rld\ .node polygon,#chatgpt-mermaid-_rld\ .node path{fill:rgb(0, 40, 77);stroke:rgba(255, 255, 255, 0.1);stroke-width:1px;}#chatgpt-mermaid-_rld\ .node rect{rx:16px;ry:16px;}#chatgpt-mermaid-_rld\ .node.mermaid-decision .label-container{fill:rgb(0, 14, 26);stroke:rgb(26, 62, 95);stroke-dasharray:2,2;}#chatgpt-mermaid-_rld\ .edgePaths .flowchart-link{stroke:rgb(175, 175, 175);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;}#chatgpt-mermaid-_rld\ .marker{fill:rgb(175, 175, 175);stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rld\ :root{--mermaid-font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";}界面层业务协调层图像处理模块检测模块结果处理模块数据存储模块结果展示接口

如果原来的检测模块直接操作界面控件、修改数据库,又负责图片预处理,那么它的职责就过多了。

将这些职责逐步分离之后,更换检测算法时,就可以减少对界面和存储模块的影响。

这里需要注意:图中的依赖方向只是一个示例,不是所有项目都必须采用完全相同的结构。具体设计还应结合项目规模、性能要求和已有代码决定。

六、怎样让 AI 根据这些图来重构代码?

一个很实用的方法是:先让 AI 理解系统,再让 AI 修改系统。

不要一上来就说“帮我把整个项目重构得更优雅”。这样的要求太宽泛,AI 可能做出大量难以验证的修改。

可以把工作拆成以下流程。

流程图(ChatGPT 已渲染过的 SVG 源代码,无法再编译)

#chatgpt-mermaid-_rlm\{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:16px;fill:rgb(237, 237, 237);}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#chatgpt-mermaid-_rlm\ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#chatgpt-mermaid-_rlm\ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#chatgpt-mermaid-_rlm\ .error-icon{fill:rgb(48, 48, 48);}#chatgpt-mermaid-_rlm\ .error-text{fill:rgb(237, 237, 237);stroke:rgb(237, 237, 237);}#chatgpt-mermaid-_rlm\ .edge-thickness-normal{stroke-width:1px;}#chatgpt-mermaid-_rlm\ .edge-thickness-thick{stroke-width:3.5px;}#chatgpt-mermaid-_rlm\ .edge-pattern-solid{stroke-dasharray:0;}#chatgpt-mermaid-_rlm\ .edge-thickness-invisible{stroke-width:0;fill:none;}#chatgpt-mermaid-_rlm\ .edge-pattern-dashed{stroke-dasharray:3;}#chatgpt-mermaid-_rlm\ .edge-pattern-dotted{stroke-dasharray:2;}#chatgpt-mermaid-_rlm\ .marker{fill:rgb(175, 175, 175);stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rlm\ .marker.cross{stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rlm\ svg{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:16px;}#chatgpt-mermaid-_rlm\ p{margin:0;}#chatgpt-mermaid-_rlm\ .label{font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";color:rgb(237, 237, 237);}#chatgpt-mermaid-_rlm\ .cluster-label text{fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rlm\ .cluster-label span{color:rgb(237, 237, 237);}#chatgpt-mermaid-_rlm\ .cluster-label span p{background-color:transparent;}#chatgpt-mermaid-_rlm\ .label text,#chatgpt-mermaid-_rlm\ span{fill:rgb(237, 237, 237);color:rgb(237, 237, 237);}#chatgpt-mermaid-_rlm\ .node rect,#chatgpt-mermaid-_rlm\ .node circle,#chatgpt-mermaid-_rlm\ .node ellipse,#chatgpt-mermaid-_rlm\ .node polygon,#chatgpt-mermaid-_rlm\ .node path{fill:rgb(9, 23, 44);stroke:rgb(31, 78, 148);stroke-width:1px;}#chatgpt-mermaid-_rlm\ .rough-node .label text,#chatgpt-mermaid-_rlm\ .node .label text,#chatgpt-mermaid-_rlm\ .image-shape .label,#chatgpt-mermaid-_rlm\ .icon-shape .label{text-anchor:middle;}#chatgpt-mermaid-_rlm\ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#chatgpt-mermaid-_rlm\ .rough-node .label,#chatgpt-mermaid-_rlm\ .node .label,#chatgpt-mermaid-_rlm\ .image-shape .label,#chatgpt-mermaid-_rlm\ .icon-shape .label{text-align:center;}#chatgpt-mermaid-_rlm\ .node.clickable{cursor:pointer;}#chatgpt-mermaid-_rlm\ .root .anchor path{fill:rgb(175, 175, 175)!important;stroke-width:0;stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rlm\ .arrowheadPath{fill:rgb(175, 175, 175);}#chatgpt-mermaid-_rlm\ .edgePath .path{stroke:rgb(175, 175, 175);stroke-width:1px;}#chatgpt-mermaid-_rlm\ .flowchart-link{stroke:rgb(175, 175, 175);fill:none;}#chatgpt-mermaid-_rlm\ .edgeLabel{background-color:rgb(0, 0, 0);text-align:center;}#chatgpt-mermaid-_rlm\ .edgeLabel p{background-color:rgb(0, 0, 0);}#chatgpt-mermaid-_rlm\ .edgeLabel rect{opacity:0.5;background-color:rgb(0, 0, 0);fill:rgb(0, 0, 0);}#chatgpt-mermaid-_rlm\ .labelBkg{background-color:rgba(0, 0, 0, 0.5);}#chatgpt-mermaid-_rlm\ .cluster rect{fill:rgb(48, 48, 48);stroke:rgba(255, 255, 255, 0.15);stroke-width:1px;}#chatgpt-mermaid-_rlm\ .cluster text{fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rlm\ .cluster span{color:rgb(237, 237, 237);}#chatgpt-mermaid-_rlm\ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";font-size:12px;background:rgb(48, 48, 48);border:1px solid rgba(255, 255, 255, 0.15);border-radius:2px;pointer-events:none;z-index:100;}#chatgpt-mermaid-_rlm\ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:rgb(237, 237, 237);}#chatgpt-mermaid-_rlm\ rect.text{fill:none;stroke-width:0;}#chatgpt-mermaid-_rlm\ .icon-shape,#chatgpt-mermaid-_rlm\ .image-shape{background-color:rgb(0, 0, 0);text-align:center;}#chatgpt-mermaid-_rlm\ .icon-shape p,#chatgpt-mermaid-_rlm\ .image-shape p{background-color:rgb(0, 0, 0);padding:2px;}#chatgpt-mermaid-_rlm\ .icon-shape .label rect,#chatgpt-mermaid-_rlm\ .image-shape .label rect{opacity:0.5;background-color:rgb(0, 0, 0);fill:rgb(0, 0, 0);}#chatgpt-mermaid-_rlm\ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#chatgpt-mermaid-_rlm\ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#chatgpt-mermaid-_rlm\ .node .neo-node{stroke:rgb(31, 78, 148);}#chatgpt-mermaid-_rlm\ [data-look="neo"].node rect,#chatgpt-mermaid-_rlm\ [data-look="neo"].cluster rect,#chatgpt-mermaid-_rlm\ [data-look="neo"].node polygon{stroke:url(#chatgpt-mermaid-_rlm\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rlm\ [data-look="neo"].swimlane.cluster rect{filter:none;}#chatgpt-mermaid-_rlm\ [data-look="neo"].node path{stroke:url(#chatgpt-mermaid-_rlm\-gradient);stroke-width:1px;}#chatgpt-mermaid-_rlm\ [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rlm\ [data-look="neo"].node .neo-line path{stroke:rgb(31, 78, 148);filter:none;}#chatgpt-mermaid-_rlm\ [data-look="neo"].node circle{stroke:url(#chatgpt-mermaid-_rlm\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rlm\ [data-look="neo"].node circle .state-start{fill:#000000;}#chatgpt-mermaid-_rlm\ [data-look="neo"].icon-shape .icon{fill:url(#chatgpt-mermaid-_rlm\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rlm\ [data-look="neo"].icon-shape .icon-neo path{stroke:url(#chatgpt-mermaid-_rlm\-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#chatgpt-mermaid-_rlm\ .node text{font-size:14px;font-weight:600;letter-spacing:normal;fill:rgb(153, 206, 255);}#chatgpt-mermaid-_rlm\ .edgeLabels text{font-size:13px;font-weight:600;letter-spacing:-0.08px;fill:rgb(153, 206, 255);}#chatgpt-mermaid-_rlm\ .node tspan[font-weight="normal"],#chatgpt-mermaid-_rlm\ .edgeLabels tspan[font-weight="normal"]{font-weight:600;}#chatgpt-mermaid-_rlm\ .edgeLabel .label rect{opacity:1;rx:13px;ry:13px;fill:rgb(0, 14, 26);stroke:rgb(26, 62, 95);stroke-width:1px;}#chatgpt-mermaid-_rlm\ .node rect,#chatgpt-mermaid-_rlm\ .node circle,#chatgpt-mermaid-_rlm\ .node ellipse,#chatgpt-mermaid-_rlm\ .node polygon,#chatgpt-mermaid-_rlm\ .node path{fill:rgb(0, 40, 77);stroke:rgba(255, 255, 255, 0.1);stroke-width:1px;}#chatgpt-mermaid-_rlm\ .node rect{rx:16px;ry:16px;}#chatgpt-mermaid-_rlm\ .node.mermaid-decision .label-container{fill:rgb(0, 14, 26);stroke:rgb(26, 62, 95);stroke-dasharray:2,2;}#chatgpt-mermaid-_rlm\ .edgePaths .flowchart-link{stroke:rgb(175, 175, 175);stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;}#chatgpt-mermaid-_rlm\ .marker{fill:rgb(175, 175, 175);stroke:rgb(175, 175, 175);}#chatgpt-mermaid-_rlm\ :root{--mermaid-font-family:-apple-system-body,ui-sans-serif,-apple-system,system-ui,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol";}读取项目结构和关键代码梳理模块职责与调用关系绘制必要的流程图、数据流图识别重复代码、耦合和维护风险制定分阶段重构计划每次重构一个明确范围编译、测试、检查代码差异测试通过?提交版本并记录架构变化定位问题并修复或回退还有高价值问题?完成本轮重构是否是否

其中有三个关键点。

第一,先分析,后修改。 先让 AI 解释现有代码的结构、主要调用链和数据流。否则,它可能在没有理解系统的情况下重新组织代码。

第二,分批重构。 例如先消除重复逻辑,再拆分职责,最后调整模块依赖。每一批都要能独立验证,避免一次修改过多内容。

第三,测试优先。 重构最重要的验收标准,不是代码看起来是否整齐,而是结构得到改善,同时原有功能没有被意外改变。

七、哪些工具可以配合 AI 使用?

不需要一开始就引入复杂的架构管理系统。可以从以下工具开始。

What is Mermaid? — Mermaid Chart

Mermaid

流程图、时序图、依赖图

用文本描述图形,可以放进 Markdown 文档,与源代码一起进行 Git 版本管理。适合让 AI 生成和维护图表。

网站:Mermaid 官方文档

PlantUMLをリアルタイムにレンダリングしてくれるPlantText UML Editor | by Keiji Matsuzaki | Medium

PlantUML

UML、组件图、时序图

适合描述类之间的关系、对象调用顺序和模块结构。图表可以通过文本维护。

网站:PlantUML 官方网站

File Structure | Programming Standard Operating Procedure documentation

Graphviz

依赖关系图、调用关系图

适合生成节点较多的关系图,特别是自动化分析生成的依赖网络。

网站:Graphviz 官方网站

Creating a Secure Development Pipeline with Jenkins and SonarQube

SonarQube

静态检查、代码异味、复杂度

可以辅助发现重复代码、复杂方法、部分可靠性问题和维护风险。它不能代替对业务逻辑的理解,也不能证明重构后功能一定正确。

网站:SonarQube 产品介绍

此外,还应配合项目原本的编译器、测试框架和 Git。对于 C#/.NET 项目,通常可以先用现有的编译、单元测试和静态分析能力,不必为了重构而引入一整套新工具。

八、如何判断一次重构是否真正有效?

不能只看代码行数,也不能只看 AI 对自己的修改给出了多么漂亮的总结。

可以关注以下指标:

指标 改善意味着什么
重复逻辑数量 相同规则更容易统一维护
复杂方法的数量与复杂度 逻辑更容易理解和测试
模块之间的依赖 修改影响范围更容易控制
测试覆盖的关键行为 更容易发现功能回归
修改一个功能所需的文件数 可以辅助观察耦合程度,但越少不一定越好
修复问题的时间 能反映维护成本是否真正下降
重构后的缺陷数量 能帮助评估重构质量与风险

这些指标应结合项目实际情况使用,不要盲目追求统一数值。例如,拆分模块可能增加文件数量,却显著降低每个模块的复杂度;这种情况下,文件变多并不代表质量下降。

更有价值的衡量方式,是观察:面对下一次真实需求,开发者和 AI 是否能更快理解问题、更准确地修改代码,并且更容易验证结果。

九、建立一种适合 AI 时代的代码维护习惯

我建议将代码维护纳入日常开发,而不是等到项目变得无法维护时才处理。

  • 小型功能: 开发完成后做一次轻量检查,清理明显的重复和混乱逻辑。
  • 中型功能: 完成测试后,检查新增模块的职责、依赖和数据流。
  • 大型功能: 开发前先规划关键模块和数据流,开发后分阶段重构。
  • 长期项目: 定期审查高复杂度模块,优先治理经常修改、经常出错的部分。

不必每次都重构整个项目,也不必每个函数都配一张流程图。最值得投入的地方,是复杂度高、变化频繁、错误代价大的代码。

最后还要记住一个原则:架构图也会过时。 如果代码已经变化,图表却没有同步更新,它反而会误导 AI。因此,应优先维护少量真正有价值的图,并在相关架构修改时同步更新。

结语

AI 编程提高了代码生产速度,但一个软件的长期价值,不仅取决于它能实现多少功能,还取决于这些功能能否被持续理解、验证和修改。

代码重构改善内部结构,流程图帮助理解执行逻辑,数据流图帮助追踪数据,模块依赖图帮助控制耦合,测试则用来验证修改是否可靠。

它们结合起来,可以形成一种更健康的开发方式:

AI 不仅负责写代码,也参与理解系统、发现结构问题、规划重构和验证修改。人负责确定目标、约束风险,并判断这样的结构是否真正适合软件的长期发展。

这样,AI 才不只是一个不断增加代码的工具,而是能够帮助我们持续维护和演进软件的开发伙伴。

💬 留言 ⋮⋮

加载中…
💡 不登录也可留言(IP 限制:每文/每天各 1/10 条)

加载中…

分 0.00
纸张白
护眼绿
羊皮卷
夜间黑
100%