用户输入数据的模块化重构实践
背景介绍
在日常开发中,处理用户输入是一个非常常见的需求。一个看似简单的用户名和密码输入功能,如果考虑到代码的可维护性、可读性和可扩展性,其实是有很多优化空间的。本文将通过一个具体的案例,展示如何对用户输入处理代码进行模块化重构。
问题描述
在最初的代码实现中,我们往往会写出这样的代码:
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);
}
}
}
}
}
这种实现方式存在以下问题:
- 代码结构复杂,使用了嵌套循环
- 验证逻辑和输入逻辑耦合
- 代码复用性差
- 难以维护和扩展
重构方案
为了解决上述问题,我们采用模块化的思想进行重构:
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;
}
}
}
重构后的优势
-
代码结构清晰
- 每个方法职责单一
- 方法名称直观表达功能
- 逻辑层次分明
-
提高复用性
- 通用的输入验证方法
- 可以轻松扩展到其他输入场景
- 降低代码重复
-
易于维护和扩展
- 修改验证规则只需要改一处代码
- 添加新的验证规则方便
- 可以轻松添加新的输入项
-
更好的错误处理
- 统一的错误提示机制
- 便于日后添加日志记录
- 利于异常处理的统一管理
后续优化建议
- 添加更多输入验证
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.*");
}
}
- 引入异常处理机制
public class InputException extends Exception {
public InputException(String message) {
super(message);
}
}
- 考虑添加配置项
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;
// ... 其他配置项
}
总结
通过这次重构实践,我们可以看到:
- 好的代码结构对于项目的长期维护至关重要
- 模块化设计能够显著提升代码质量
- 单一职责原则的应用能够使代码更加清晰
- 良好的抽象能够提高代码的复用性
这个案例虽然简单,但体现了软件工程中重要的设计原则。在实际开发中,我们应该始终保持这种追求代码质量的态度,不断优化和改进我们的代码结构。
参考资料
- Clean Code: A Handbook of Agile Software Craftsmanship
- Refactoring: Improving the Design of Existing Code
- Design Patterns: Elements of Reusable Object-Oriented Software