【问题标题】:Where to perform argument validation in JavaScript?在 JavaScript 中哪里执行参数验证?
【发布时间】:2009-09-15 22:01:33
【问题描述】:

是的,正确阅读。上次我在 JavaScript(函数)中看到了不同的参数验证模式,并想知道其中哪一个是最佳实践。首先,我将展示两个示例代码 sn-ps。第一个显示(用我的话)“立即”参数/条件验证,第二个显示“延迟”验证。它们中的每一个都以不同的方式影响以下代码的外观。到目前为止,我一直使用“立即”验证。但是慢慢地,我开始怀疑将整个以下代码强制进入这样的条件块是否合理。请告诉我您的想法以及可能是“最佳”模式。

那么声明变量的地方呢?有几次我读到,所有变量都应该在实际使用之前声明到方法上。它是否正确?因为我认为在确定变量会被实际使用之前声明变量是没有用的(可能无效的参数会强制抛出异常),所以我将变量声明部分移到了参数/条件验证部分之外。这是可取的吗?

谢谢!

第一个例子:

if (   colorStops.constructor === Array 
    && colorStops.length
    && colorStops.every(function(c) {
        return c instanceof ColorStop  
    })) 
{
    var privateVar1 = "foo",
        privateVar2 = "bar",
        privateVar3 = "tutifrutti";

    // here goes the code
}
else {
    throw new TypeError("GradientCanvasFacade: cannot add Colors; " +
        "invalid arguments received");
}

第二个例子:

if (cg instanceof ColorGradient) {
    throw new TypeError("PresetManager: Cannot add preset; " +
        "invalid arguments received");
}

var privateVar1 = "foo",
    privateVar2 = "bar",
    privateVar3 = "tutifrutti";

// here goes the code
// Here goes the code that get executed when no explicit 
// return took place ==> all preconditions fulfilled

【问题讨论】:

  • 无论如何,不​​要使用“构造函数”。它不是在所有浏览器中,当它出现时,它根本不像听起来那样。坚持使用本机 JS 对象的 instanceof。

标签: javascript validation parameters arguments


【解决方案1】:

由于 JavaScript 变量的作用域是声明函数,而不是大多数其他语言的块,因此在函数开头声明变量很有意义。

function someFunc()
{
    if (1==1) 
    {
        var x = 1;
    } 
    else 
    {
        var x = 2;
    } 
    return x
}

现在想象一个更复杂的函数,至少对我来说,在开头声明 x 很有意义。对于通常绑定到块的变量(如迭代器变量或集合),我仍然在块中声明它们。

我肯定会选择您的第二个示例,不是因为它更早失败,因为实际上它没有,而是因为这样更容易删除和添加验证,而不会破坏复杂的 if 结构。

【讨论】:

    【解决方案2】:

    我会选择第二个,只是因为它更容易阅读。另外,对于第一个,如果你的函数很长,看到底部的人会想知道} 是做什么的,并且必须跳到顶部才能看到。

    变量的范围也非常清晰,即使对于忘记 javascript 有奇怪的范围规则的人来说也是如此。

    另外,正如 Martijn 所说,第二种方法更容易检查各种错误,即每个错误都可以有自己的if 语句等等。

    【讨论】:

      【解决方案3】:
      if (some condition) {
        if (some other condition based in the first) {
          if (another condition based in 1st and 2nd) {
            do_job();
          } else?
        } else?
      } else?
      

      在哪里放置 else 块?在每个 if 之后还是在最后一个之后?

      第二个选项似乎更具可读性

      【讨论】:

        猜你喜欢
        • 2015-01-29
        • 1970-01-01
        • 2011-07-01
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-20
        • 2023-03-21
        相关资源
        最近更新 更多