Asp classic 从经典ASP中的函数中提前返回

Asp classic 从经典ASP中的函数中提前返回,asp-classic,Asp Classic,在经典ASP中,有没有一种方法可以让函数提前返回,而不是让它运行整个函数?例如,假设我有一个函数 Function MyFunc(str) if (str = "ReturnNow!") then Response.Write("What up!") else Response.Write("Made it to the end") end if End Function 我可以这样写吗 Function MyFunc(str) if (

在经典ASP中,有没有一种方法可以让函数提前返回,而不是让它运行整个函数?例如,假设我有一个函数

Function MyFunc(str)
  if (str = "ReturnNow!") then
    Response.Write("What up!")       
  else
    Response.Write("Made it to the end")     
  end if
End Function
我可以这样写吗

Function MyFunc(str)
  if (str = "ReturnNow!") then
    Response.Write("What up!")       
    return
  end if

  Response.Write("Made it to the end")     
End Function

请注意return语句,这在经典ASP中当然是做不到的。有没有办法在返回语句所在的位置中断代码执行?

是,使用
退出函数

Function MyFunc(str)
  if str = "ReturnNow!" then
    Response.Write("What up!")       
    Exit Function
  end if

  Response.Write("Made it to the end")     
End Function
我通常在从函数返回值时使用它。


对于经典ASP,您需要使用退出功能

Function MyFunc(str)
  if (str = "ReturnNow!") then
    Response.Write("What up!")       
    Exit Function
  end if

  Response.Write("Made it to the end")     
End Function

如前所述,您可以使用退出功能,但应谨慎使用。在您给出的简单示例中,没有其他代码可以执行的优势 无论如何

在整个代码块中放置退出点会使跟踪和调试变得困难。更严重的是,它会导致后续的代码更改更加困难,需要更广泛的更改,从而增加风险。因此,这种模式应被视为“异味”

其合理可接受的典型场景是,在继续代码主体之前,代码可能会对其输入参数做出一些断言。除此之外,你应该能够表达一个非常非常好的理由去做


您可能会说“如果我这样做,我将拥有更多的
If
结构,并过度增加代码中的标识”。如果是这样的话,那么函数中的代码就太多了,应该重构成更小的函数。

有一些优点。这绝对是一个非常简单的示例,我使用它只是为了找出正确的语法。我确实要提到你的最后一点:如果不使用“exit”,那么就有更多的“if”结构和增加缩进。就我个人而言,我认为这是一个“宗教战争”的问题,因为编程更多的是个人偏好的问题。不管怎样,你的反馈很好,所以谢谢你。@Rob:我将“宗教”问题定义为选择一方或另一方对结果影响很小或没有影响的问题。另一方面,最佳实践是关于选择一方或另一方会显著影响最终结果的问题。作为一般规则(请记住,任何规则都不是绝对的),任何可识别的代码块都有一个入口点和一个出口点是“最佳实践”。函数、if语句、循环等也是如此。
退出函数
是一个有用的工具,当发现“最佳实践”的合理例外时。确实,函数有一个入口点和出口点是有意义的,我同意这是一个好的实践。我使用“Exit Function”调用的主要原因是您已经提到的一点,即执行各种断言和/或验证。我知道我迟到了7年,但在其他语言中键入
return“What's up”
无论如何都会退出函数。。。我来这里是因为我想在函数中返回false,但是代码的其余部分正在执行并弄乱了结构。我完全同意退出点是不好的,但在这种情况下,它们是正常代码。Return退出函数,因此正确地调用了
退出函数
<另一方面,code>goto也很晚,但这样做可能有原因:例如,一个函数基于多个条件返回true/false,如果其中一个条件的评估成本很高,那么构建函数以尽早进行廉价测试是值得的,如果为false,则尽早返回,然后,只有在廉价测试是真实的情况下,才能继续使用更昂贵的支票。
Function MyFunc(str)
  if (str = "ReturnNow!") then
    Response.Write("What up!")       
    Exit Function
  end if

  Response.Write("Made it to the end")     
End Function