重构手法——函数行为重塑类 | 语意 | 合并重复的条件片段

61 阅读1分钟

简介

"合并重复的条件片段"是消除代码冗余的有效重构手法。通过提取条件分支中的公共代码,可以降低维护成本,提高代码的可读性和可修改性。

针对的症状(代码坏味道)

  • 多个条件分支包含相同代码片段
  • 修改公共逻辑需要改动多处
  • 条件判断前后存在重复操作
  • 代码中存在相似的条件结构

合并重复条件片段的详细步骤

  1. 识别重复代码
    • 查找多个条件中的相同代码块
    • 标记可合并的代码片段
  2. 分析条件结构
    • 确认代码执行顺序无关
    • 检查条件间的互斥关系
  3. 提取公共代码
    • 将重复代码移到条件外部
    • 使用卫语句简化条件
  4. 验证逻辑
    • 确保执行顺序保持不变
    • 检查边界条件处理

示例

重构前代码:

void processOrder(Order order) {
    if (order.isPriority()) {
        log.info("Processing priority order");
        double total = calculateTotal(order);
        sendConfirmation(order);
    } else {
        log.info("Processing priority order");
        double total = calculateTotal(order);
        queueForProcessing(order);
    }
}

重构后代码:

void processOrder(Order order) {
    log.info("Processing priority order");
    double total = calculateTotal(order);

    if (order.isPriority()) {
        sendConfirmation(order);
    } else {
        queueForProcessing(order);
    }
}

练习

基础练习题

  1. 简单条件合并

    // 重构前
    String getGrade(int score) {
        if (score >= 90) {
            System.out.println("Evaluated");
            return "A";
        } else {
            System.out.println("Evaluated");
            return "B";
        }
    }
    

进阶练习题

  1. 嵌套条件处理

    // 重构前
    void checkSystem(boolean isTestEnv) {
        if (isTestEnv) {
            initMockDB();
            loadConfig();
            runDiagnostics();
        } else {
            loadConfig();
            connectRealDB();
            runDiagnostics();
        }
    }
    

综合拓展练习题

  1. 多重复片段

    // 重构前
    void exportData(String format) {
        try {
            if (format.equals("CSV")) {
                prepareStorage();
                generateCSV();
                uploadCloud();
            } else {
                prepareStorage();
                generatePDF();
                uploadCloud();
            }
        } finally {
            cleanupTemp();
        }
    }
    

代码审查要点

  1. 优点:

    • 减少代码重复
    • 降低维护成本
    • 突出业务差异点
  2. 潜在问题:

    • 保持条件完整性
    • 注意执行顺序依赖
    • 避免过度合并