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

MySQLdiffersfromotherSQLdialectsinsyntaxforLIMIT,auto-increment,stringcomparison,subqueries,andperformanceanalysis.1)MySQLusesLIMIT,whileSQLServerusesTOPandOracleusesROWNUM.2)MySQL'sAUTO_INCREMENTcontrastswithPostgreSQL'sSERIALandOracle'ssequenceandt

MySQL partitioning improves performance and simplifies maintenance. 1) Divide large tables into small pieces by specific criteria (such as date ranges), 2) physically divide data into independent files, 3) MySQL can focus on related partitions when querying, 4) Query optimizer can skip unrelated partitions, 5) Choosing the right partition strategy and maintaining it regularly is key.

How to grant and revoke permissions in MySQL? 1. Use the GRANT statement to grant permissions, such as GRANTALLPRIVILEGESONdatabase_name.TO'username'@'host'; 2. Use the REVOKE statement to revoke permissions, such as REVOKEALLPRIVILEGESONdatabase_name.FROM'username'@'host' to ensure timely communication of permission changes.

InnoDB is suitable for applications that require transaction support and high concurrency, while MyISAM is suitable for applications that require more reads and less writes. 1.InnoDB supports transaction and bank-level locks, suitable for e-commerce and banking systems. 2.MyISAM provides fast read and indexing, suitable for blogging and content management systems.

There are four main JOIN types in MySQL: INNERJOIN, LEFTJOIN, RIGHTJOIN and FULLOUTERJOIN. 1.INNERJOIN returns all rows in the two tables that meet the JOIN conditions. 2.LEFTJOIN returns all rows in the left table, even if there are no matching rows in the right table. 3. RIGHTJOIN is contrary to LEFTJOIN and returns all rows in the right table. 4.FULLOUTERJOIN returns all rows in the two tables that meet or do not meet JOIN conditions.

MySQLoffersvariousstorageengines,eachsuitedfordifferentusecases:1)InnoDBisidealforapplicationsneedingACIDcomplianceandhighconcurrency,supportingtransactionsandforeignkeys.2)MyISAMisbestforread-heavyworkloads,lackingtransactionsupport.3)Memoryengineis

Common security vulnerabilities in MySQL include SQL injection, weak passwords, improper permission configuration, and unupdated software. 1. SQL injection can be prevented by using preprocessing statements. 2. Weak passwords can be avoided by forcibly using strong password strategies. 3. Improper permission configuration can be resolved through regular review and adjustment of user permissions. 4. Unupdated software can be patched by regularly checking and updating the MySQL version.

Identifying slow queries in MySQL can be achieved by enabling slow query logs and setting thresholds. 1. Enable slow query logs and set thresholds. 2. View and analyze slow query log files, and use tools such as mysqldumpslow or pt-query-digest for in-depth analysis. 3. Optimizing slow queries can be achieved through index optimization, query rewriting and avoiding the use of SELECT*.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Dreamweaver CS6
Visual web development tools

SublimeText3 Chinese version
Chinese version, very easy to use

Notepad++7.3.1
Easy-to-use and free code editor

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.
