您好,欢迎访问三七文档
防御性编程广联达软件股份有限公司孙建利2010年9月3日防御性编程•什么是防御性编程•防御性编程技巧•进攻性编程•总结什么是防御性编程•防御性编程是一种细致、谨慎的编程方法。•为了开发可靠的软件,我们要设计系统中的每个组件,以使其尽可能地“保护”自己。•我们通过明确地在代码中对设想进行检查,击碎了未记录下来的设想。•防御性编程使我们可以尽早发现较小的问题,而不是等到它们发展成大的灾难的时候才发现。防御性编程技巧•1.使用好的编码风格和合理的设计•通过采用良好的编程风格,来防范大多数编码错误•如选用有意义的变量名,或者审慎地使用括号,都可以使编码变得更加清晰明了,并减少缺陷出现的可能性。•在投入到编码工作中之前,先考虑大体的设计方案,这也非常关键防御性编程技巧•2.不要仓促地编写代码•在写每一行时都三思而后行。可能会出现什么样的错误?你是否已经考虑了所有可能出现的逻辑分支?放慢速度,有条不紊的编程虽然看上去很平凡,但这的确是减少缺陷的好办法。防御性编程技巧•3.不要相信任何人•下面这些情况可能是给你带来麻烦的原因:•真正的用户意外地提供了假的输入,或者错误地操作了程序;•恶意的用户故意造成不好的程序行为;•客户端代码使用错误的参数调用了你的函数,或者提供了不一致的输入;•运行环境没有为程序提供足够的服务;•外部程序库运行失误,不遵从你所依赖的接口协议。•不要相信任何人毫无疑问,任何人(包括你自己)都可能把缺陷引入你的程序逻辑当中。用怀疑的眼光审视所有的输入和所有的结果,直到你能证明它们是正确的时为止。防御性编程技巧•4.编码的目标是清晰,不只是简洁•简单就是一种美。不要让你的代码过于复杂。防御性编程技巧•5.不要让任何人做他们不该做的修补工作•将所有变量保持在尽可能小的范围内。不到万不得已,不要声明全局变量。如果变量可以声明为函数内的局部变量,就不要在文件范围上声明。如果变量可以声明为循环体内的局部变量,就不要在函数范围上声明。防御性编程技巧•6.检查所有的返回值•如果一个函数返回一个值,它这样做肯定是有理由的。•大多数难以察觉的错误都是因为程序员没有检查返回值而出现的•不论何时,都要在适当的级别上捕获和处理相应的异常。防御性编程技巧•7.审慎地处理内存(和其他宝贵的资源)•8.在声明位置初始化所有变量防御性编程技巧•9.尽可能推迟一些声明变量•使变量的声明位置与使用它的位置尽量接近,从而防止它干扰代码的其他部分•不要在多个地方重用同一个临时变量,变量重用会使以后对代码重新完善的工作变得异常复杂。防御性编程技巧•10.审慎地进行强制转换•如果你真的想使用强制转换,就必须对之深思熟虑。你所告诉编译器的是:“忘记类型检查吧:我知道这个变量是什么,而你并不知道。”你在类型系统中撕开了一个大洞,并直接穿越过去。这样做很不可靠。防御性编程技巧•11.其它•提供默认的行为•遵从语言习惯•检查数值的上下限•正确设置常量进攻性编程•进攻性编程?•有效的进攻就是最好的防守。——格言•进攻性的编程方法需要主动地尝试打破代码中的常规,而不只是防止问题的发生。也就是说,不是保护代码,而是主动地进攻代码。我把这种策略称为“测试”。•严格的测试对软件开发具有不可低估的正面影响。它可以极大地提高代码质量,并且使开发过程变得稳定起来。•我们都应该成为进攻性程序员。总结•编写不仅正确而且优秀的代码•防御性编程是一种预想最坏的情况并为之做好准备的方法。它是一种可以防止简单的错误变成难以找到的错误的技术。总结•优秀的程序员……•关心他们的代码是否健壮•确保每个设想都显式地体现在防御性代码中•希望代码对无用信息的输入有正确的行为•在编程的时候认真思考他们所编写的代码•编写可以保护自己不受其他人(或程序员自己)的愚蠢伤害的代码•糟糕的程序员……•不愿意去考虑他们的代码出错的情况•为集成才发布可能会出错的代码,并希望别人会找到错误•将关于如何使用他们代码的信息紧紧攥在手里,并随时都可能将其丢掉•很少思考他们正在编写的代码,从而产生不可预知的和不可靠的代码
本文标题:防御性编程
链接地址:https://www.777doc.com/doc-3708951 .html