漫谈防御式编程

以下是自己对防御式编程的一点理解,也经常给其他同事讲,在此简单记录下。

防御式编程,重点是“ 防御 ”;防御一切出错的可能!官方的概念大家可以百度,在此不在啰嗦。

两个实习生吵架:
A:我调用你的getByName方法出错了,你的方法有问题!
B : 我的方法没有问题,很多人都调我的方法都没有出错,为什么只有你调用出错?
C:我调用别人的方法,也是返回一个List,都没有报错,为什么偏偏调用你的方法就报错?

实习生代码如下:
架构师代码如下:

、do之前先校验
1.架构师在第21行对传入的参数name做了非空校验,避免了空指针情况的发生。
分析:方法调用者传入什么值都有可能,在此必须对参数进行校验,这里只是非空校验,实际环境应该是对参数的合法性校验(类型、取值范围等等)。否则调用放传入null,程序就会出错,而栈低的异常恰恰是自己的代码。
处理:永远不要让自己的代码出错。如果参数合法则执行相应的逻辑,非法参数直接抛出异常提示参数非法(此时栈低异常就是调用方的代码),或者执行其他逻辑,但是不能出异常。
结果:根据调用方参数的不同,程序返回不同的结果或者抛出异常,但是自己的代码永远不会出错,也不会有人找你麻烦。

2.架构师在第13行对返回的结果做了非空校验, 避免了空指针情况的发生。
分析: 虽然方法声明返回的是一个List,但是不敢抱着所有人写的代码返回的都是List,可能有返回null的情况,如果自己直接使用返回值则可能出错。
处理:拿到别人的结果,先不要着急用,先校验这个东西能不能用。
结果:不管别人返回什么,我的代码不会出错,只是处理逻辑不同而已。

二、提供统一的返回值
1.架构师的getByName方法永远返回一个List,不会返回null。
分析:如果调用者做了校验则程序不会出现异常,否则则会出现异常。避免让别人出现异常,为别人考虑,你不知道调用的代码的开发人员编程素养是否OK。

总结:
架构师调用实习生的getByName方法不会出错,架构师避免的。
    不管方法提供者是否有处理,我一定会处理,保证自己的代码不出差。
实习生调用架构师的getByName方法,不会出错,架构师不给他出错的机会。
    统一返回值,降低调用者的难度,避免不必要的争论。

1.无论什么时候保证自己的程序不出错,不被坑。
2.尽量让调用者的程序不出差,避免不必要的争论,保持优雅的气质。




转载于:https://my.oschina.net/pengyan5945/blog/553051

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值