《代码大全》代码高效规范部分读书笔记
前三周看的是C++/C高质量编程,将全书看完后,为了进一步了解与提高编写的代码的规范性与高效性,更深刻的了解相关知识,因此,我特地挑选了代码大全中与之前所读的C++/C高质量相类似的第八章与第十一章进行阅读,与之前三周所学进行对比,互为补充,加深自己的印象以及理解。
第八章:防御式编程
主要思想:子程序应该不因传入数据错误而遭到破坏,哪怕是由其它子程序产生的错误数据
8.1 保护程序免遭非法数据的破坏
检查所有来源于外部的数据的值;检查子程序所有输入参数的值;觉得如何处理错误的数据
8.2 断言(assertions)
断言是指在开发期间使用的,让程序进行自检的代码;一个断言通常含有连个参数,一个描述假设为真时的情况的布尔表达式,和一个断言为假时需要显示的信息;
关于断言的一些指导性建议:
1. 用错误代码来处理预期会发生的情况,用断言来处理绝不应该发生的情况
2. 避免把需要执行的代码放入断言
3. 用断言注解并验证前后条件
4. 对于高健壮型的代码应该先试用断言再处理错误
8.3错误处理技术
处理预料中可能发生的错误的方法:换用下一个正确的数据;返回与前次相同的数据;换用最接近的合法值;把警告信息记录到日志文件中;返回一个错误码;调用错误处理子程序或对象;当错误发生时显示错误信息;用最妥当的方式在局部处理错误;关闭程序等
错误处理最恰当的方式要根据错误出现的软件的类别而定,有时侧重于正确性,有时侧重于健壮性
8.4 异常
异常是把代码中的错误或异常事件传递给调用方代码的一种特殊手段,还可以用异常来清理一段代码中存在的杂乱逻辑(用try_catch重写)
建议:用异常通知其它程序发生了不可忽略的错误;真正例外的情况才抛出异常(程序的复杂度会增加);不能用异常来推卸责任,若错误情况可以在局部处理,那就再局部处理掉它;避免在构造函数和析构函数中抛出异常,除非在同一地方将它们捕获(?);在恰当的抽象层次抛出异常(?);在异常消息中加入关于异常的全部信息;避免使用空的catch语句;了解所用库函数可能抛出的异常;考虑创建一个集中的异常报告机制;把项目中对异常的使用标准化;考虑异常的替换方案
8.5 隔离程序,使之包容由错误造成的伤害
让软件的某些部分处理“不干净”的数据,而让另一些部分处理“干净”的数据,即可让大部分代码无须担负检查错误数据的职责
在输入数据时将其转化为恰当的类型
隔栅外部的程序应使用错误处理技术,在隔栅内部的数据应使用断言处理
8.6 辅助调试的代码
1.不要自动地把产品版的限制强加于开发版上,应在开发期间牺牲一些对速度和资源的使用,来换取一些可以让开发更顺畅的内置工具
2.尽早引入辅助调试的代码
3.采用进攻式编程,有时候最好的防守是采取大胆的进攻,在开发时惨痛地失败,能让你在发布产品后不会败地太惨
4.计划移除调试辅助的代码:使用类似ant和make这样的版本控制工具和make工具;使用内置的预处理器;编写自己的预处理器;使用调试存根
8.7 确定在产品代码中该保留多少防御式代码
保留那些检查重要错误的代码,去掉检查细微错误的代码,去掉导致程序硬性崩溃的代码,保留可以让程序稳妥崩溃的代码,为技术支持人员记录错误信息,确认在代码中留的错误信息是有好的
过度的防御式编程也会引起问题
第十一章:变量名的力量
为变量取好名字同高效编程一样重要
11.1 选好变量名的注意事项
要以问题为导向,选取适当的名字长度;较长的名字适用于很少用到的变量或者全局变量,较短的名字适用于局部变量或循环变量;
变量名中的计算限定词加到名字最后:total,sum,average,max,min,record,string, pointer等;
11.2 为特定类型的数据命名
为循环下标命名:i,j,k——RecordCount,TeamIndex等;
为状态变量命名:flag——StatusFlag,PrintFlag等;
为临时变量命名:temp——discriminant等;
为bool变量命名:done,error,success,ok,found等;
11.3 命名规则的力量
11.4 非正式命名规则
区分方法:大小写、加前缀、明确的名字等;
11.5 标准前缀
用于文字处理程序的示例:ch,doc,pa,scr(screen region),sel(selection),wn(window);
语义前缀:c(count),first,g(global variable),lim,p;
11.6 创建具备可读性的短名字
缩写的一般指导原则:去掉所有非前置元音;去掉虚词and,or,the;去掉无用后缀ing,ed等;保留每个音节中最引人注意的发音
例如:computer——comptr,screen——scrn,apple——appl,integer——intgr
总结:好的变量名是提高程序可读性的一项关键要素,对特殊种类的变量,如循环下标和状态变量需特殊考虑;名字要尽可能具体,确保所取的名字更侧重于阅读方便而不是编写方便。