如何提升Java代码可读性?嵌套while循环简化方案咨询
简化嵌套循环并重构为方法的方案
你的代码核心问题是重复的输入验证逻辑被嵌套在多层while循环中,导致可读性差、维护困难。我们可以通过提取通用方法、拆分职责来彻底简化代码,同时解决变量作用域的问题。
第一步:提取通用输入方法
把「数值输入+合法性验证+exit检测」这一套重复逻辑抽成独立静态方法,让所有输入场景复用,直接消除嵌套循环。
重构后的完整代码
import java.util.Scanner; public class Payroll { // 把Scanner设为类级静态变量,让所有方法共用 private static Scanner reader; public static void main(String[] args) { reader = new Scanner(System.in); // 程序说明 System.out.println("\nCalculate your weekly pay"); System.out.println("Entering \"exit\" at any time will bring you back to the manager\n"); while (true) { // 调用通用方法获取输入,返回null表示用户输入exit Double hourlyWage = getValidNumericInput("Enter hourly wage: $"); if (hourlyWage == null) break; Double regularHours = getValidNumericInput("Enter hours worked: "); if (regularHours == null) break; Double overtimeHours = getValidNumericInput("Enter overtime hours worked: "); if (overtimeHours == null) break; // 计算并输出薪资 double totalPay = calculateTotalPay(hourlyWage, regularHours, overtimeHours); System.out.printf("Your weekly pay is $%.2f\n\n", totalPay); } // 统一退出逻辑 System.out.println("Program terminated, going to manager\n"); Manager.main(args); } // 通用输入处理方法:负责获取合法数值或检测exit private static Double getValidNumericInput(String prompt) { while (true) { System.out.print(prompt); String input = reader.next().trim(); System.out.println(); // 处理exit指令 if (input.equalsIgnoreCase("exit")) { return null; } // 验证数值合法性 try { return Double.parseDouble(input); } catch (NumberFormatException e) { System.out.println("Please enter an actual number.\n"); } } } // 薪资计算专属方法:只负责计算逻辑 private static double calculateTotalPay(double hourlyWage, double regularHours, double overtimeHours) { double regularPay = hourlyWage * regularHours; double overtimePay = hourlyWage * 1.5 * overtimeHours; return regularPay + overtimePay; } }
关键改进点
- 消除嵌套循环:所有输入验证逻辑都集中在
getValidNumericInput里,main方法只负责按流程调用,逻辑线性清晰 - 解决变量作用域问题:不再需要在main里定义一堆冗余变量,输入值直接通过方法返回获取,按需使用
- 统一退出逻辑:所有输入点的exit检测都在同一个方法里处理,避免重复代码
- 职责单一:每个方法只做一件事:输入方法管输入,计算方法管计算,main管流程控制
- 移除冗余代码:原有的
isNumeric方法可以直接删除,因为输入验证逻辑已经整合到输入方法中
内容的提问来源于stack exchange,提问作者omgeeitslexi
相关产品推荐
相关产品推荐

