【问题标题】:Java Error/Exception handling with returning value带有返回值的 Java 错误/异常处理
【发布时间】: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


【解决方案1】:

第一种方法比第二种方法好得多。

  1. 单一职责:您应该避免创建做不止一件事的方法。
  2. 开放-封闭原则:您的“验证”不可扩展。尝试创建一个Validator 接口,然后为每个验证类型创建一个实现。
  3. Switch 语句会增加圈复杂度并增加测试难度。

另外,不要在任何地方使用textField.getText(),它很可能会在调用之间发生变化。将其分配给局部变量,或者更好地使用String 作为您的参数,而不是JText。正如 Fildor 指出的那样,您正确地避免使用异常进行流控制,并且确实最好有一个返回点。话虽如此,对于简单的情况,当你只是解析/检查并返回时,它是可以接受的。

【讨论】:

  • 已经 +1,但是您能否添加一行关于 OP 对这种情况下的“异常控制流”的怀疑?
  • 确实,我指出了第二种方法的问题。谢谢
【解决方案2】:

您应该将每个检查放在一个函数中。一段时间后,您的“多合一功能”将变得无法阅读且无法维护。如果它们在单个功能中,也更容易更改检查。使用 try/catch 进行控制流不是一个好主意。它在运行时很昂贵。这不是一种好的风格,大多数开发人员不会期望控制流出现在 catch 块中。Excpetions 是针对特殊情况的。

【讨论】:

  • 输入不是数字,因此解析失败异常。在 C# 中,我建议使用 TryParse,但这在 Java 中不可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
  • 2017-02-27
  • 2021-09-08
  • 1970-01-01
相关资源
最近更新 更多