# 契约式编程与防御式编程

# 1. 防御式编程

对于 “防御式编程” ,《代码大全》给我们提供了一个定义:

    人类都是不安全、不值得信任的,所有的人,都会犯错误,而你写的代码,应该考虑到所有可能发生的错误,让你的程序不会因为他人的错误而发生错误。

程序需要对可能的错误输入,你需要作出预防。预防的手段可以有如下两种:

  • 做出兼容,允许本轮执行。(例如,参数字符串不允许为 null,如果传入 null,我给它一个默认值:"",以替代它的原始值 null)

  • 错误提示,终止本轮执行,提示重新再来。

简而言之,防御式编程,就是持怀疑态度审视所有的代码:『总有刁民想害朕』。

# 2. 契约式编程

什么是 “契约式编程” ?

     简单的说,契约作用于两方,每一方都会完成一些任务,从而促成契约的达成,但同时,每一方也会接受一些义务,作为制定契约的前提,有任意一方无视了必尽义的义务,则契约失败。

契约式编程要求我们在『前提条件』、『后继条件』和『不变量条件』进行契约的检查。类似的,例如检查参数,一旦参数不对,当即撕毁契约。

契约所约束的,是『一个为了确保程序正常运行的条件』,一旦契约被损毁,只有一个原因,那就是程序出了 Bug。

例如,一个参数,在我处理的时候,必须保证是不为空的。那么谁来保证这一点呢?一定是我的调用方(或者说是其它模块),所以,一旦出现问题,应该由调用方来检查,确保调用的时候,必须是不为空的。

契约式编程可以严格区分责任,让每个人都不必为了迁就他人的错误而进行『艰难的编码』。每个人按照契约处理好自己的事情,让损毁契约的人承担责任。