Skip to content

提炼函数

// 重构前
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);
}

最佳实践

  1. 测试优先
  2. 使用IDEA提示,消除重复代码
  3. 逐步提炼
  4. 命名优先(如果找不到合适的名称,则表明代码块职责并不明确)

适用场景

  1. 消除重复代码
  2. 提高可读性
  3. 简化复杂逻辑
  4. 为代码块赋予明确语义

不适用场景

  • 过度分解导致碎片化
  • 代码块与上下文强耦合
// 不推荐:需要传递过多参数
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) {
    // ...
}