首页 > 其他分享 >用户输入数据的模块化重构实践

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

时间:2024-11-05 20:43:21浏览次数:3  
标签:重构 String nextLine 模块化 代码 private static 输入

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

背景介绍

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

问题描述

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

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

标签:重构,String,nextLine,模块化,代码,private,static,输入
From: https://www.cnblogs.com/itcq1024/p/18528769

相关文章

  • 浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
    文章目录前言浏览器中输入URL返回页面全过程DNS域名解析过程TCP的三次握手、四次挥手一、浏览器中输入域名二、解析域名2.1具体过程2.2知识补充2.2.1域名体系结构2.2.2查询方式——递归查询、迭代查询2.2.3DNS域名解析过程三、浏览器与目标服务器建立T......
  • 电动两轮车上所使用的车充芯片 CSM3820SG,能够支持 100V 以内的电压输入,输出为 5V-2A。
    如今,在美团外卖骑手、跑腿服务以及家用等领域,电动两轮车极为受欢迎。倘若为电动车配备可给手机充电的接口,将会给广大消费者带来极大的便利。然而,电动两轮车的电瓶电压较高,通常为36V-48V,甚至72V电池供电。普通的降压DC-DC无法承受如此高的输入电压。而芯生美研发的CSM382......
  • C++——输入一个字符串,内有数字和非数字字符,如a123x456_ 17960?302tab5876将其中连续
    没注释的源代码#include<iostream>#include<stdio.h>usingnamespacestd;intmain(){  charstr[50],*pstr;  inti,j,k,m,e10,digit,ndigit,a[10],*pa;  cout<<"pleaseinputstring:"<<endl;  gets(str);  pstr=&str[......
  • H5登录界面输入账号密码,在ios苹果微信手机上输入框上下闪烁问题
    场景描述:H5登录界面输入账号密码,在ios苹果微信手机上输入框上下闪烁问题苹果手机的浏览器就有了自动填充密码的功能,具体来说就是一个手机号密码登录的页面,ios识别到当前页面有密码输入框,所以触发了自动填充密码的功能。解决办法:在2个输入框中间加个隐藏输入框核心代码:<inpu......
  • 【代码重构】工程质量评价利器之圈复杂度和认知复杂度
    文章目录一、前言二、圈复杂度1.圈复杂度概念2.圈复杂度计算2.1手动计算2.2MetricsReloaded插件统计3.降低圈复杂度的方式3.1利用Optional类优化3.2抽取方法3.3集合替代switch分支3.4设计模式替代if嵌套分支3.5使用工具类3.6使用卫语句三、认知复杂度1.认......
  • 大模型解决长文本输入问题
    前段时间,不知道为什么Kimi突然在各大平台爆火,dyb站都能看到它的身影。抱着试试看的态度,我也去体验了一下Kimi的效果,我只能说一言难尽。。。。。。国产模型我还是回去用通义千问吧哈哈哈哈哈。圆规正转,今天想聊的是Kimi的“护城河”--大模型如何来解决长上下文输入问题。前......
  • java代码重构 接口和接口实现类合并
    maven<dependency><groupId>com.github.javaparser</groupId><artifactId>javaparser-core</artifactId><version>3.24.0</version></dependency>代码packagecom.xx;i......
  • 移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (8) - 原生输入法
    AWTK在嵌入式平台使用内置的输入法,在移动设备上使用系统的原生输入法。在AWTK-Android和AWTK-IOS中,使用的是SDL封装之后的系统原生输入法。在AWTK-HarmonyOS中,要使用系统的原生输入法。需要实现input_method接口:1.启动输入法编辑器得到焦点时,启动输入法。调......
  • 《C语言程序设计现代方法》note-2 格式化输入/输出 运算符和表达式
    助记提要转换说明的格式;scanf处理输入的过程;除法操作的注意事项;运算符的结合性;不在子表达式中输入操作数的原因;表达式允许用作语句的问题;3章格式化输入/输出3.1printf函数printf函数用来显示格式串的内容,并在该串中指定位置插入要显示的值。printf(格式串,表达式1,......
  • LDO输入端和输出端到底要不要并联一个二极管?
    更多电路设计,PCB设计分享及分析,可关注本人微信公众号“核桃设计分享”!在很多原理图或者手册中经常看到LDO的输出和输入会并联一个二极管,那这个二极管到底有什么作用?有没有必要加?我们今天来聊一聊!一般我们设计的LDO电路是比较简单的,如下图1所示:图1其中图1中的稳压二极管......