我用AI编程工具重构了整个微服务项目

背景

作为有十年经验的Java后端开发者,我一直对AI编程持观望态度。直到上个月接手了一个遗留的Spring Cloud微服务项目,代码质量堪忧、文档缺失、测试覆盖率不足10%。在时间紧迫的情况下,我决定尝试用AI编程工具来协助重构。

项目概况

  • 模块数量:12个微服务
  • 代码量:约50万行
  • 技术栈:Spring Cloud + MyBatis + MySQL + Redis
  • 核心问题:重复代码多、事务管理混乱、缺乏单元测试

重构流程

第一步:代码分析与理解

我使用Cursor打开整个项目,利用其项目级代码理解能力进行分析:

// 原有代码 - 每个Service都有相似的CRUD模板
public class UserService {
    public ApiResponse<User> createUser(UserCreateReq req) {
        // 参数校验
        if (StringUtils.isEmpty(req.getUsername())) {
            return ApiResponse.error("用户名不能为空");
        }
        // ... 其他校验
        
        // 转换
        User user = new User();
        BeanUtils.copyProperties(req, user);
        user.setCreatedAt(LocalDateTime.now());
        
        // 保存
        userMapper.insert(user);
        return ApiResponse.success(user);
    }
}

Cursor帮我分析出了所有Service中的共性代码模式,并建议提取通用BaseService。

第二步:AI辅助重构

// AI生成的通用BaseService
public abstract class BaseService<D, T, Q> {
    
    @Autowired
    protected BaseMapper<T> mapper;
    
    public ApiResponse<T> create(D createReq) {
        // 通用参数校验 (通过注解)
        validate(createReq);
        
        // DTO -> Entity转换
        T entity = convertToEntity(createReq);
        
        // 填充通用字段
        fillBaseFields(entity);
        
        // 保存
        mapper.insert(entity);
        return ApiResponse.success(entity);
    }
    
    protected abstract T convertToEntity(D dto);
    protected abstract void validate(D dto);
    protected void fillBaseFields(T entity) {
        if (entity instanceof BaseEntity) {
            BaseEntity be = (BaseEntity) entity;
            be.setCreatedAt(LocalDateTime.now());
            be.setUpdatedAt(LocalDateTime.now());
        }
    }
}

第三步:单元测试生成

Copilot在生成测试方面表现最为突出:

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
    
    @Mock
    private UserMapper userMapper;
    
    @InjectMocks
    private UserService userService;
    
    @Test
    void createUser_ValidRequest_ShouldReturnSuccess() {
        // Arrange
        UserCreateReq req = new UserCreateReq();
        req.setUsername("testUser");
        req.setEmail("test@example.com");
        
        User user = new User();
        user.setId(1L);
        user.setUsername("testUser");
        
        when(userMapper.insert(any(User.class))).thenReturn(1);
        
        // Act
        ApiResponse<User> response = userService.createUser(req);
        
        // Assert
        assertThat(response.isSuccess()).isTrue();
        verify(userMapper).insert(any(User.class));
    }
}

成果

指标 重构前 重构后
代码行数 50万 32万
重复代码率 35% 8%
测试覆盖率 8% 78%
构建时间 12min 7min

感悟

AI编程不是要取代程序员,而是要让我们从重复劳动中解放出来,专注于更有创造性的工作。关键在于如何正确提问如何审阅AI的输出

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