在包含原理图条件语句的方法中减少代码数量的方法有哪些?
放置此类代码的良好做法。它应该采用不同的方法/类别吗?
Java中的示例代码。它包含一个重复两次的方案:
if (calculation[i].equals("*")) {
if (stack.canDoOperation()) {
times();
} else {
operationFailed = true;
}
} else if (calculation[i].equals("+")) {
if (stack.canDoOperation()) {
sum();
} else {
operationFailed = true;
}
}
答案 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语句:
!operationFailed
将首先完成(如果您无法执行操作,则operationFailed将为true; !!stack.canDoOperation()
(stack.canDoOperation()
= if (!(operationFailed = !stack.canDoOperation())) {
switch(calculation[i]){
case "*": times(); break;
case "+": sum(); break;
}
)的值将用于if测试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;
}
然而,在不知道其余代码的情况下,我们不清楚这是否是一个好的解决方案。