防御性编程(Defensive programming)

防御性编程(Defensive programming)

什么是防御性编程?

是防御式设计的一种具体体现,它是为了保证,对程序的不可预见的使用,不会造成程序功能上的损坏。它可以被看作是为了减少或消除墨菲定律效力的想法。防御式编程主要用于可能被滥用,恶作剧或无意地造成灾难性影响的程序上。系统的安全性越来越重要,随着互联网技术逐渐渗透到各行各业,每一个细小的问题被放大足以影响到各行各业,对经济和生活造成重大影响。

防御性编程通常通过以下途径,从而提高软件和源码的质量:

  • 提高工程质量——减少bug和问题
  • 提高源码可读性—— 源码应该变得可读且可理解,并且能经受代码审计。
  • 让软件能通过预期的行为来处理不可预期的用户操作。

值得注意的是,过度的防御性编程可能会预防不可能会发生的错误,这样将导致运行时间与维护的损耗。当源码中拥有过多异常捕捉和异常处理,这有可能导致结果不正确或者被隐藏。

防御性编程的处理方式

1. 输入检查

“不要相信用户输入的数据”,指的就是对用户输入做检查的必要性,随着业务系统面向的用户越多,越会出现离谱的输入!所以输入数据的检查是非常必要的!

  1. 检查来自系统外部的数据

    包括来自 **用户的表单输入,读取的文件内容。消息队列中的数据,**都需要进行检查,检查可以在以下几个方面考虑

    • 数据格式是否正确
    • 数据类型是否正确

    对于一些不满足条件的数据,一定要做日志记录,便于日志审计,追查系统问题的出处。

  2. 检查 API 接口的参数值

    检查系统内部通过 RPC 远程调用时传递的参数值是否满足预期

    • 必传字段和非必传的字段
    • 字段类型是否匹配
    • 参数值是否合法
    • ……

总之,在编写代码时,不要假设系统的接口调用总是满足预期的,尽可能多的考虑到其他情况,并确保做了错误处理。

2. 断言应用

在代码中通过断言的应用,可以判断代码的运行结果是否符合预期,一般在测试中使用。

3. 错误处理

在代码中对可能出现的错误提前预判并进行处理,保证整个系统的有效性。

在 Java 中使用 try () catch () finally () 子句进行异常捕获和处理。

在 Golang 中通过 error 进行错误的判断,异常处理规范是 go 语言的特色之一。

4. 隔离

隔离指的是容灾处理,在一定程度内可以包容错误造成的影响,例如 服务的多机房部署,MySQL 的读写分离,同步等策略。

防御性编程的策略

  1. 保持良好的编码风格;
  2. 做好日志信息的处理,确保提示信息的友好性;
  3. 保留让程序稳妥崩溃的代码,去掉会导致程序硬性崩溃的代码;
  4. 保留重要错误检查代码,去掉检查细微错误代码。

你可能感兴趣的:(编程方法及思考,开发语言)