防御性编程几大基本原则

当开发人员遇到意外的错误无法修复时,他们会“添加一些防御性代码”来使代码更安全,更容易找到问题所在。有时候,仅仅这样做就能解决问题。他们会加强数据验证——确保检查输入和输出字段以及返回值。审查并改进错误处理——也许在“不可能”的情况周围添加一些检查。增加一些有用的日志记录和诊断功能。换句话说,这些本应该从一开始就存在的代码

防御性编程的整个目的是为了防范你意想不到的错误。

——Steve McConnell,《代码大全》

防御性编程的几个基本原则在Steve McConnell经典著作《代码大全》中有详细解释:

保护你的代码免受“外部”传入的无效数据影响,无论你认为“外部”是指什么地方。这里指来自外部系统、用户、文件或模块/组件之外的任何数据。建立“壁垒”、“安全区域”或“信任边界”——边界之外的一切都是危险的,边界之内的一切都是安全的。在壁垒代码中,验证所有输入数据:检查所有输入参数的正确类型、长度和取值范围。再次检查限制和范围。

在检查完坏数据后,决定如何处理它。防御性编程并不意味着吞没错误或隐藏错误。它是关于在健壮性(如果遇到可处理的问题则继续运行)和正确性(永远不返回错误结果)之间做出权衡。选择一种处理坏数据的策略:立即返回错误并停止运行(快速失败),返回一个中立值,替换数据值等等。确保策略明确且一致。

不要假设你代码之外的函数调用或方法调用会按照广告所述正常工作。确保你理解并测试了周围外部API和库的错误处理机制。

使用断言来记录假设,并突出显示“不可能”的条件,至少在开发和测试阶段如此。这对于长期由不同人维护或高可靠性代码特别重要。

巧妙地添加诊断代码、日志记录和跟踪功能,以帮助解释运行时发生了什么问题,尤其是当遇到问题时。

标准化错误处理。决定如何处理“正常错误”或“预期错误”和警告,并始终保持一致。

只在需要时使用异常处理,并确保你对语言的异常处理机制了如指掌。将异常作为正常处理流程的一部分的程序会遭受经典意义上代码结构混乱的可读性和可维护性问题。

Michael Nygard在《发布!》中还提到了其他几个规则,比如永远不要无限期等待外部调用,尤其是远程调用。当出现问题时,无限期可能会很长时间。使用超时/重试逻辑以及他的断路器稳定模式来处理远程故障。

对于C和C++等编程语言,防御性编程还包括使用安全函数调用来避免缓冲区溢出和常见编码错误。

原文:https://swreflections.blogspot.com/2012/03/defensive-programming-being-just-enough.html

 

优秀的个人博客,低调大师

微信关注我们

原文链接:https://www.oschina.net/news/269921/defensive-programming

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。