重构手法——对象结构优化类 | 类关系解耦 | 删除控制标志

43 阅读2分钟

简介

"删除控制标志"是一种简化条件逻辑的重构手法。通过移除用于控制代码流程的布尔变量,改用直接的return或break语句,可以使代码更简洁易读。

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

  • 复杂的条件表达式中的控制标志
  • 循环中用于提前终止的标志变量
  • 多个方法出口点的强制统一返回

删除控制标志的详细步骤

  1. 识别控制标志
    • 查找用于控制执行流程的布尔变量
    • 确认标志变量在方法中的修改点
  2. 替换条件判断
    • 将if(flag)判断改为直接的return/break
    • 反转条件判断简化逻辑
  3. 移除标志变量
    • 删除标志变量的声明和修改语句
    • 处理由删除变量引发的连锁反应
  4. 重构嵌套逻辑
    • 对于多层嵌套的条件语句,考虑使用卫语句(Guard Clause)
    • 合并冗余的条件判断

示例

重构前代码:

public class OrderValidator {
    public boolean validate(Order order) {
        boolean isValid = true;

        if (order.getAmount() <= 0) {
            isValid = false;
        }

        if (isValid && order.getCustomer() == null) {
            isValid = false;
        }

        if (isValid && !order.hasValidPayment()) {
            isValid = false;
        }

        return isValid;
    }
}

重构步骤:

  1. 替换第一个条件判断:

    public class OrderValidator {
        public boolean validate(Order order) {
            if (order.getAmount() <= 0) {
                return false;
            }
    
            boolean isValid = true;
    
            if (isValid && order.getCustomer() == null) {
                isValid = false;
            }
    
            if (isValid && !order.hasValidPayment()) {
                isValid = false;
            }
    
            return isValid;
        }
    }
    
  2. 完全移除控制标志:

    public class OrderValidator {
        public boolean validate(Order order) {
            if (order.getAmount() <= 0) {
                return false;
            }
    
            if (order.getCustomer() == null) {
                return false;
            }
    
            if (!order.hasValidPayment()) {
                return false;
            }
    
            return true;
        }
    }
    

练习

基础练习题

  1. 简单条件控制标志删除

    // 重构前
    public class AgeChecker {
        public String checkAge(int age) {
            String result = "Adult";
            if (age < 18) {
                result = "Minor";
            }
            return result;
        }
    }
    

进阶练习题

  1. 多重条件控制标志删除

    // 重构前
    public class LoanApprover {
        public boolean approveLoan(Application app) {
            boolean approved = true;
    
            if (app.getCreditScore() < 650) {
                approved = false;
            }
    
            if (approved && app.getIncome() < 50000) {
                approved = false;
            }
    
            if (approved && app.getEmploymentYears() < 2) {
                approved = false;
            }
    
            return approved;
        }
    }
    

综合拓展练习题

  1. 复杂业务逻辑中的控制标志

    // 重构前
    public class InventoryManager {
        public boolean processOrder(Order order, Inventory inventory) {
            boolean canProcess = true;
            for (Item item : order.getItems()) {
                if (inventory.getStock(item) < item.getQuantity()) {
                    canProcess = false;
                    break;
                }
            }
    
            if (canProcess) {
                if (!order.validatePayment()) {
                    canProcess = false;
                }
            }
    
            return canProcess;
        }
    }
    

代码审查要点

  1. 优点:

    • 减少方法中的状态管理
    • 提高代码可读性和可维护性
    • 提前返回减少嵌套层级
  2. 潜在问题:

    • 避免过度使用卫语句导致逻辑分散
    • 确保异常处理不受影响
    • 注意返回值的覆盖范围