【善于防守-健壮代码的防御性编程技巧】
最近在看【美】Pete GoodLiffe写的《编程匠艺》,很有感触。边读边想,发现能够与作者产生强烈的共鸣,这真是一种美妙的感觉。所以想把与作者产生共鸣和得学习的一些地方记下来,来加深对这些被实践证明了是正确的编程技巧的掌握。 防御性编程:顾名思义,防
最近在看【美】Pete GoodLiffe写的《编程匠艺》,很有感触。边读边想,发现能够与作者产生强烈的共鸣,这真是一种美妙的感觉。所以想把与作者产生共鸣和值得学习的一些地方记下来,来加深对这些被实践证明了是正确的编程技巧的掌握。
防御性编程:顾名思义,防御性编程是一种细致的,谨慎的编程方法。为了开发可靠的软件产品,我们要谨慎地设计系统的每个细节,便是其能尽可能的“保护”自己,,我们通过明确的代码中增加很多的假设,当假设在现实的客户环境中执行时才不至于崩溃,给一些客户莫名奇妙的错误或者异常。防御性编程是一种防卫方式,而不是一种补救方式。
图1 修补性的编程
下面是常见的防御性编程技巧:
1.使用好的编码风格和合理的设计:
好的编码风格会让人耳目一新,而且越是清晰地代码,越是体现了作者思路的清晰度,模块组件内部的高内聚,低耦合也会使代码的维护和使用更加便捷,更不容易出错。
2.不要仓促的编写代码:
不要在脑袋里有了大体思路之后就马上很“职业”地噼里啪啦的敲下代码,然后大体检查后剩下的就交给编译器去检查吧,于是运行通过,编写下面一个函数,这样就会隐藏大量的危险的代码,久而久之就会陷入自己给自己挖的大坑里,拔都拔不出腿。
关键: 欲速则不达。每敲一个字,都要想清楚自己要输入的是什么。
3. 不相信任何人:
不相信任何可能给自己写的代码带来麻烦的人,这些人包括:真正的客户,恶意的用(有可能是黑客),客户端的代码(Client Code),运行环境(可能存在磁盘空间已满,网络断开等),外部运行库(自己写的代码所依赖的外部dll已从请求位置移除)。
4 . 编码的目标是清晰,不是一味地准求简洁:
如果从简洁(可能理解起来比较困惑)和清晰(可能比较冗长)的代码里选择一种,我想大部分人会选择清晰地代码,尽管比较冗长(毕竟代码不是写在花银子买来的纸上的 :-) )。
5.不想让其他人做他们不该做的事情:
设计上不想让其他人访问的属性或者方法要尽量将可访问性限制在类或者包的内部。
6.编译时打开所有的警告开关
日益发达,功能强大的编译器会告诉我们,哪些代码写的不太符合规范,哪些变量声明了未使用等等这些可能在实际的运行环境中给我们带来意外结果,我们却感觉莫名其妙,无从下手修补的代码。重视编译后的警告信息会让我们的代码更加健壮。
7.使用安全的数据结构:
最常见安全隐患是缓冲区溢出,例如:一个buffer的长度是10,但是向buffer写入了长度为11的数据,这样会可能覆盖掉其他的数据,这样可能会造成遭难性的影响。当然现在.net 这样优秀的开发平台有CLR去管理内存,给我们腾出了更多的时间和精力去考虑我们想要用代码完成的事情。
8.检查所有的返回值:
如果一个函数有返回值,这样做肯定是有理由的。要对这个返回值进行检查,如果不对返回值检查就会产生很多难以察觉的错误。检查这个返回值,这个返回值可能是一个错误代码(C程序一般都是返回错误代码吧),必须辨别这个代码并处理所有的错误,忍受这个错误,危险就会悄无声息的潜入我们的程序。C#提供了沿堆栈逐级向外抛出的异常机制,我们应该在写的C#代码中,对不同级别的异常做合理的封装(底层异常要体现底层这个级别来例如:DBException,业务层的异常要体现出业务类的异常来ProductInfoInitialException)。
9.审慎的处理内存等宝贵的资源:
这些资源包括:内存,磁盘文件,网络连接,数据库连接。哈哈,现在jvm,clr都可以做到自动的清理资源和垃圾回收,我们真是太幸福了,但是也不要太大意了,我们还是需要显示的释放那些我们不再需要的资源,毕竟jvm和clr都是遵循一定的机制(详见http://www.cnblogs.com/anorthwolf/archive/2009/12/07/1618744.html),我们必须显示的终止对那些不再使用和不会被自动清理的对象的引用,不太先进的垃圾回收器会被循环引用对象所蒙蔽。
10.尽量晚的声明变量:
也就是要靠着使用变量最近的代码段来声明变量。
11.在声明变量的位置初始化变量:
如果初始化了所有的变量,那么他的用途就是明确的。“如果我不初始化它,我就不关心它”的经验主义是错误的,如果一个变量在一个位置声明,在另一个位置初始化,并在第三个地方被使用,那么一旦初始化代码被跳过,就会得到意想不到的结果,到时候我们再去查找原因,那就难喽。
12.小心的进行强制类型装换:
有些类型之间虽然可以进行强制类型转换,但是有些类型在转换的过程中会丢失掉一些数据。
13.提供默认的行为:
例如:Switch语句,要对default 有默认的实现。
14.检查数值的上下线:
.net 框架中已经对一些数值类型有了范围的约束,但是如果我们在一些业务开发中要对是否符合现实情况作出检查:例如年龄不能为负数等等。
15.约束:
约束主要包括:
1.5.1 前置条件:输入一段代码之前必须为真。
1.5.2 后置条件:输入一段代码之后必须为真。
1.5.3 不变条件:程序运行到一个特定点,必须为真。
1.5.3 断言:任何其他关于程序在给定位置的状态的陈述。
具体内容是:
检查所有的数组边界。
在废除指针前,断言指针是否清零。
确保函数参数的有效性。
在函数结果返回前,进行充分的检查。
在操作对象之前证明他的状态时一致的。
总结一下,编写正确而且优秀的代码是很重要的,这需要记录下你所做的所有的设想。这样会使程序维护起来更加的容易,会使错误减少。防御性编程就是一种预想最坏的情况并为之做好准备的方法。他是一种可以防止简单的错误变成难以找到的错误的技术。与防御性代码一起使用编入代码的约束,会使程序更加的健壮。
作者:小伦 出处:http://www.cnblogs.com/shiyulun1984/

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

有的用户在安装设备的时候遇到了错误,提示错误代码28,其实这主要是由于驱动程序的原因,我们只要解决win7驱动程序代码28的问题就可以了,下面就一起来看一下应该怎么来操作吧。win7驱动程序代码28怎么办:首先,我们需要点击屏幕左下角的开始菜单。接着,在弹出的菜单中找到并点击“控制面板”选项。这个选项通常位于菜单的底部或者附近。点击后,系统会自动打开控制面板界面。在控制面板中,我们可以进行各种系统设置和管理操作。这是怀旧大扫除关卡中的第一步,希望对大家有所帮助。然后,我们需要继续操作,进入系统和

蓝屏代码0x0000001怎么办蓝屏错误是电脑系统或硬件出现问题时的一种警告机制,代码0x0000001通常表示出现了硬件或驱动程序故障。当用户在使用电脑时突然遇到蓝屏错误,可能会感到惊慌和无措。幸运的是,大多数蓝屏错误都可以通过一些简单的步骤进行排除和处理。本文将为读者介绍一些解决蓝屏错误代码0x0000001的方法。首先,当遇到蓝屏错误时,我们可以尝试重

ISO文件是一种常见的光盘映像文件格式,它通常用于存储光盘的全部内容,包括文件和文件系统。当我们需要访问ISO文件中的内容时,就需要将其解压。本文章将介绍解压ISO文件的几种常见方法。使用虚拟光驱解压这是最常用的解压ISO文件的方法之一。首先,我们需要安装一个虚拟光驱软件,例如DAEMONToolsLite、PowerISO等。然后,双击虚拟光驱软件图标

win10系统是一款非常优秀的高智能系统强大的智能可以为用户们带来最好的使用体验,一般正常的情况下用户们的win10系统电脑都不会出现任何的问题!但是在优秀的电脑也难免会出现各种故障最近一直有小伙伴们反应自己的win10系统遇到了频繁蓝屏的问题!今天小编就为大家带来了win10电脑频繁蓝屏不同代码的解决办法让我们一起来看一看吧。电脑频繁蓝屏而且每次代码不一样的解决办法:造成各种故障代码的原因以及解决建议1、0×000000116故障原因:应该是显卡驱动不兼容。解决建议:建议更换厂商原带驱动。2、

终止代码0xc000007b在使用电脑时,有时会遇到各种各样的问题和错误代码。其中,终止代码最为令人困扰,尤其是终止代码0xc000007b。这个代码表示某个应用程序无法正常启动,给用户带来了不便。首先,我们来了解一下终止代码0xc000007b的含义。这个代码是Windows操作系统的错误代码,通常发生在32位应用程序尝试在64位操作系统上运行时。它表示应

如果您需要远程编程任何设备,这篇文章会给您带来帮助。我们将分享编程任何设备的顶级GE通用远程代码。通用电气的遥控器是什么?GEUniversalRemote是一款遥控器,可用于控制多个设备,如智能电视、LG、Vizio、索尼、蓝光、DVD、DVR、Roku、AppleTV、流媒体播放器等。GEUniversal遥控器有各种型号,具有不同的功能和功能。GEUniversalRemote最多可以控制四台设备。顶级通用遥控器代码,可在任何设备上编程GE遥控器配备一组代码,使其能够与不同设备相配合。您可

0x000000d1蓝屏代码是什么意思近年来,随着计算机的普及和网络的快速发展,操作系统的稳定性和安全性问题也日益凸显。一个常见的问题是蓝屏错误,代码0x000000d1是其中之一。蓝屏错误,或称为“蓝屏死机”,是当计算机遇到严重系统故障时发生的一种情况。当系统无法从错误中恢复时,Windows操作系统会显示一个蓝色的屏幕,并在屏幕上显示错误代码。这些错误代

蓝屏是我们在系统使用的时候经常会碰到的问题,根据错误代码的不同,会有很多中不一样的原因和解决方法。例如我们在使用时遇到stop:0x0000007f的问题,可能是硬件或软件错误,下面就跟着小编一起来看看解决方法吧。0x000000c5蓝屏代码原因:答:内存、CPU、显卡突然超频,或软件运行错误。解决方法一:1、在开机时候不断按F8进入,选择安全模式,回车进入。2、进入到安全模式后,按win+r打开运行窗口,输入cmd,回车。3、在命令提示窗口,输入“chkdsk/f/r”,回车,然后按y键。4、
