1. 代码坏味道识别
1.1 常见代码坏味道
- 过长的方法
- 过大的类
- 重复代码
- 过长参数列表
- 数据泥团
- 过度耦合
1.2 示例分析
// 坏味道示例
public class UserService {
public void createUser(String name, String email, String phone,
String address, String city, String country, String postcode) {
// 过长参数列表
}
}
// 重构后
public class UserService {
public void createUser(UserDTO userDTO) {
// 使用DTO封装参数
}
}
2. 基础重构手法
2.1 提取方法
// 重构前
public void printOwing() {
printBanner();
// 打印详情
System.out.println("name: " + name);
System.out.println("amount: " + getOutstanding());
}
// 重构后
public void printOwing() {
printBanner();
printDetails();
}
private void printDetails() {
System.out.println("name: " + name);
System.out.println("amount: " + getOutstanding());
}
2.2 移动方法/字段
2.3 重命名
2.4 封装字段
2.5 提取类
3. 中级重构技巧
3.1 替换条件表达式
// 重构前
double getPayAmount() {
double result;
if (isDead) result = deadAmount();
else if (isSeparated) result = separatedAmount();
else if (isRetired) result = retiredAmount();
else result = normalPayAmount();
return result;
}
// 重构后
double getPayAmount() {
return new PayCalculator(this).calculate();
}
3.2 简化条件逻辑
3.3 处理概括关系
3.4 组织数据
3.5 简化方法调用
4. 高级重构模式
4.1 设计模式重构
- 策略模式
- 工厂模式
- 观察者模式
- 模板方法
4.2 接口优化
// 重构前
interface UserService {
void createUser();
void updateUser();
void deleteUser();
void queryUser();
void exportUserExcel();
void importUserExcel();
}
// 重构后
interface UserService {
void createUser();
void updateUser();
void deleteUser();
void queryUser();
}
interface UserExcelService {
void exportUserExcel();
void importUserExcel();
}
5. 实战案例分析
5.1 业务代码重构
- Controller层优化
- Service层改造
- DAO层重构
- 领域模型优化
5.2 性能优化重构
- 循环优化
- 数据结构调整
- 并发处理
- 资源释放
6. 重构工具使用
6.1 IDEA重构功能
- 提取方法
- 提取变量
- 修改方法签名
- 移动类和文件
6.2 代码分析工具
- SonarQube
- PMD
- FindBugs
- IDEA代码检查
7. 重构最佳实践
7.1 重构原则
- 小步重构
- 测试驱动
- 持续集成
- 及时重构
7.2 注意事项
- 保持测试用例
- 文档同步更新
- 考虑兼容性
- 评估重构成本
8. 重构技巧总结
8.1 常用重构手法
// 1. 提取常量
String url = "http://api.example.com" + "/users"; // 不好
private static final String API_BASE_URL = "http://api.example.com";
private static final String API_USERS_PATH = "/users";
String url = API_BASE_URL + API_USERS_PATH; // 好
// 2. 简化条件判断
if (user != null && user.getAge() != null && user.getAge() > 18) // 不好
Optional.ofNullable(user)
.map(User::getAge)
.filter(age -> age > 18) // 好
8.2 重构检查清单
- 代码是否更清晰
- 是否降低了复杂度
- 是否提高了可维护性
- 是否保持了兼容性
9. 持续优化建议
- 建立代码审查制度
- 定期进行代码重构
- 保持学习新技术
- 总结重构经验
写作建议:
- 每个重构技巧都要配上具体的代码示例
- 说明重构前后的对比
- 解释重构的原因和收益
- 提供实际项目中的案例
- 分享重构过程中的注意事项
- 可以结合设计模式来讲解
- 强调测试的重要性
这个主题可以分成多篇文章,每篇深入讲解一个方面。建议先从基础的重构手法开始,循序渐进地介绍更复杂的重构技巧。
425

被折叠的 条评论
为什么被折叠?



