javascript - 在程序中进行多层数据验证是否可以深度防御故障或代码困惑的偏执狂?

标签 javascript regex validation design-patterns defensive-programming

例如,当最初输入数据时,如果它与我的验证正则表达式不匹配,我可能会将其吐出。然后到了要用它的时候,我常常有冲动去做这样的事:

function useData(data) {
  if(data.match(/some invalidating substring/) throw Error('Shouldn\'t have ever gotten past the orig. regex, but somehow it did, so its good that this extra layer of debugging info was integrated.');
  // actually use the data.
}

我并不是真的在谈论安全性,因为那时您想要进行纵深防御。我所指的代码类型通常对安全性不敏感,我只是想编写设计良好的代码,很有可能发现错误。在某种意义上,深度防御也被要求防止故障,而且不仅仅是漏洞,我想,但与此同时,Unix 哲学要求代码做一件事,而且只是那件事,但很好。考虑到这一点,不“信任”你的验证代码来完成它的工作似乎是不好的做法,然后在某个地方的另一个函数中制作另一段验证代码,“以防万一”。让两段代码做一件事也不是一件好事。另一个缺点是,如果您更改验证模式,那么您可能会忘记在两个地方都这样做。

反馈?

最佳答案

这在程序员中是一个宗教问题,但合理的方法是遵循 Design by Contract您设计遵守契约(Contract)的功能的范例。契约(Contract)规定了前提条件、后置条件和不变量。函数应遵守其契约,不为契约中未指定的行为提供任何保证。

在每个函数中验证输入是多余的,并且会导致代码困惑。考虑一个简单的函数,它接受一个整数 x 并返回 x 的平方根。你要验证输入以确保 x 是非负的吗?你可以,或者你可以在契约(Contract)中指定 x 必须是非负的。后者更简洁,但代表程序员需要更加小心才能正确使用它。

不要试图在代码中发现错误。相反,使用良好的测试框架来捕获错误。

关于javascript - 在程序中进行多层数据验证是否可以深度防御故障或代码困惑的偏执狂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20062198/

相关文章:

javascript - 从网页中的 JavaScript 函数访问 PHP 变量

php 理解贪婪与非贪婪匹配

javascript - 如何将 Java 正则表达式转换为 JS 正则表达式?

c# - 验证取消 UpdateSourceTrigger 时如何调用 CanExecute

javascript - 复选框限制功能发生后复选框变得不可点击reactjs

javascript - 从 chrome.storage.local 中检索对象并使用它来更改当前页面的 CSS

javascript - 使用带有 jsonp 的 $.getJSON 时,Sinon.js fakeServer.request.respond 失败

正则表达式限制 url 文件夹的通配符

iphone - 在输入文本字段之前禁用按钮?

javascript - 是否可以在 WebSockets 中使用具有所需端口(例如 6500)的 http 方案而不是 ws 和 wss 方案?