所以我和我的 friend 正在用 Java 编程 Blackjack,我们想测试我们的输入字段是否正确输入(例如仅输入数字)。所以我们坐在他的电脑前,他写了这个解决方案:
public static boolean testeTextFieldInt(JTextField textField, int geld) {
if (!textField.getText().isEmpty()) {
try {
if(Integer.parseInt(textField.getText())>0 && Integer.parseInt(textField.getText())<geld ) {
return true;
}
} catch (NumberFormatException e) {
return false;
}
}
return false;
}
现在我不同意这个解决方案,因为你的代码不应该依赖于错误,还是我弄错了?所以我坐下来写了这个:
public static boolean checkInput(JTextField textField, int spielerGeld, String eingabe) {
boolean matched = false;
switch (eingabe) {
case "num":
if (!textField.getText().isEmpty() && textField.getText().matches("^[0-9]*$")) {
int geldinput = Integer.parseInt(textField.getText());
if (geldinput > 0 && geldinput < spielerGeld) {
matched = true;
}
}
break;
case "string":
if (!textField.getText().isEmpty() && textField.getText().matches("^[a-zA-Z]*$")) {
matched = true;
}
break;
default:
break;
}
return matched;
}
请记住,我们还没有任何需要检查的文本字段,但我只是实现它来了解如何在一种方法中进行多次检查。
所以现在我的问题是,什么代码“更好”?我们/我可以做得更好吗?
提前致谢!
编辑1: 正如一些人已经提到的,你说我的方法不是在单一责任原则之后建立的。 但是,如果分成“checkInputIsnumber”和“checkInputIsString”,第一个解决方案(我的 friend )仍然是“更好”的解决方案吗?
编辑2: 更好的定义是,该方法应该具有低圈复杂度、易于阅读并且易于长期维护。
最佳答案
第一种方法比第二种方法好得多。
- 单一职责:您应该避免创建执行多项任务的方法。
- 开闭原则:您的“验证”是不可扩展的。尝试创建一个
Validator
接口(interface),然后为每个验证类型创建一个实现。 - Switch 语句会增加圈复杂度并使测试变得更加困难。
另外,不要到处使用 textField.getText()
,它很可能在调用之间发生变化。将其分配给局部变量,或者更好地使用 String
作为参数,而不是 JText
。正如 Fildor 指出的那样,您正确地避免使用异常进行流量控制,并且拥有单个返回点确实更好。话虽如此,对于简单的情况,只需解析/检查并返回,这是可以接受的。
关于带返回值的 Java 错误/异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53185798/