《编程精粹-Microsoft编写优质无错代码的秘诀》的摘录

来源:互联网 发布:分析软件有哪些 编辑:程序博客网 时间:2024/05/17 04:26

第一章:假想的编译程序
1.不要期待好运气会碰到错误,应该去自己主动发现错误,排除运气对程序测试的影响,主动地抓住错误每个机会
2.这章作者假想了一个非常智能的编译器,可以通过修改一些C语言规则,进行函数原形的检查和提供警告消息主动的发现错误,事实上能够利用现成的C编译器实现这些功能
3.勤用Lint程序进行检查
4.做单元测试(不要因为修改很平常而放弃单元测试)

第二章:自己设计并使用断言
1.对于每个程序最好都建立一个DEBUG版本,即要维护程序的交付版本,又要维护程序的调试版本
2.作者对用断言Assert进行了一些探讨并进行封装,建议利用断言对函数参数进行确认
3.从程序中删除无定义的特性,或者在程序中使用断言来检查出无定义特性的非法使用
(对于无定义的特性,应该用断言补救)
4.详细说明不清楚的断言,特别对一个难以理解的断言
5.对自己的假定(或认为是不可能的情况),利用断言检验其正确性
6.进行防错型程序设计时,不要隐瞒错误,必须及时地报告
7.利用不同的算法对同一个东西进行检验,即使会降低程序运行速度

第三章:为子系统设防
1.作者认为在调用子系统时,是使用断言的最好时机,利用断言进行参数检验或是检验假设和不可能的情况
2.消除随机特性,使错误可再现(作者利用内存分配的一个例子,在无用的内存中填入特定的字符如0xa3,来消除随机的特性,防止对于无用内存的引用,可以很容易的发现问题
3.冲掉无用的信息,以免错误使用,说到底,就是为了将错误早点暴露出来
4.保存调试信息,方便进行更强的错误检查
5.建立详尽的子系统检查并且经常地进行这些检查
6.对于测试代码也需要深思熟虑
7.对于一致性,正确形的检查,应该做到透明
8.在交付版本中,应该将内部影响性能的内部调试检查代码全部清除

第四章:对程序进行逐条跟踪
1.不要等到出现错误在逐语句调试程序,在编写一个子函数就应该逐语句调试,验证正确性
2.对每一条代码路径跟踪调试
3.密切关注数据流,因为通过观察数据流能够真正理解程序是否运行正确
4.源码调试程序可能会隐瞒执行的细节,对关键部分代码(设计代码优化)需要汇编指令的跟踪


第五章:糖果机界面
这里作者所谈及的就是怎么编写通过良好的函数界面来编写无错代码
1.使用户不容易忽视错误情况,对于返回值中最好能够获得错误代码而不是隐藏
2.不遗余力地寻找消除函数界面的缺陷
3.作者通过对于realloc这个失败的函数的分析,建议不要编写将多种功能于一身的函数,对于函数参数必须进行进行更强的确认,编写功能单一的函数
4.明确定义函数的参数
5.编写函数是其在给定的有效输入下不会失败并且函数调用要简单明了
6.编写注解突出可能的异常情况,最好的方法就是编写一个模范调用的例程

第六章:风险事业
这里作者所谈论的就是对于数据移植,数据范围,和一些含有风险性的语句
1.使用严格定义的数据类型,尽量使用可移植的数据类型,考虑尽可能的能够跨平台
2.经常反问:"这个变量或是表达式会上溢或下溢"
3.精确的实现设计,近似实现设计就可能出错误
4.一次任务就应该一次完成,一个函数就应该完成特定的任务
5.避免无关紧要的if,避免嵌套使用?:运算符(可读性可执行效率),每种特殊情况只能处理一次
6.避免使用有风险的语言惯用语
7.不能毫无必要地将不同类型的操作符混合使用,如果不清楚优先级,用括号将它们隔离开来
8.避免调用返回错误的函数

第七章:编码中的假象
1.只引用属于你自己的存储空间
2.只有系统才能拥有空闲的存储区,程序员不能拥有
3.指向输出的指针不是指向工作空间缓冲区的指针
4.不要去静态(或全局)两存储区传递数据,很容易出现问题,私有数据要自己管
5.不要写寄生函数,即依赖于其他函数的实现
6.不要滥用程序设计语言,不要依赖于程序设计语言的特定技巧细节
7.紧凑的C代码并不能保证得到高效的机器代码(这点太对了,不然的话,优化编译器就不需要了)
8.为一般水平的程序员编写代码(你认为x<<=1;和x/=2哪个效率高,事实上采用优化编译器两者一样高)

第八章:剩下来的就是态度问题
1.错误不会消失,错误只会因为环境设置的改变而掩盖,而不会无故消失
错误小时有三个原因:错误报告不对,错误被别的程序员修改,错误没有表现出来
2.马上修改错误,不要推迟到最后
3.修改错误要治本,不要治表
4.除非关系产品成败,否则不要整理代码
5.不要事先没有战略意义的特征(这个特征很好吗?但是它是为服务实现的还是为挑战你的技术实现的,如果是为挑战技术而实现,请删)
6.不设自由特征(自由特征需要更多的编码,更多的测试,更多的人来编写文档)
7.不要允许没有必要的灵活性
8.在找到正确的解法之前,不要一味地“试”,要花时间寻求正确的解
(试一试试一个忌讳词。试一试很可能会为了求解答儿饥不择食,最后的解不规范可能还有副作用,通过查取文档,多读少试来解决问题才是最好的办法)
9.编写和测试小块代码,即使测试代码会影响进度,也要坚持测试代码
10.测试代码的责任不在测试员身上,而是在程序员自己的责任
11.不要责怪测试员发现了你的错误,你应该感谢测试员,因为测试员帮助你避免交付错误
12.建立自己的优先级列表并坚持之
(正确性,可测试性,全局效率,可维护性,一致性,大小,局部效率,个人表达方式,个人方便性)

总结:
决不允许同样错误出现两次

 
原创粉丝点击