修改现有Java代码通过方法实现模块化的方案咨询 附3段示例代码
Java代码模块化重构方案
本次重构核心遵循单一职责原则,将每段代码的输入获取、核心业务计算、结果输出三个职责拆分到独立方法,解决原有逻辑耦合、无法复用的问题。
1. 抛硬币统计代码重构
原有待修改问题
- 模拟次数硬编码为2000000,灵活性极低
- 统计逻辑、输出逻辑全部耦合在main方法中,抛硬币统计能力无法复用
- 变量命名不符合Java小驼峰规范(如
Heads、FlipResult首字母大写不符合变量命名要求)
重构方案
拆分4个逻辑单元:
- 提取模拟次数为类静态常量,支持快速修改
flipCoin():保留原有抛硬币核心逻辑,修正方法命名为小驼峰simulateCoinFlips(int simulateTimes):接收模拟次数作为入参,内部执行循环统计,返回长度为2的int数组(索引0存正面次数,索引1存反面次数)printStatResult(int heads, int tails):专门负责输出统计结果
重构后代码
public class HeadsOrTails { // 模拟次数常量,可按需修改 private static final int SIMULATE_TIMES = 2000000; public static void main(String[] args) { int[] statResult = simulateCoinFlips(SIMULATE_TIMES); printStatResult(statResult[0], statResult[1]); } // 执行指定次数的抛硬币模拟,返回统计结果 private static int[] simulateCoinFlips(int simulateTimes) { int heads = 0; int tails = 0; for(long simulation = 1; simulation <= simulateTimes; simulation++) { int flipResult = flipCoin(); if(flipResult == 1) { heads++; } else { tails++; } } return new int[]{heads, tails}; } // 单次抛硬币逻辑 private static int flipCoin() { return (int) (Math.random() + 0.5); } // 输出统计结果 private static void printStatResult(int heads, int tails) { System.out.println("Number of heads appeared: " + heads); System.out.println("Number of tails appeared: " + tails); } }
2. 十进制转十六进制代码重构
原有待修改问题
- 输入获取、转换逻辑、结果输出全部耦合在main方法,转换逻辑无法复用
- 十六进制映射数组硬编码在方法内部,没有提取为全局常量
- 未处理输入为0的边界情况,输入0时会输出空字符串
重构方案
拆分4个逻辑单元:
- 提取十六进制映射数组为类静态常量
getInputDecimal():负责从控制台获取用户输入的十进制整数decToHex(int decimal):核心转换逻辑单独提取,接收十进制数返回十六进制字符串,补充0值边界处理printConvertResult(String hexStr):负责输出转换结果
重构后代码
import java.util.Scanner; public class DecToHex { // 十六进制字符映射常量 private static final char[] HEX_CHARS = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; public static void main(String[] args) { int decimal = getInputDecimal(); String hexStr = decToHex(decimal); printConvertResult(hexStr); } // 获取用户输入的十进制数 private static int getInputDecimal() { Scanner input = new Scanner(System.in); System.out.print("Enter a decimal number: "); return input.nextInt(); } // 十进制转十六进制核心逻辑 private static String decToHex(int decimal) { // 处理0值边界 if(decimal == 0) return "0"; int rem; String result = ""; int number = decimal; while(number > 0) { rem = number % 16; result = HEX_CHARS[rem] + result; number = number / 16; } return result; } // 输出转换结果 private static void printConvertResult(String hexStr) { System.out.println("Hexadecimal Number: "+ hexStr); } }
3. 日期计算对应星期代码重构
原有待修改问题
- 输入获取、计算逻辑、结果输出全部耦合在main方法,计算能力无法复用
- 方法命名
ZCAlgo可读性极差,无法直接看出方法作用 - 未做参数合法性校验,输入非法日期(如月份13、日期32)时会返回错误结果
- 两个版本仅差异为方法注释,合并后补充标准方法注释即可
- 存在拼写错误:
Thurday应为Thursday
重构方案
拆分4个逻辑单元:
- 提取星期映射为静态常量数组,替换冗余的switch分支
getDateInput():负责获取用户输入的年、月、日,同时校验参数合法性calculateDayOfWeek(int year, int month, int day):原ZCAlgo方法重命名,保留蔡勒公式逻辑,补充参数校验,修正拼写错误printDayOfWeekResult(String dayName):负责输出计算结果
重构后代码
import java.util.Scanner; public class DayOfTheWeek { // 星期映射常量 private static final String[] WEEK_DAYS = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}; public static void main(String[] args) { int[] dateInput = getDateInput(); String dayOfWeek = calculateDayOfWeek(dateInput[0], dateInput[1], dateInput[2]); printDayOfWeekResult(dayOfWeek); } // 获取并校验用户输入的日期 private static int[] getDateInput() { Scanner input = new Scanner(System.in); System.out.print("Enter Year: (e.g., 2012): "); int year = input.nextInt(); System.out.print("Enter Month: 1-12: "); int month = input.nextInt(); if(month < 1 || month > 12) throw new IllegalArgumentException("月份范围必须为1-12"); System.out.print("Enter the Day of the month: 1-31:"); int day = input.nextInt(); if(day < 1 || day > 31) throw new IllegalArgumentException("日期范围必须为1-31"); return new int[]{year, month, day}; } /** * 基于蔡勒公式计算对应星期 * @param year 年份 * @param month 月份 1-12 * @param day 日期 1-31 * @return 星期名称 */ public static String calculateDayOfWeek(int year, int month, int day) { if (month == 1 || month == 2) { month += 12; year--; } int q = day; int m = month; int k = year % 100; int j = year / 100; int h = q + 13*(m + 1) / 5 + k + k / 4 + j / 4 + 5 * j; h = h % 7; return WEEK_DAYS[h]; } // 输出结果 private static void printDayOfWeekResult(String dayName) { System.out.println("Day of the week is "+ dayName); } }
内容的提问来源于stack exchange,提问作者Cyrtus. Cy
相关产品推荐
相关产品推荐

