我谈防御式编程

cnblogs果然热闹,我好喜欢这里的氛围,今天分享下自己对“防御式编程”的看法吧!

  一直以来,我们项目深受NullPointerException的影响。因为引用为空而引起的问题,从项目诞生的那天起,就没有断过,错误日志经常爆出java.lang.NullPointerException。我与其他同事聊过,分析这个到底是数据问题还是程序问题?部分人认为这是数据问题,如果是因为从数据库里取出来的数据为空,那么把数据库表的数据某些字段改成不为空就可以了,处理下数据就行了。部分人认为这是程序问题,程序要去做非空判断,要确定你要用的对象不为空才使用,程序层面做牢固,才能避免NullPointerException,在程序中做判断又会引起一个争论,是不是哪里都要做非空判断?那么是不是到处都充斥着if(object != null)的无聊重复代码?

一开始,我也简单的认为这个问题的核心就是要分析到底是数据还是程序问题,因为我们能运行起来的软件,本质就是用程序的逻辑对数据做处理。但随着阅历的增加,我认识到这或许不是个非此即彼的问题。在看过一些编程方法论的书籍后,我认识到程序应该具备一定的容错性,需要做“防御式编程”。“防御式编程”有多种技术手段,如断言、异常处理或是一些验证框架,这里不详谈。我谈谈这样做的目的:把不好的挡在外面,把可信的放进来。

拿《行尸走肉》打个比方,我把rick的团队比喻成我们的程序。看过该美剧的同学应该知道,在后期恶劣的环境下,食物弹药匮乏,到处充斥着腐烂的丧尸,还有更可怕的人,没错,是人。在这种环境下,人人自危人人自保,看不懂人心,我们必须做好防御。于是就有了rick面试新人的三个问题:你杀过多少walkers,你杀过多少lives,你为什么要杀或不杀?这三个问题就好似我们防御的技术手段,通过严格筛选的人可以进入rick的团队。而rick团队对通过考验的新人,那真的就是毫无保留的看作自己人,互帮互助,完全信任。那么作为我们的程序也是,一开始,我们对外部的数据持高度的警戒和怀疑态度,要设置层层拦截,校验通过才能进入我们程序的内部。当得到校验过的数据后,我们将百分之百的信任他,不再对外部传入的基本类型数据或引用做检查,我的子程序将更轻松的与这些值得信任的朋友打交道。

总结到这里,我想起了三国演义中一句话:“天下英雄,唯使君与操尔”。曹操这句话,在后人看来,确实名副其实,因为曹操和刘备作为三国时期的杰出领导人,在用人方面几乎都用到了八个字可以概括的一个做法,我的这篇博文,也用这八个字来收尾:疑人不用,用人不疑。

时间: 2024-10-27 11:55:18

我谈防御式编程的相关文章

由错误处理引发的联想-防御式编程

前两天和一同学谈到程序出错应该如何处理的问题,他讲到错误处理的两个原则, 第一,应该在错误发生时立即将它抛出,而且得抛的很明显,有些人采用静默出错的原则,尝试修复错误并继续运行,这回导致代码调试起来很困难,所以他认为,当程序逻辑出错时,应该立刻崩溃,并生成一段有意义的错误消息,立即崩溃是为了不让事情变得更糟,错误消息应担被写入永久的错误日志,以便过后查明是哪里出错. 第二,就是抛错要快,也要文明,文明抛错,就是只有程序猿才能看到程序崩溃时产生的详细错误消息,程序的用户绝对不能看到这些消息,另一方

论防御式编程与攻击式编程

今天突然想到了这个话题. 那么,有一部分读者可能并不会很理解我的意思 防御式编程:客户提出什么问题,我们就解决什么问题. 攻击式编程:主动发现问题,其中有一部分问题是性能优化问题,一部分是客户未能发现的BUG.以尽快的方式解决问题. 真实场景:一个功能被做出来了,开发人员于是试了一遍,觉得功能已经出来了,他心里面觉得松了口气, 可以暂时缓了一口气,然后这个功能的测试任务,被分配给了测试人员. “叮叮叮,小李,过来一下,你这个功能怎么怎么的”. 有以下几种可能情况: 测试人员:   你这个样式在I

