使用断言在node.js中进行防御性编程

考虑到有时节点中的错误消息特别无用,我喜欢在我的函数中自由使用断言,这样编程错误就会被尽快捕获,并且我可以得到一条通常指出问题的消息。

function doSomething(arg1, arg2){ assert(!arg1, "arg1 is undefined"); assert(!arg2, "arg2 is undefined"); assert(!arg1.expectedFn, "arg1 does not have expectedFn"); arg1.expectedFn(function(blah){ ... } } 

这是在节点/ JavaScript程序中做的特别糟糕的事情? 这是否对性能有影响?

(这比事后更多的意见,所以拿它的价值)

断言绝对没有什么好的performance,但在适度使用我怀疑他们有一个严重的影响重要。 也就是说,一般来说,只要有可能,优秀的testing覆盖率就更好。 另外,声明你写的东西不应该是在运行时抛出的错误,除非它们是特别不透明的。

我们来考虑一下doSomething的一个修改过的(而且有点人为的)

 function doSomething(arg1, arg2){ var res = arg1.expectedFn(function(blah){ ... } return res + arg2; } 

我认为检查arg1是否存在没有意义,或者它包含函数名expectedFn。 如果其中任何一个都未定义,那么javascript运行时会抛出一个相当可以理解的TypeError,它会准确地说出发生了什么; 断言是多余的。

不过,您可能会发现在这里testingarg2是可取的。 假设它是未定义的,而res是一个string或数字 – 那么最后会在string后附加“undefined”,或者返回NaN。 两者都是相当微妙的错误,可以存在很长一段时间没有任何人注意到 – 如果你希望它失败得早,而不是为了debugging目的,那么你可能需要添加一些断言,以确保它是正确的types。

一般来说,如果你关心严谨的话,我相信能够写出更好的写作综合testing:编写完全覆盖这些东西的testing可能会导致比断言更好,更强大的开发过程。 有些情况下断言是适当的,但是它们局限于长期存在格式错误的结果而没有任何直接的错误,但仍然能够产生不良的副作用的情况。