重构手法——代码健壮性增强类|代码洁癖治理|合并条件表达式

65 阅读4分钟

简介

“合并条件表达式”(Consolidate Conditional Expression)是一种重构手法,当多个条件表达式做着相同的事情时,通过将它们合并为一个条件表达式,使代码更加简洁、易读,减少重复代码,提高代码的可维护性。

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

  • 多个条件执行相同操作:在代码中存在多个条件语句,虽然条件不同,但它们执行的结果或操作是相同的。
  • 条件逻辑分散:相似的条件判断逻辑分散在代码的不同地方,增加了理解和修改代码的难度。

合并条件表达式(Consolidate Conditional Expression)的详细步骤

  1. 识别相似条件表达式
    • 遍历代码:在方法或代码块中寻找条件不同但执行相同操作的条件表达式。
    • 确认操作一致性:确保这些条件表达式所执行的操作完全相同,包括返回值、调用的方法等。
  2. 合并条件
    • 使用逻辑运算符:如果条件之间是“或”(||)的关系,将多个条件用||连接起来;如果是“且”(&&)的关系,用&&连接。
    • 提取公共代码:将条件表达式执行的相同操作提取出来,放在合并后的条件表达式之后。
  3. 测试
    • 编译代码:确保代码编译通过,没有任何语法错误。
    • 运行测试:运行所有相关的单元测试,确保重构操作没有引入新的错误。
    • 手动测试:如果有必要,进行手动测试以验证功能的正确性。
  4. 代码审查
    • 同行评审:让同事或其他团队成员审查你的更改,确保代码质量和可维护性没有下降。
    • 文档更新:如果项目有维护文档的习惯,记得更新相关文档,说明合并条件表达式的影响。

示例

假设有一个方法根据不同条件输出提示信息,存在多个相似条件表达式。

原始代码

public class Example {
    public void checkStatus(int statusCode) {
        if (statusCode == 1) {
            System.out.println("Status is normal.");
        }
        if (statusCode == 2) {
            System.out.println("Status is normal.");
        }
        if (statusCode == 3) {
            System.out.println("Status is normal.");
        }
    }
}

重构步骤

  1. 识别相似条件表达式:三个if条件表达式都执行System.out.println("Status is normal.");操作。
  2. 合并条件:
    • 使用逻辑运算符:因为条件之间是“或”的关系,用||连接。
    • 提取公共代码:将输出语句放在合并后的条件表达式之后。

重构后代码

public class Example {
    public void checkStatus(int statusCode) {
        if (statusCode == 1 || statusCode == 2 || statusCode == 3) {
            System.out.println("Status is normal.");
        }
    }
}

练习

基础练习题

  1. 简单条件表达式合并
    • 给定以下Java代码,根据不同的天气状况输出相同的提示。请合并这些条件表达式。

        public class WeatherChecker {
            public void checkWeather(String weather) {
                if (weather.equals("sunny")) {
                    System.out.println("Good day to go out.");
                }
                if (weather.equals("cloudy")) {
                    System.out.println("Good day to go out.");
                }
                if (weather.equals("partly sunny")) {
                    System.out.println("Good day to go out.");
                }
            }
        }
      

进阶练习题

  1. 复杂条件表达式合并
    • 在这段Java代码中,根据不同的用户权限和操作类型执行相同的日志记录操作。请合并条件表达式。

        public class UserActionLogger {
            public void logAction(int userPermission, String actionType) {
                if (userPermission == 1 && actionType.equals("create")) {
                    System.out.println("Logging user create action.");
                }
                if (userPermission == 2 && actionType.equals("create")) {
                    System.out.println("Logging user create action.");
                }
                if (userPermission == 1 && actionType.equals("update")) {
                    System.out.println("Logging user update action.");
                }
                if (userPermission == 2 && actionType.equals("update")) {
                    System.out.println("Logging user update action.");
                }
            }
        }
      

综合拓展练习题

  1. 多条件表达式合并与代码审查模拟
    • 考虑一个简单的Java电商系统,在订单处理过程中,根据不同的订单状态(如“pending”“processing”“shipped”)和用户会员等级(“basic”“premium”)执行相同的库存检查操作,同时根据不同的支付方式(“credit card”“paypal”)和订单金额范围执行相同的折扣计算操作。请对这些条件表达式进行合并。

    • 假设你完成了重构,请模拟一份简单的代码审查报告,指出重构后的优点和可能存在的潜在问题。

        public class OrderProcessor {
            public void processOrder(String orderStatus, String userMembership, String paymentMethod, double orderAmount) {
                if (orderStatus.equals("pending") && userMembership.equals("basic")) {
                    checkInventory();
                }
                if (orderStatus.equals("processing") && userMembership.equals("basic")) {
                    checkInventory();
                }
                if (orderStatus.equals("shipped") && userMembership.equals("basic")) {
                    checkInventory();
                }
                if (orderStatus.equals("pending") && userMembership.equals("premium")) {
                    checkInventory();
                }
                if (orderStatus.equals("processing") && userMembership.equals("premium")) {
                    checkInventory();
                }
                if (orderStatus.equals("shipped") && userMembership.equals("premium")) {
                    checkInventory();
                }
                if (paymentMethod.equals("credit card") && orderAmount > 100 && orderAmount <= 200) {
                    calculateDiscount();
                }
                if (paymentMethod.equals("paypal") && orderAmount > 100 && orderAmount <= 200) {
                    calculateDiscount();
                }
                if (paymentMethod.equals("credit card") && orderAmount > 200 && orderAmount <= 300) {
                    calculateDiscount();
                }
                if (paymentMethod.equals("paypal") && orderAmount > 200 && orderAmount <= 300) {
                    calculateDiscount();
                }
            }
      
            private void checkInventory() {
                System.out.println("Checking inventory...");
            }
      
            private void calculateDiscount() {
                System.out.println("Calculating discount...");
            }
        }