You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:36:01