• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

奋斗的软件工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

用户输入数据的模块化重构实践

用户输入数据的模块化重构实践

背景介绍

在日常开发中,处理用户输入是一个非常常见的需求。一个看似简单的用户名和密码输入功能,如果考虑到代码的可维护性、可读性和可扩展性,其实是有很多优化空间的。本文将通过一个具体的案例,展示如何对用户输入处理代码进行模块化重构。

问题描述

在最初的代码实现中,我们往往会写出这样的代码:

private static User getUserData1() {
    while (true) {
        System.out.println("请输入用户名:");
        String name = scanner.nextLine();
        
        if(name.isEmpty()){
            System.out.println("用户名不能为空,请重新输入~~~");
            scanner.nextLine();
            continue;
        } else {
            while (true) {
                System.out.println("请输入密码:");
                String pwd = scanner.nextLine();
                if(pwd.isEmpty()){
                    System.out.println("密码不能为空,请重新输入~~~");
                    scanner.nextLine();
                    continue;
                } else {
                    return new User(name,pwd);
                }
            }
        }
    }
}

这种实现方式存在以下问题:

  1. 代码结构复杂,使用了嵌套循环
  2. 验证逻辑和输入逻辑耦合
  3. 代码复用性差
  4. 难以维护和扩展

重构方案

为了解决上述问题,我们采用模块化的思想进行重构:

private static User getUserData2() {
    String name = getUserName();
    String pwd = getUserPwd();
    return new User(name, pwd);
}

private static String getUserName() {
    return getValidInput("请输入用户名:", "用户名不能为空,请重新输入~~~");
}

private static String getUserPwd() {
    return getValidInput("请输入密码:", "密码不能为空,请重新输入~~~");
}

private static String getValidInput(String prompt, String errorMessage) {
    String input = null;
    scanner.nextLine();
    while (true) {
        System.out.println(prompt);
        input = scanner.nextLine();
        
        if (input.isEmpty()) {
            System.out.println(errorMessage);
            scanner.nextLine();
            continue;
        } else {
            return input;
        }
    }
}

重构后的优势

  1. 代码结构清晰

    • 每个方法职责单一
    • 方法名称直观表达功能
    • 逻辑层次分明
  2. 提高复用性

    • 通用的输入验证方法
    • 可以轻松扩展到其他输入场景
    • 降低代码重复
  3. 易于维护和扩展

    • 修改验证规则只需要改一处代码
    • 添加新的验证规则方便
    • 可以轻松添加新的输入项
  4. 更好的错误处理

    • 统一的错误提示机制
    • 便于日后添加日志记录
    • 利于异常处理的统一管理

后续优化建议

  1. 添加更多输入验证
public class InputValidator {
    public static boolean isValidUsername(String username) {
        return username != null && 
               username.length() >= 3 && 
               username.length() <= 20 &&
               username.matches("^[a-zA-Z0-9_]+$");
    }
    
    public static boolean isValidPassword(String password) {
        return password != null &&
               password.length() >= 6 &&
               password.matches(".*[A-Z].*") &&
               password.matches(".*[a-z].*") &&
               password.matches(".*\\d.*");
    }
}
  1. 引入异常处理机制
public class InputException extends Exception {
    public InputException(String message) {
        super(message);
    }
}
  1. 考虑添加配置项
public class InputConfig {
    private static final int MAX_RETRY_TIMES = 3;
    private static final int MIN_USERNAME_LENGTH = 3;
    private static final int MAX_USERNAME_LENGTH = 20;
    // ... 其他配置项
}

总结

通过这次重构实践,我们可以看到:

  1. 好的代码结构对于项目的长期维护至关重要
  2. 模块化设计能够显著提升代码质量
  3. 单一职责原则的应用能够使代码更加清晰
  4. 良好的抽象能够提高代码的复用性

这个案例虽然简单,但体现了软件工程中重要的设计原则。在实际开发中,我们应该始终保持这种追求代码质量的态度,不断优化和改进我们的代码结构。

参考资料

  • Clean Code: A Handbook of Agile Software Craftsmanship
  • Refactoring: Improving the Design of Existing Code
  • Design Patterns: Elements of Reusable Object-Oriented Software

posted on 2024-11-05 20:47  周政然  阅读(62)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3