重复if语句减少

时间:2017-12-10 15:33:32

标签: java if-statement switch-statement

在包含原理图条件语句的方法中减少代码数量的方法有哪些?

放置此类代码的良好做法。它应该采用不同的方法/类别吗?

Java中的示例代码。它包含一个重复两次的方案:

if (calculation[i].equals("*")) {
    if (stack.canDoOperation()) {
        times();
    } else {
        operationFailed = true;
    }
} else if (calculation[i].equals("+")) {
    if (stack.canDoOperation()) {
        sum();
    } else {
        operationFailed = true;
    }
}

4 个答案:

答案 0 :(得分:4)

您可以编写一个辅助方法,将给定的操作方法包装到常用的检查中。您也可以在其中放置try/catch,以防操作失败。

private boolean tryOperation(Runnable operation) {
    if (stack.canDoOperation()) {
        operation.run();
        return true;
    } else {
        return false;
    }
}

并像这样使用:

if (calculation[i].equals("*")) {
    operationFailed = ! tryOperation(this::times);
} else if (calculation[i].equals("+")) {
    operationFailed = ! tryOperation(this::sum);
}

或者,使用Java 8,您可以将对这些操作的方法引用放入Map

Map<String, Runnable> operations = new HashMap<>();
operations.put("*", this::times);
operations.put("+", this::sum);
...

Runnable operation = operations.get(calculation[i]);
if (operation != null && stack.canDoOperation()) {
    operation.run();
} else {
    operationFailed = true;
}

您还可以将两种方法结合起来:

operationFailed = ! tryOperation(operations.get(calculation[i]);

答案 1 :(得分:0)

以下是如何使用重复语句的一些示例。为了更清晰,如果它没有破坏你的逻辑,你可以将stack.canDoOperation()提取到变量。您也可以考虑将其移至方法开头的断言,而不是将calculation[i]放入switch语句。

if (calculation[i].equals("*") && stack.canDoOperation()) {
        times();
    }
} else if (calculation[i].equals("+")  && stack.canDoOperation()) {
        sum();
    }
} else {
        operationFailed = true;
}

答案 2 :(得分:0)

您可以将switch语句用于if,也可以更合乎逻辑的方式:检查是否可以执行操作,如果是,请查找哪一个:

operationFailed = !stack.canDoOperation()

您还可以将operationFailed的值赋予if语句:

  1. !operationFailed将首先完成(如果您无法执行操作,则operationFailed将为true;
  2. !!stack.canDoOperation()stack.canDoOperation() = if (!(operationFailed = !stack.canDoOperation())) { switch(calculation[i]){ case "*": times(); break; case "+": sum(); break; } )的值将用于if测试
  3. CDVPlugin

答案 3 :(得分:0)

从Java 7开始,switch可以超过String

switch (calculation[i]) {
    case "*":
        times();
        break;
    case "+":
        sum();
        break;
}

此外,对于每种计算类型,您都在重复canDoOperation检查。你搞清楚这张支票会更好:

if (stack.canDoOperation()) {
    operationFailed = true;
}
else {
    switch ... // Your switch statement
}

我建议你将这些操作转移到另一个方法:

/**
 * Performs the specified operation.
 * @param The operation to perform.
 * @return True if the operation was succeeded, false otherwise.
 */
boolean performOperation(String operation) {
    if (!stack.canDoOperation()) {
        return false;
    }
    switch (operation) {
        case "*":
            times();
            break;
        case "+":
            sum();
            break;
        default:
            return false;
    }
    return true;
}

然而,在不知道其余代码的情况下,我们不清楚这是否是一个好的解决方案。