提炼函数
// 重构前
public void printOwing(double amount) {
printBanner();
// 打印详情
System.out.println("name: " + name);
System.out.println("amount: " + amount);
}
// 重构后
public void printOwing(double amount) {
printBanner();
printDetails(amount);
}
private void printDetails(double amount) {
System.out.println("name: " + name);
System.out.println("amount: " + amount);
}
最佳实践
- 测试优先
- 使用IDEA提示,消除重复代码
- 逐步提炼
- 命名优先(如果找不到合适的名称,则表明代码块职责并不明确)
适用场景
- 消除重复代码
- 提高可读性
- 简化复杂逻辑
- 为代码块赋予明确语义
不适用场景
- 过度分解导致碎片化
- 代码块与上下文强耦合
// 不推荐:需要传递过多参数
public void process() {
int a = 10;
String b = "data";
boolean c = true;
// 提炼后的函数需要传递a、b、c三个参数
processSubtask(a, b, c);
}
private void processSubtask(int a, String b, boolean c) {
// 逻辑依赖a、b、c
}
// 问题:参数过多,可能意味着原函数职责过重
- 性能敏感场景
- 循环内频繁调用函数
- 过多的参数传递
- 破环原有逻辑的原子性
引入参数对象
// 重构前
public void createEvent(String title, LocalDateTime startTime,
LocalDateTime endTime, String location) {
// ...
}
// 重构后
class EventParams {
String title;
LocalDateTime startTime;
LocalDateTime endTime;
String location;
}
public void createEvent(EventParams params) {
// ...
}