cnblogs果然热闹,我好喜欢这里的氛围,今天分享下自己对“防御式编程”的看法吧!
一直以来,我们项目深受NullPointerException的影响。因为引用为空而引起的问题,从项目诞生的那天起,就没有断过,错误日志经常爆出java.lang.NullPointerException。我与其他同事聊过,分析这个到底是数据问题还是程序问题?部分人认为这是数据问题,如果是因为从数据库里取出来的数据为空,那么把数据库表的数据某些字段改成不为空就可以了,处理下数据就行了。部分人认为这是程序问题,程序要去做非空判断,要确定你要用的对象不为空才使用,程序层面做牢固,才能避免NullPointerException,在程序中做判断又会引起一个争论,是不是哪里都要做非空判断?那么是不是到处都充斥着if(object != null)的无聊重复代码?
一开始,我也简单的认为这个问题的核心就是要分析到底是数据还是程序问题,因为我们能运行起来的软件,本质就是用程序的逻辑对数据做处理。但随着阅历的增加,我认识到这或许不是个非此即彼的问题。在看过一些编程方法论的书籍后,我认识到程序应该具备一定的容错性,需要做“防御式编程”。“防御式编程”有多种技术手段,如断言、异常处理或是一些验证框架,这里不详谈。我谈谈这样做的目的:把不好的挡在外面,把可信的放进来。
拿《行尸走肉》打个比方,我把rick的团队比喻成我们的程序。看过该美剧的同学应该知道,在后期恶劣的环境下,食物弹药匮乏,到处充斥着腐烂的丧尸,还有更可怕的人,没错,是人。在这种环境下,人人自危人人自保,看不懂人心,我们必须做好防御。于是就有了rick面试新人的三个问题:你杀过多少walkers,你杀过多少lives,你为什么要杀或不杀?这三个问题就好似我们防御的技术手段,通过严格筛选的人可以进入rick的团队。而rick团队对通过考验的新人,那真的就是毫无保留的看作自己人,互帮互助,完全信任。那么作为我们的程序也是,一开始,我们对外部的数据持高度的警戒和怀疑态度,要设置层层拦截,校验通过才能进入我们程序的内部。当得到校验过的数据后,我们将百分之百的信任他,不再对外部传入的基本类型数据或引用做检查,我的子程序将更轻松的与这些值得信任的朋友打交道。
总结到这里,我想起了三国演义中一句话:“天下英雄,唯使君与操尔”。曹操这句话,在后人看来,确实名副其实,因为曹操和刘备作为三国时期的杰出领导人,在用人方面几乎都用到了八个字可以概括的一个做法,我的这篇博文,也用这八个字来收尾:疑人不用,用人不疑。