【发布时间】:2019-04-10 15:59:38
【问题描述】:
所以我和我的朋友正在用 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;
}
请记住,我们还没有必须检查的任何文本字段,但我只是实现了它以了解如何在一种方法中进行多项检查。
所以现在我的问题是,什么代码“更好”?以及我们/我可以做得更好吗?
提前致谢!
EDIT1: 所以正如一些已经提到的,你说我的方法不是建立在单一责任原则之后。 但是,如果拆分为“checkInputIsnumber”和“checkInputIsString”,第一个解决方案(我的朋友)仍然是“更好”的解决方案吗?
EDIT2: Better 定义为,该方法应具有低圈复杂度、易读性和易于长期维护的特点。
【问题讨论】:
-
取决于您对“更好”的定义。可能因“有意见的问题”而关闭。
-
但是无论如何:如果你想要一个函数来检查每个案例,那么将它拆分为检查一个案例的函数,并且让“父”函数只选择其中一个。在我碰巧有幸工作过的所有开发团队中,将多个职责归入一个功能被认为是“不干净的”。
-
@Fildor,所以如果我得到你所说的正确,你会建议我将方法分成两个单独的方法:'checkInputIsNumber'和'checkInputIsString'?
-
是的,“单一职责” => 1. 输入的是数字吗? 2. Input 是字符串吗? 3. 我检查数字还是字符串?一切都是为了 Diadistis 回答中的原因。
-
好的。检查用户输入:绝对是必须做的,是的。但是这里有两种“类型”的错误:1. 输入 is 是一个数字但“超出范围” 2. 输入不是数字(即非法字符)。我个人会分两步解决这些问题。 1 函数(用于键入 value 的“验证器”)检查范围:首先接受 int。在检查字符串输入是否具有正确的格式(预期格式的“验证器”)后使用那个。
标签: java validation input error-handling return-value