简介
"删除控制标志"是一种简化条件逻辑的重构手法。通过移除用于控制代码流程的布尔变量,改用直接的return或break语句,可以使代码更简洁易读。
针对的症状(代码坏味道)
- 复杂的条件表达式中的控制标志
- 循环中用于提前终止的标志变量
- 多个方法出口点的强制统一返回
删除控制标志的详细步骤
- 识别控制标志
- 查找用于控制执行流程的布尔变量
- 确认标志变量在方法中的修改点
- 替换条件判断
- 将if(flag)判断改为直接的return/break
- 反转条件判断简化逻辑
- 移除标志变量
- 删除标志变量的声明和修改语句
- 处理由删除变量引发的连锁反应
- 重构嵌套逻辑
- 对于多层嵌套的条件语句,考虑使用卫语句(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;
}
}
重构步骤:
-
替换第一个条件判断:
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; } } -
完全移除控制标志:
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; } }
练习
基础练习题
-
简单条件控制标志删除
// 重构前 public class AgeChecker { public String checkAge(int age) { String result = "Adult"; if (age < 18) { result = "Minor"; } return result; } }
进阶练习题
-
多重条件控制标志删除
// 重构前 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; } }
综合拓展练习题
-
复杂业务逻辑中的控制标志
// 重构前 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; } }
代码审查要点
-
优点:
- 减少方法中的状态管理
- 提高代码可读性和可维护性
- 提前返回减少嵌套层级
-
潜在问题:
- 避免过度使用卫语句导致逻辑分散
- 确保异常处理不受影响
- 注意返回值的覆盖范围