哪一个更好,有条件的循环或for循环中断(对于短代码块)?

时间:2017-02-10 22:46:35

标签: java for-loop break

我试图找出哪些实践使您的代码更具可读性,特别是当您的代码块很短时。请查看for循环的这两个版本,让我知道哪一个更易读;

    private boolean isValid(String guessInput)
    {
        boolean result = true;

        for (int i = 0; i < guessInput.length(); i++)
        {
            if (!Character.isDigit(guessInput.charAt(i)))
            {
                result = false;
                break;

            }
        }if (result)
        {
            int guessInputInt = Integer.parseInt(guessInput);
            if (guessInputInt >= minGuess && guessInputInt < maxGuess)
                guesses.add(guessInput);
            else
                result = false;

        }else
            System.out.println("Your input is not valid.");

        return result;
    }

第2版

    private boolean isValid(String guessInput)
    {
        boolean result = true;

        for (int i = 0; i < guessInput.length() && result; i++)
        {
            if (!Character.isDigit(guessInput.charAt(i)))
            {
                result = false;

            }
        }if (result)
        {
            int guessInputInt = Integer.parseInt(guessInput);
            if (guessInputInt >= minGuess && guessInputInt < maxGuess)
                guesses.add(guessInput);
            else
                result = false;

        }else
            System.out.println("Your input is not valid.");

        return result;
    }

6 个答案:

答案 0 :(得分:0)

break循环方法在两者中更好。此外,您可以在循环中移动Sysout语句,例如:

private boolean isValid(String guessInput){

for (int i = 0; i < guessInput.length() && result; i++){
   if (!Character.isDigit(guessInput.charAt(i))){
        return false;
   }
}
return true;

<强>更新

这是另一种方法(使用java 8流):

public static boolean isValid(String s){
    return !s.chars()
            .filter(c -> !Character.isDigit((char)c))
            .findFirst()
            .isPresent();
}

同意Mark Jeronimus的观点。您应该在调用方法时调用此方法和print消息,而不是在valildating方法中使用Sysout

答案 1 :(得分:0)

第三种选择如何:

private boolean isValid(String guessInput) {
    boolean result = isNumeric(guessInput);
    if (result)
    // ...
}

private boolean isNumeric(String input) {
    for (int i = 0; i < guessInput.length(); i++)
        if (!Character.isDigit(guessInput.charAt(i)))
            return false;

    return !input.isEmpty();
}

甚至更简单:

private boolean isValid(String guessInput) {
    try {
        int guessInputInt = Integer.parseInt(guessInput);
        if (guessInputInt >= minGuess && guessInputInt < maxGuess) {
            guesses.add(guessInput);
            return true;
        }
    } catch (NumberFormatException nfe) {
        System.out.println("Your input is not valid.");
    }
    return false;
}

在旁注中,方法名称isValid()意味着只读读取器,当您修改状态时,这会产生误导。

答案 2 :(得分:0)

为此,我喜欢使用

public boolean isValid(String s) {
    if (isNum(s)) {
        Integer num = Integer.parseInt(s);
        return inRange(num, maxGuess, minGuess);
    }
    return false;
}

private boolean inRange(Integer i, Integer max, Integer min) {
    return (i < max && i >= min);
}

private boolean isNum(String s) {
    return s.chars().allMatch(Character::isDigit);
}

正如其他人所提到的System.out.println("Your input is not valid.");最好由isValid函数的消费者完成,

isValid分解为较小的操作有助于 MURDER

你可以阅读有关谋杀here

的内容

答案 3 :(得分:0)

在你的循环中,如果你可以在for循环中准确地指定循环中断条件,那总是更好。

我一直认为break是黑客/补丁/修复,绝不是解决方案。

答案 4 :(得分:0)

具体到你的例子中关于循环中break的使用的问题,我认为代码可读性没有差别,因为它太短了。

但是,总的来说我更喜欢中断方法,因为:

  1. 一旦结果设置为false,就没有理由继续执行。根据“guessInput”的长度以及编译器如何优化代码,具有中断的代码可以更高效。

  2. 虽然在你的例子中for循环中的代码很短,但实际上它可能会随着条件变得更复杂而增长。通过始终突破它应该的循环,当循环中的代码变得更长或更复杂时,遵循代码逻辑将变得更容易。

  3. 因此,我总是倾向于在循环中使用break。

答案 5 :(得分:-1)

如果您的目的是验证数字,任何数字,那么您将使用API​​,并在数字无效时处理异常。

警告:在您的代码中,如果您的字符串超过2147483647,则无论如何都会抛出异常而未处理,从而导致错误。

这是一个更好的版本,虽然我仍然主张在纯粹的检查方法中分配责任,而另一种方法是将其添加到猜测和/或打印内容中。

private boolean isValid(String guessInput)
{
    try {
        int guessInputInt = Integer.parseInt(guessInput);
        if (guessInputInt >= minGuess && guessInputInt < maxGuess) {
            guesses.add(guessInput);
    } catch (NumberFormatException ex) {
        System.out.println("Your input is not valid.");
        return false;
    }
    return true;
}