防御式编程

防御式编程

编程中一定要校验数据的合法性。所有未经过校验的数据都是值得怀疑的。

代码不会因为你校验空值或数据合法性变得复杂难懂,和编程中各种奇技淫巧带来的复杂性比起来,简直微不足道。

客户端要检验数据的合法性,不合法不往服务器发送,减少网络数据传输,快速给用户反馈。JavaScript最初就是为浏览器客户端校验而生的。

服务器更要进行数据校验,保证服务器正常运行,服务不中断。合法的数据才能保证业务正常,数据库存储的数据有效。

双侧校验数据合法性,避免了数据在网络传输、数据转译等造成的数据不合法。

常见的用法,客户端传空值给服务器,服务器未进行数据校验就使用数据,产生异常,把异常信息和空值返回给客户端,客户端收到返回值后直接使用返回数据,返回的空值引起客户端异常,然后抛一个错误信息弹窗,更可怕的是显示了一些客户看不懂的消息。客户懵了,软件的名声就这么坏了。

异常处理在软件中被滥用了。在写框架的时候,有经验的程序员会对未捕获的异常进行集中处理,也就是最顶层上的try {} catch (Exception) {}进行处理,这样做保证软件不会挂掉,又有反馈。数据不合法时,直接抛异常是最容易写的,代码看起来也整洁,不需要像返回Boolean、状态码等那样层层返回。异常的这些特性更导致了异常被滥用,一些非常有经验的程序员也常用抛异常的写法,写业务代码的人更喜欢在数据不合法或者有未预料的异常时,直接抛异常,反正框架会处理,写起来其乐融融。一切可以预料的异常,要避免使用抛出异常,因为异常处理比返回Boolean、状态码性能低不少。层层返回的代码看起来复杂了些,但是带来的性能提高是很划算的,尤其是对一些经常访问的接口。

不要传递不合法的数据,避免接收不合法的数据,不合法不处理。不合法的数据应止于源头,杜绝传播,传的越远带来的性能或者金钱损失越大。

不要相信所谓的代码约定,时间久了约定就会被部分甚至全部违反,最终带来一堆bug,悔时晚矣。一切可能出错的代码,将来都会出错。

打赏