如何停止编写链码?

时间:2010-11-24 17:53:48

标签: javascript chain

例如......

if ( /* Condition */ ) {

    if ( /* Condition */ ) {

        if ( /* Condition */ ) {

          // Superb!

        } else {

          // Error 3

        }

    } else {

      // Error 2

    }

} else {

  // Error 1

}

你知道如何避免这种情况吗?谢谢!

8 个答案:

答案 0 :(得分:11)

如果这是一个库函数,throw可能是适当的操作。

if (!condition1) {
    throw "Condition 1 failed.";
}

if (!condition2) {
    throw "Condition 2 failed.";
}

if (!condition3) {
    throw "Condition 3 failed.";
}

// Superb!

其他可接受的行动可能是:

  • 返回0nullundefined
  • 向用户显示错误并返回。

您必须确定哪种失败操作适合您的用例。

答案 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)];