方法应该有多安全?

时间:2013-11-15 16:45:34

标签: javascript

当我写一些代码时,我想知道我的方法应该是多么安全。我应该相信我班级的用户吗?还是检查一切?这意味着参数类型检查可能不是一个好习惯,因为Javascript应该是鸭子类型。

基本上这导致了信任问题。有最好的做法吗?是否存在隐含的“合同”?

示例:

CarsCollection.prototype.get = function ( index ) {
    return this.collection[index];
};

或者

CarsCollection.prototype.get = function ( index ) {
    var self = this;

    if ( ! index ) {
        throw new ReferenceError();
    }

    if ( isNaN ( index ) ) {
        throw new TypeError();
    }

    return self.collection[index];
};

4 个答案:

答案 0 :(得分:1)

通常情况下,框架代码和可重用库是广泛参数检查的主要候选者,因为您(以及您当前和未来的同事)将大量使用此代码。

您无需在任何地方添加参数检查,只需在合理的情况下使用它们。

如果要指定某些行为,例如:应该array_delete_value修改输入参数或返回删除了值的副本吗?在注释中指定它并添加测试的测试正是这种行为。

如果您担心性能,可以在缩小步骤中编写类似断言的语句并将其删除。这类似于使用断言编译。

断言可能如下:

argument("index", index).of_type("number").required();

如果你投票,请你发表评论。我错过了什么?你有竞争方法吗?

答案 1 :(得分:1)

您可以通过单元测试来了解您的方法的强大程度。如果你写好测试,你会很快发现你的方法需要能够处理各种wack输入。

由您决定要走多远,但要明确:不要只假设输入有效

就个人而言,即使不是第三方,我也会对来自其他类/模块/其他内容的任何内容进行验证。您需要确保每个模块的入口点都很健壮。我在给定的类/模块中放松了一点,但仍然要确保验证足以防止错误。

在您的示例代码中,CarsCollection之外的其他代码片段将调用get方法。所以,你肯定想要验证索引。

答案 2 :(得分:0)

我喜欢尽可能地使我的代码成为虚拟证明。这减少了开发人员使用我的API /函数/代码引发的WTF数量。参数检查始终是一种很好的做法,尤其是在像JavaScript这样的动态类型语言中。所以你在做什么没有错。 JavaScript中也允许进行类型检查。我发现跟踪一个明确说明其参数类型的函数更容易。这减轻了API用户的认知负担(即,无需处理foo(5)foo("5")),而在您撰写时减轻了您自己的认知负担该函数因为您不必处理JavaScript类型的特性,并且可以确定参数您期望的类型。

答案 3 :(得分:0)

虽然这并不完全回答你的问题,但重要的是要注意javascript的松散使你的许多问题都成为非问题(除非你想要它们)。

  • 如果index为false,并且您查看集合[index],则只需获取undefined。老实说,我不确定这是否是数组/对象的特征,或者假义值是否被强制转换为0,但不管怎样,它都不是正式的错误。
  • 如果index不是数字,括号表示法将从查找数组成员到对象属性。在最坏的情况下,它将返回undefined,但在最好的情况下,您可以使用对象的动态功能。
  • 意识到您当前的检查将在CarsCollection.get(0)上失败,因为0是假的。
  • 此外,isNaN处理其参数为null或未定义。

因此,您检查的内容都不是错误。如果这是一个致命的错误,JavaScript会自行抛出错误。

现在,对于问题本身,我的观点是,javascript是如此宽松和无条件,大多数检查是不必要的。如果using函数传递了错误的参数,那么另一个程序员应该找出原因。这不像你可以隐藏你的代码。我最重视的是良好的文档(查看jsdoc,然后使用它)。如果您很好地定义了界面,程序员就可以使用它。不过,那只是IMO。