华山论剑之契约式编程与防御式编程

背景 事情的来由还要从几十几亿年前的一次星球大爆炸说起,sorry,背错台词了,是从几天前讨论接口返回数据和几个月前讨论课件本地数据结构说起,简单的说,就是碰到约定好的内容出现异常,是我们在程序中内部作兼容处理,还是抛出去. 打个比方,我们要解析一段json,约定这个json的格式,只能是正常格式,或者是空,那么一旦返回json的方法返回了一个『既不是正常格式,又不是空的异常值』,程序该如何处理呢? 小花:一旦碰到约定异常,程序必须兼容处理,一定不能让程序Crash 小Fa:一旦碰到约定异常,就

《Code Complete》ch.8 防御式编程

WHAT? 主要思想:子程序不应因传入参数错误而被破坏 WHY? 保护程序免遭非法输入的破坏 HOW? 断言 assert denominator != 0 : "denominator should not be 0"; // 启动VM时需要 -ea 参数用以启动assert功能 只用于开发.维护阶段 用错误处理代码来处理预期会发生的状况,用断言来处理绝不会发生的状况 避免把需要执行的代码放入断言中 用断言来注解并验证前条件和后条件 错误处理技术 返回中立值(当对返回结果准确性要求较

防御式编程的主要思想

防御式编程是提高软件质量技术的有益辅助手段.防御式编程的主要思想是:子程序应该不因传入错误数据而被破坏,哪怕是由其他子程序产生的错误数据.这种思想是将可能出现的错误造成的影响控制在有限的范围内. 主要内容如下: 1.保护程序免遭非法输入数据的破坏   1.检查所有来源于外部的数据的值   2.检查子程序所有输入参数的值   3.决定如何处理错误的输入数据       使用迭代设计.编码前先写伪代码.写代码前先写测试用例.低层设计检查等等

16防御式编程2

一 辅助调试的代码 1. 不要自动地把产品版本的限制强加于开发版之上 ? 程序员们常常有这样一个误区,即认为产品级软件的种种限制也适用于开发中的软件.产品级的软件要求能够快速的运行,而开发中的软件则允许运行缓慢.产品级的软件要节约适用资源,而开发中的软件在使用资源时可以比较奢侈.产品级的软件不应向用户暴露可能引起危险的操作,而开发中的软件则可以提供一些额外的.没有安全网的操作. ? 我曾参与编写的一个程序中大量地使用了四重链表.链表的代码是很容易出错的,链表本身的结构很容易损坏.因此我给程序加了

软件构造-犯错的艺术——健壮性与正确性,异常,防御式编程,debugging与test的思考与总结

健壮性与正确性 健壮性与正确性是不同的——一个倾向于使程序尽可能保持运行,即使遇到错误,一个倾向于使程序尽可能正确,不在意保持运行 异常 异常分为两种——checked exception与unchecked exception 二者的区别在于: checked exception需要显式的处理,说白了就是编程者必须要么用catch抓住它,然后在try中想办法处理掉,要么显式的将这个异常扔到调用的上一级方法,也就是甩锅.总而言之,你永远不能无视checked exception unchecke

[转帖]浅谈响应式编程(Reactive Programming)

浅谈响应式编程(Reactive Programming) https://www.jianshu.com/p/1765f658200a 例子写的非常好呢. 0.9312018.02.14 21:22:16字数 1877阅读 9816 这是告别CSDN后第一次使用简书写IT类的博客,还在适应.最不适应的就是不能直接手输markdown语法标记.(好像原因是我没有切换编辑器) 什么是响应式编程(Reactive Programming) In computing, reactive program

《代码大全》第八章 防御式编程

8.1 保护数据免遭非法输入数据的破坏 garbage in ,garbage out! 三种方法处理进来的垃圾数据 1 检查所有的来源于外部的数据值. 2 检查子程序的所有输入参数值. 3 决定如何处理错误的输入数据. 8.2 Assertions