当我写一些代码时,我想知道我的方法应该是多么安全。我应该相信我班级的用户吗?还是检查一切?这意味着参数类型检查可能不是一个好习惯,因为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];
};
答案 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的松散使你的许多问题都成为非问题(除非你想要它们)。
undefined
。老实说,我不确定这是否是数组/对象的特征,或者假义值是否被强制转换为0,但不管怎样,它都不是正式的错误。undefined
,但在最好的情况下,您可以使用对象的动态功能。因此,您检查的内容都不是错误。如果这是一个致命的错误,JavaScript会自行抛出错误。
现在,对于问题本身,我的观点是,javascript是如此宽松和无条件,大多数检查是不必要的。如果using函数传递了错误的参数,那么另一个程序员应该找出原因。这不像你可以隐藏你的代码。我最重视的是良好的文档(查看jsdoc,然后使用它)。如果您很好地定义了界面,程序员就可以使用它。不过,那只是IMO。