搜索
首页数据库mysql教程【善于防守-健壮代码的防御性编程技巧】

最近在看【美】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/

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
MySQL的许可与其他数据库系统相比如何?MySQL的许可与其他数据库系统相比如何?Apr 25, 2025 am 12:26 AM

MySQL使用的是GPL许可证。1)GPL许可证允许自由使用、修改和分发MySQL,但修改后的分发需遵循GPL。2)商业许可证可避免公开修改,适合需要保密的商业应用。

您什么时候选择InnoDB而不是Myisam,反之亦然?您什么时候选择InnoDB而不是Myisam,反之亦然?Apr 25, 2025 am 12:22 AM

选择InnoDB而不是MyISAM的情况包括:1)需要事务支持,2)高并发环境,3)需要高数据一致性;反之,选择MyISAM的情况包括:1)主要是读操作,2)不需要事务支持。InnoDB适合需要高数据一致性和事务处理的应用,如电商平台,而MyISAM适合读密集型且无需事务的应用,如博客系统。

在MySQL中解释外键的目的。在MySQL中解释外键的目的。Apr 25, 2025 am 12:17 AM

在MySQL中,外键的作用是建立表与表之间的关系,确保数据的一致性和完整性。外键通过引用完整性检查和级联操作维护数据的有效性,使用时需注意性能优化和避免常见错误。

MySQL中有哪些不同类型的索引?MySQL中有哪些不同类型的索引?Apr 25, 2025 am 12:12 AM

MySQL中有四种主要的索引类型:B-Tree索引、哈希索引、全文索引和空间索引。1.B-Tree索引适用于范围查询、排序和分组,适合在employees表的name列上创建。2.哈希索引适用于等值查询,适合在MEMORY存储引擎的hash_table表的id列上创建。3.全文索引用于文本搜索,适合在articles表的content列上创建。4.空间索引用于地理空间查询,适合在locations表的geom列上创建。

您如何在MySQL中创建索引?您如何在MySQL中创建索引?Apr 25, 2025 am 12:06 AM

toCreateAnIndexinMysql,usethecReateIndexStatement.1)forasingLecolumn,使用“ createIndexIdx_lastNameEnemployees(lastName); 2)foracompositeIndex,使用“ createIndexIndexIndexIndexIndexDx_nameOmplayees(lastName,firstName,firstName);” 3)forauniqe instex,creationexexexexex,

MySQL与Sqlite有何不同?MySQL与Sqlite有何不同?Apr 24, 2025 am 12:12 AM

MySQL和SQLite的主要区别在于设计理念和使用场景:1.MySQL适用于大型应用和企业级解决方案,支持高性能和高并发;2.SQLite适合移动应用和桌面软件,轻量级且易于嵌入。

MySQL中的索引是什么?它们如何提高性能?MySQL中的索引是什么?它们如何提高性能?Apr 24, 2025 am 12:09 AM

MySQL中的索引是数据库表中一列或多列的有序结构,用于加速数据检索。1)索引通过减少扫描数据量提升查询速度。2)B-Tree索引利用平衡树结构,适合范围查询和排序。3)创建索引使用CREATEINDEX语句,如CREATEINDEXidx_customer_idONorders(customer_id)。4)复合索引可优化多列查询,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。5)使用EXPLAIN分析查询计划,避

说明如何使用MySQL中的交易来确保数据一致性。说明如何使用MySQL中的交易来确保数据一致性。Apr 24, 2025 am 12:09 AM

在MySQL中使用事务可以确保数据一致性。1)通过STARTTRANSACTION开始事务,执行SQL操作后用COMMIT提交或ROLLBACK回滚。2)使用SAVEPOINT可以设置保存点,允许部分回滚。3)性能优化建议包括缩短事务时间、避免大规模查询和合理使用隔离级别。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器