例如......
if ( /* Condition */ ) {
if ( /* Condition */ ) {
if ( /* Condition */ ) {
// Superb!
} else {
// Error 3
}
} else {
// Error 2
}
} else {
// Error 1
}
你知道如何避免这种情况吗?谢谢!
答案 0 :(得分:11)
如果这是一个库函数,throw
可能是适当的操作。
if (!condition1) {
throw "Condition 1 failed.";
}
if (!condition2) {
throw "Condition 2 failed.";
}
if (!condition3) {
throw "Condition 3 failed.";
}
// Superb!
其他可接受的行动可能是:
0
,null
或undefined
。您必须确定哪种失败操作适合您的用例。
答案 1 :(得分:2)
看起来你需要检查3个条件和4个动作(3个不同的错误+ 1个成功)。不幸的是,在一般情况下,它需要3次条件检查和4次操作。我认为通过使用以下结构可以清除代码
if (! /* condition 1 */ ) {
// Error 1
} else if (! /* condition 2 */ ) {
// Error 2
} else if (! /* condition 3 */ ) {
// Error 3
} else {
// superb
}
答案 2 :(得分:1)
您可以使用异常,或在块内或多个函数中断。通常这需要反转您的条件以正确的方式订购代码。
do {
if (! /* Condition 1 */ ) {
// Error 1
break;
}
if (! /* Condition 2 */ ) {
// Error 2
break;
}
if (! /* Condition 3 */ ) {
// Error 3
break;
}
// Superb!
} while (false);
do-while(false)循环是一种创建一个块的方法,你可以使用不会容忍匿名块的语言。它可以很容易地成为函数并使用返回,或者是带有异常的try-catch。
答案 3 :(得分:0)
你更喜欢这个吗?
if ( /* Condition 1*/ && /* Condition 2*/ && /* Condition 3 */) {
// Superb!
}
else if (! /* Condition 1*/){
// Error 1
}
else if (! /* Condition 2*/){
// Error 2
}
else if (! /* Condition 3*/){
// Error 3
}
答案 4 :(得分:0)
if ( ! /* Condition */ ) {
Error 1
throw someSortOfException
}
if (! condition 2){
Error 2
throw someSortOfOtherException
}
if (! condition 3){
Error 3
throw another Exception
}
// Success!
根据具体情况,您的代码可能更受欢迎。例如,您可能希望在某处捕获这些异常。
答案 5 :(得分:0)
if (!condition1)
// Error 1 (and exit scope if necessary)
if (!condition2)
// Error 2 (and exit scope if necessary)
if (!condition3)
// Error 3 (and exit scope if necessary)
// Superb!
答案 6 :(得分:0)
是;您可以使用AND运算符将if
语句组合成单个复合语句,并在单个块中处理错误条件。但是,根据您的错误处理需求,您可能需要再次使用多个if
来确保正确处理错误(这实际上取决于您的错误处理解决方案)。
即便:
if (CondA && CondB && CondC)
{
// Execute success
}
else
{
if (!CondA)
// Do error A
else if (!CondB)
// Do error B
else if (!CondC)
// Do error C
}
}
答案 7 :(得分:0)
有几种方法,最简单的方法是简单地删除一些函数并抽象出不同的层(如果你发现自己深入了,这应该做到。)
if ( /* Condition */ ) {
value = aFunctionSaysWhat();
} else {
// value = Error 1
}
....
value aFunctionSaysWhat(){
if ( /* Condition */ ) {
return aSecondFunctionHere();
} else {
// return Error 2
}
}
基本前提是如果可能的话,函数应该存在于一个抽象层上,并做一件事。
下一种可能性是将它全部展开,这比初始的嵌套方法更优越,但基本上具有相似的复杂性。如果您只有几个选项并且不打算添加更多选项,那么它可能比功能方法更清晰。
if(ErrorCondition1){
//Error 1
}else if(ErrorCondition2){
//Error 2
}else if(ErrorCondition3){
//Error 3
}else{
//Superb
}
最后,你可以存储一个带有所需答案的哈希或地图,如果完全删除,那么实现它的能力取决于你散列某些结果的能力:
Results = {'Result1':'Error1', 'Result2':'Error2', 'Result3':'Error3', 'Success':'Superb'}
return Results[ConditionHash(Condition)];