所以我和我的朋友正在用Java编程二十一点,我们想测试输入字段的正确输入(例如,数字输入)。因此我们坐在他的PC上,他编写了以下解决方案:
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: 较好的定义是,该方法应具有较低的圈复杂度,易读性并易于长期维护。
答案 0 :(得分:1)
第一种方法比第二种方法好得多。
Mono.empty()
接口,然后创建每个验证类型的实现。此外,不要在任何地方都使用fromCallable
,它很有可能会在两次调用之间改变。将其分配给局部变量,甚至最好使用Validator
作为参数,而不要使用textField.getText()
。正如Fildor所指出的那样,您正确地避免使用异常进行流控制,确实最好有一个返回点。话虽如此,对于简单的情况,只要您解析/检查并返回,就可以接受。
答案 1 :(得分:0)
您应该将所有检查都放在一个函数中。过了一会儿,您的“多功能一体机”将变得难以理解且难以维护。此外,如果支票属于单一功能,则更容易更改支票。对控制流使用try / catch并不是一个好主意。它在运行时很昂贵。这不是一个好的样式,大多数开发人员都不希望在catch块中有控制流。例外是针对特殊情况。