以下是自己对防御式编程的一点理解,也经常给其他同事讲,在此简单记录下。
防御式编程,重点是“
防御
”;防御一切出错的可能!官方的概念大家可以百度,在此不在啰嗦。
两个实习生吵架:
A:我调用你的getByName方法出错了,你的方法有问题!
B
:
我的方法没有问题,很多人都调我的方法都没有出错,为什么只有你调用出错?
C:我调用别人的方法,也是返回一个List,都没有报错,为什么偏偏调用你的方法就报错?
实习生代码如下:
![](http://static.oschina.net/uploads/img/201512/29220519_WUvP.png)
架构师代码如下:
![](http://static.oschina.net/uploads/img/201512/29220520_cVHj.png)
一、do之前先校验
1.架构师在第21行对传入的参数name做了非空校验,避免了空指针情况的发生。
分析:方法调用者传入什么值都有可能,在此必须对参数进行校验,这里只是非空校验,实际环境应该是对参数的合法性校验(类型、取值范围等等)。否则调用放传入null,程序就会出错,而栈低的异常恰恰是自己的代码。
处理:永远不要让自己的代码出错。如果参数合法则执行相应的逻辑,非法参数直接抛出异常提示参数非法(此时栈低异常就是调用方的代码),或者执行其他逻辑,但是不能出异常。
结果:根据调用方参数的不同,程序返回不同的结果或者抛出异常,但是自己的代码永远不会出错,也不会有人找你麻烦。
2.架构师在第13行对返回的结果做了非空校验,
避免了空指针情况的发生。
分析:
虽然方法声明返回的是一个List,但是不敢抱着所有人写的代码返回的都是List,可能有返回null的情况,如果自己直接使用返回值则可能出错。
处理:拿到别人的结果,先不要着急用,先校验这个东西能不能用。
结果:不管别人返回什么,我的代码不会出错,只是处理逻辑不同而已。
二、提供统一的返回值
1.架构师的getByName方法永远返回一个List,不会返回null。
分析:如果调用者做了校验则程序不会出现异常,否则则会出现异常。避免让别人出现异常,为别人考虑,你不知道调用的代码的开发人员编程素养是否OK。
总结:
架构师调用实习生的getByName方法不会出错,架构师避免的。
不管方法提供者是否有处理,我一定会处理,保证自己的代码不出差。
实习生调用架构师的getByName方法,不会出错,架构师不给他出错的机会。
统一返回值,降低调用者的难度,避免不必要的争论。
1.无论什么时候保证自己的程序不出错,不被坑。
2.尽量让调用者的程序不出差,避免不必要的争论,保持优雅的气质。