5.0 KiB
5.0 KiB
VO/DTO 静态内部类重构 - 最终总结
🎯 重构目标
将大量重复的独立VO/DTO类合并,使用静态内部类减少类数量。
✅ 已完成的修复
📁 DTO 包 (dto/)
重构前:
- 13+ 个文件,包括大量重复的独立类
重构后:5个核心文件
1. KlingIdentifyFaceRequest.java
2. KlingIdentifyFaceResponse.java
3. KlingLipSyncCreateRequest.java
└─ 静态内部类: FaceChoose
4. KlingLipSyncCreateResponse.java
└─ 静态内部类: Data, TaskInfo
5. KlingLipSyncQueryResponse.java
└─ 静态内部类: Data, TaskInfo, ParentVideo, TaskResult, Video
📁 VO 包 (vo/)
重构前:
- 13+ 个文件,包括大量重复的独立类
重构后:5个核心文件
1. KlingIdentifyFaceReqVO.java
2. KlingIdentifyFaceRespVO.java
3. KlingLipSyncCreateReqVO.java
└─ 静态内部类: FaceChooseVO
4. KlingLipSyncCreateRespVO.java
└─ 静态内部类: Data, TaskInfo
5. KlingLipSyncQueryRespVO.java
└─ 静态内部类: Data, TaskInfo, ParentVideo, TaskResult, Video
📊 重构成果
类数量对比
| 类别 | 重构前 | 重构后 | 减少 |
|---|---|---|---|
| DTO文件 | 13+ | 5 | -62% |
| VO文件 | 13+ | 5 | -62% |
| 总文件数 | 26+ | 10 | -62% |
命名对比
| 场景 | 重构前 | 重构后 |
|---|---|---|
| 请求对象 | KlingFaceChooseVO (独立类) |
KlingLipSyncCreateReqVO.FaceChooseVO (静态内部类) |
| 响应数据 | KlingLipSyncCreateDataVO (独立类) |
KlingLipSyncCreateRespVO.Data (静态内部类) |
| 任务信息 | KlingLipSyncTaskInfoVO (独立类) |
KlingLipSyncCreateRespVO.TaskInfo (静态内部类) |
🔧 技术方案
方案选择:静态内部类
为什么选择静态内部类?
- ✅ 减少类数量 - 避免创建大量独立的重复类
- ✅ 保持类型安全 - 通过静态内部类保持强类型
- ✅ 逻辑分组 - 相关类组织在一起,便于理解
- ✅ API清晰 - 层次结构明确:
OuterClass.InnerClass - ✅ BeanUtils兼容 - 支持 DTO ↔ VO 转换
注意事项
- @Data 注解 - 静态内部类可以使用 @Data
- Lombok 配置 - 确保项目正确配置 Lombok
- Bean 转换 - 使用
BeanUtils.toBean()进行对象转换 - JSON 序列化 - @JsonProperty 注解确保正确的序列化
📝 使用示例
前端调用 (不变)
// 仍然使用相同的API
const response = await createLipSyncTask({
sessionId: 'xxx',
faceChoose: [{
faceId: 'xxx',
soundFile: 'audio.mp3'
}]
})
后端转换
// DTO -> VO 转换
KlingLipSyncCreateRespVO vo = BeanUtils.toBean(dto, KlingLipSyncCreateRespVO.class);
// 访问静态内部类
String taskId = vo.getData().getTaskId();
String externalTaskId = vo.getData().getTaskInfo().getExternalTaskId();
策略模式 (不变)
// 仍然使用相同的策略
LipSyncStrategy strategy = lipSyncStrategyFactory.getStrategyForTask(task);
return strategy.syncLip(task, audioUrl);
🎨 文件结构
DTO 包结构
cn.iocoder.yudao.module.tik.kling.dto
├── KlingIdentifyFaceRequest.java
├── KlingIdentifyFaceResponse.java
├── KlingLipSyncCreateRequest.java
│ └── FaceChoose (静态内部类)
├── KlingLipSyncCreateResponse.java
│ ├── Data (静态内部类)
│ └── TaskInfo (静态内部类)
└── KlingLipSyncQueryResponse.java
├── Data (静态内部类)
├── TaskInfo (静态内部类)
├── ParentVideo (静态内部类)
├── TaskResult (静态内部类)
└── Video (静态内部类)
VO 包结构
cn.iocoder.yudao.module.tik.kling.vo
├── KlingIdentifyFaceReqVO.java
├── KlingIdentifyFaceRespVO.java
├── KlingLipSyncCreateReqVO.java
│ └── FaceChooseVO (静态内部类)
├── KlingLipSyncCreateRespVO.java
│ ├── Data (静态内部类)
│ └── TaskInfo (静态内部类)
└── KlingLipSyncQueryRespVO.java
├── Data (静态内部类)
├── TaskInfo (静态内部类)
├── ParentVideo (静态内部类)
├── TaskResult (静态内部类)
└── Video (静态内部类)
✨ 优势总结
1. 代码简洁
- 从 26+ 个文件减少到 10 个文件
- 减少 62% 的类数量
2. 结构清晰
- 相关类组织在同一个文件中
- 层次结构明确
3. 易于维护
- 减少重复代码
- 便于理解代码逻辑
4. 类型安全
- 保持强类型检查
- 避免类型混淆
5. 向下兼容
- API 接口不变
- 前端调用不变
- 策略模式逻辑不变
🎉 总结
本次重构成功将大量重复的VO/DTO类合并为静态内部类,大大简化了项目结构。从26+个文件减少到10个文件,减少**62%**的类数量,同时保持了所有功能的完整性和API的兼容性。
重构后的代码更加简洁、清晰、易于维护,为后续的功能扩展奠定了良好的基础。