简介
“合并条件表达式”(Consolidate Conditional Expression)是一种重构手法,当多个条件表达式做着相同的事情时,通过将它们合并为一个条件表达式,使代码更加简洁、易读,减少重复代码,提高代码的可维护性。
针对的症状(代码坏味道)
- 多个条件执行相同操作:在代码中存在多个条件语句,虽然条件不同,但它们执行的结果或操作是相同的。
- 条件逻辑分散:相似的条件判断逻辑分散在代码的不同地方,增加了理解和修改代码的难度。
合并条件表达式(Consolidate Conditional Expression)的详细步骤
- 识别相似条件表达式
- 遍历代码:在方法或代码块中寻找条件不同但执行相同操作的条件表达式。
- 确认操作一致性:确保这些条件表达式所执行的操作完全相同,包括返回值、调用的方法等。
- 合并条件
- 使用逻辑运算符:如果条件之间是“或”(
||)的关系,将多个条件用||连接起来;如果是“且”(&&)的关系,用&&连接。 - 提取公共代码:将条件表达式执行的相同操作提取出来,放在合并后的条件表达式之后。
- 使用逻辑运算符:如果条件之间是“或”(
- 测试
- 编译代码:确保代码编译通过,没有任何语法错误。
- 运行测试:运行所有相关的单元测试,确保重构操作没有引入新的错误。
- 手动测试:如果有必要,进行手动测试以验证功能的正确性。
- 代码审查
- 同行评审:让同事或其他团队成员审查你的更改,确保代码质量和可维护性没有下降。
- 文档更新:如果项目有维护文档的习惯,记得更新相关文档,说明合并条件表达式的影响。
示例
假设有一个方法根据不同条件输出提示信息,存在多个相似条件表达式。
原始代码
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.");
}
}
}
重构步骤
- 识别相似条件表达式:三个
if条件表达式都执行System.out.println("Status is normal.");操作。 - 合并条件:
- 使用逻辑运算符:因为条件之间是“或”的关系,用
||连接。 - 提取公共代码:将输出语句放在合并后的条件表达式之后。
- 使用逻辑运算符:因为条件之间是“或”的关系,用
重构后代码
public class Example {
public void checkStatus(int statusCode) {
if (statusCode == 1 || statusCode == 2 || statusCode == 3) {
System.out.println("Status is normal.");
}
}
}
练习
基础练习题
- 简单条件表达式合并
-
给定以下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."); } } }
-
进阶练习题
- 复杂条件表达式合并
-
在这段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."); } } }
-
综合拓展练习题
- 多条件表达式合并与代码审查模拟
-
考虑一个简单的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..."); } }
-