代码重构助手

使用 AI 智能分析和重构代码,提升代码质量

实战级别40 分钟阅读

重构场景

常见的代码重构场景和解决方案

遗留代码现代化

将老旧代码升级到现代标准

重构前:

// 旧版 JavaScript 代码
function getUserData(userId) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', '/api/users/' + userId, false);
  xhr.send();
  
  if (xhr.status === 200) {
    var data = JSON.parse(xhr.responseText);
    return data;
  } else {
    return null;
  }
}

function processUsers(userIds) {
  var results = [];
  for (var i = 0; i < userIds.length; i++) {
    var userData = getUserData(userIds[i]);
    if (userData) {
      results.push(userData);
    }
  }
  return results;
}

重构后:

// 现代化后的代码
async function getUserData(userId) {
  try {
    const response = await fetch(`/api/users/${userId}`);
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return await response.json();
  } catch (error) {
    console.error('Failed to fetch user data:', error);
    return null;
  }
}

async function processUsers(userIds) {
  const promises = userIds.map(id => getUserData(id));
  const results = await Promise.allSettled(promises);
  
  return results
    .filter(result => result.status === 'fulfilled' && result.value)
    .map(result => result.value);
}

改进点:

使用现代 fetch API 替代 XMLHttpRequest
异步处理替代同步阻塞
使用 const/let 替代 var
模板字符串替代字符串拼接
并行处理提升性能
更好的错误处理

性能优化重构

识别和解决性能瓶颈

重构前:

// 性能问题代码
function findUsersByRole(users, targetRole) {
  const result = [];
  for (let i = 0; i < users.length; i++) {
    for (let j = 0; j < users[i].roles.length; j++) {
      if (users[i].roles[j].name === targetRole) {
        result.push(users[i]);
        break;
      }
    }
  }
  return result;
}

function processUserData(users) {
  const processed = [];
  for (const user of users) {
    const userData = {
      id: user.id,
      name: user.name,
      email: user.email,
      roles: findUsersByRole([user], 'admin').length > 0 ? 'admin' : 'user'
    };
    processed.push(userData);
  }
  return processed;
}

重构后:

// 优化后的代码
function findUsersByRole(users, targetRole) {
  return users.filter(user => 
    user.roles.some(role => role.name === targetRole)
  );
}

function processUserData(users) {
  // 预计算管理员用户集合
  const adminUsers = new Set(
    findUsersByRole(users, 'admin').map(user => user.id)
  );
  
  return users.map(user => ({
    id: user.id,
    name: user.name,
    email: user.email,
    roles: adminUsers.has(user.id) ? 'admin' : 'user'
  }));
}

改进点:

使用数组方法替代手动循环
避免重复计算
使用 Set 提升查找性能
减少嵌套循环复杂度
更简洁的函数式编程风格

重构工作流

系统化的代码重构流程

1

代码分析

使用 AI 分析现有代码的问题和改进空间

示例命令:

@src/legacy-module.js 分析这个模块的代码质量问题
@src/utils/ 识别这个目录中的性能瓶颈
@package.json @src/ 分析项目的技术债务

提示: 提供具体的分析维度,如性能、可维护性、安全性等

2

重构规划

制定详细的重构计划和优先级

示例命令:

基于分析结果,制定重构计划和优先级
评估重构的风险和收益
建议分阶段重构的策略

提示: 考虑业务影响和团队资源,制定可执行的计划

3

代码重构

逐步执行重构,保持功能不变

示例命令:

@src/old-component.js 重构这个组件,使用现代 React 模式
@src/api.js 优化这个 API 模块的性能
@src/utils.js 提取公共函数并改进命名

提示: 每次重构保持小步快跑,确保测试通过

4

测试验证

确保重构后功能正确性

示例命令:

@tests/ @src/refactored-module.js 为重构后的代码生成测试用例
比较重构前后的性能差异
验证重构是否引入新的问题

提示: 重构前后都要有充分的测试覆盖

实战示例

具体的重构任务和 AI 提示词

组件重构示例

将类组件重构为函数组件

AI 提示词:

@src/components/UserProfile.js 将这个类组件重构为使用 Hooks 的函数组件,保持相同的功能

期望输出:

  • 分析现有类组件的状态和生命周期
  • 转换为函数组件和相应的 Hooks
  • 保持 props 接口不变
  • 优化性能和可读性

API 重构示例

重构 API 调用逻辑

AI 提示词:

@src/services/api.js 重构这个 API 服务,添加错误处理、重试机制和类型安全

期望输出:

  • 添加统一的错误处理
  • 实现自动重试机制
  • 添加 TypeScript 类型定义
  • 改进 API 响应处理

数据结构优化

优化数据处理逻辑

AI 提示词:

@src/utils/dataProcessor.js 优化这个数据处理模块的性能,减少时间复杂度

期望输出:

  • 分析当前算法复杂度
  • 建议更高效的数据结构
  • 重写关键算法
  • 添加性能基准测试

最佳实践

代码重构的重要原则和技巧

重构原则

  • 小步快跑,频繁提交
  • 保持测试覆盖率
  • 一次只做一种类型的重构
  • 重构前确保有完整的测试

AI 协助技巧

  • 提供充分的上下文信息
  • 明确重构目标和约束
  • 要求解释重构理由
  • 验证 AI 建议的正确性

质量保证

  • 重构后运行完整测试套件
  • 检查性能指标变化
  • 进行代码审查
  • 更新相关文档

继续学习

探索更多 AI 辅助开发的实战案例