code complete part2

基本数据类型:

1. 程序主体中仅能出现的数字就是0和1,除此之外,所有的数字都要用宏定义或者const类型,用清晰的变量名描述用途

2. 预防除零错误, assert(denominator!=0)或者其他

3. 显式进行类型转换

4.避免不同类型间比较

5.注意编译器警告

对于整数,需要注意:整数除法(去尾法),检查整数溢出,检查中间结果溢出

对于浮点数,需要注意:避免==的判断,需要加一个阈值,例如

for(i=0;i<10;i++)

a + = 0.1;

if(a==1.0)

因为最后的结果一定不会刚好等于1, 0.1在内存中二进制表示为0.000110011......

对于字符串,避免off-by-one错误,以及unicode,还有区分字符串和字符数组,malloc和calloc(包含了分配和初始化),用strcpy_s以及strncpy,不用strcpy

对于bool,用布尔变量来简化if的判断,一般写if(A&&B||C)可以直接写作 bool bskip = A&&B||C, if(bskip)....

对于枚举类型,把第一个留给非法值,因为大多数没有赋值的时候,就是0,这样可以及早的检测出问题

对于数组,如果操作比较复杂,不要用i,j来表示下标,因为比较容易弄混。。。

建立自己的类型,typedef float coordinate,这样可以起到封装的效果,并且一看就知道这个变量是用于存储坐标的;不过要记住不要重定义一个变量的类型

对于指针,可以用dog tag来监视这一段内存有没有被写坏。分配的时候多分配一些,在内存空间的前一段作为dog tag

组织直线型代码

如果有些函数要在另一些之前call到,请在函数名中清楚的表明这一点,init....之类的

使用条件语句

if...else 先判断那些正常的路径,再在else中处理那些不常见的代码

如果写了if,那么也要写else,要考虑如果出现了else怎么办

利用bool变量简化判断

对于case语句,把最常执行的放在顶端,用default来检查错误,打印错误信息

使用循环

任何时候都要在循环体加{},方便代码改动

循环的一些++操作,在循环体的最前面或者最后面进行

循环计数器应该是整形的

循环体不超过50行

嵌套小于3层

长循环挪到子函数中

时间: 2024-10-14 17:40:50

code complete part2的相关文章

《Code Complete》ch.23 调试

WHAT? 调试——发现错误的一种手段 WHY? 相对于不善于调试的程序员,善于调试的程序员只需要前者1/20的时间就可以找出问题所在 HOW? 科学的调试方法 把错误的发生稳定下来:假设-证实/证伪 确定错误原因:二分法 同他人讨论问题 忏悔式调试 抛开问题,休息一下 修正问题 动手之前先要理解问题 理解程序本身,而不仅仅是问题 验证对错误的分析 放松一下 治本,而不是治标 修改代码时一定要有正确的理由:不要随机地修改代码,在没有理解代码时对她做的改动越大,你对她能正确工作的信息就越低 检查自

《Code Complete》ch.11 变量名的力量

What? 如何给变量命名 Why? 易读(你三个月前的代码=别人的代码),易记,恰如其分 整齐的命名具有美感,强迫症患者居家旅行杀人放火之必备 How? 以问题为导向 好名字反映的是问题(what),并非解决方案(how).名字不应体现计算细节 // good Object studentData; int sum; // bad Object inputData; int calcValue; 控制变量名长度 合适的变量名长度为10-16个字符 较长的名字适用于少用到的全局变量,较短的名字适

《Code Complete》ch.25 代码调整策略

WHAT? 本章讨论程序性能调整问题.但是对用户来说,程序员按时交付软件,提供一个清爽的用户界面,避免系统经常死机常常比程序性能更加重要 WHY? 在程序设计这种文化中,编写出能够节省几微秒的代码可以证明你很酷-- HOW? Pareto法则 即80/20法则,指你可以通过20%的努力获取80%的成果 一些无稽之谈 在搞基高级语言中,减少代码行数可以加快代码执行速度 特定运算可能比其他的更快,代码规模也较小:在某个环境下提升程序性能的方法放到另一个环境中可能会损害程序性能.在调整代码的时候你实际

《Code Complete》ch.18 表驱动法

是什么 一种scheme,用表来做信息存取,代替逻辑语句(if/else) 为什么 简化逻辑语句,避免大量嵌套的 if/else 或者 switch/case 怎么用 三种访问表的方式 直接访问:将源数据作为key 索引访问:构建KV表 阶梯访问:分为连续区间,遍历或者二分查找 例子 // get the full name of weekday // good String[] weekdays = { "Sunday", "Monday", "Tues

code complete part1

最近在看code complete,学习了一些东西,作为点滴,记录下来. 关于类: 类的接口抽象应该一致 类的接口要可编程,不要对类的使用者做过多的假设.不要出现类似于:A的输入量一定要大于多少小于多少,一定要在某个函数前call之类的限制,而应该在assert等地方加入这些判断,让代码去做限制,而不是注释. 代码阅读的次数要比写的次数多得多 类的成员变量表征类拥有怎样一个属性 类的继承表征类还可以有另一个特殊的版本 类用到的其他类的次数叫做扇入(fan in),越少越好 要在构造函数中对所有的

《Code Complete》ch.24 重构

WHAT? 重构(refactoring),Martin Fowler将其定义为“在不改变软件外部行为的前提下,对其内部结构进行改变,使之更容易理解并便于修改”. WHY? 神话:一个管理很完善的软件项目,应该首先以系统化的方法进行需求开发,定义一份严谨的列表来描述程序的功能.设计完全遵循需求,并且完成的相当仔细,这样就让程序员的代码编写工作从头到尾直线型地工作.表明绝大多数代码首次编写后就已完美,测试通过即可被抛诸脑后.代码被修改的惟一时机发生在交付使用后在新版本进行功能的添加 现实:在初始开

《Code Complete》ch.8 防御式编程

WHAT? 主要思想:子程序不应因传入参数错误而被破坏 WHY? 保护程序免遭非法输入的破坏 HOW? 断言 assert denominator != 0 : "denominator should not be 0"; // 启动VM时需要 -ea 参数用以启动assert功能 只用于开发.维护阶段 用错误处理代码来处理预期会发生的状况,用断言来处理绝不会发生的状况 避免把需要执行的代码放入断言中 用断言来注解并验证前条件和后条件 错误处理技术 返回中立值(当对返回结果准确性要求较

《Code Complete》ch.7 高质量的子程序

WHAT? 子程序(routines)是为实现一个特定目的而编写的可被调用的方法或过程.在C++中是函数(function),在Java中是方法(method),在VB中是函数过程(function procedure)或子过程(sub procedure). WHY? 降低复杂度 引入中间.易懂的抽象 避免代码重复 支持继承.重写 隐藏实现细节 提高可移植性 改善性能(对明确的子程序进行优化) HOW? 内聚性(cohesion):是指子程序中各种操作之间联系的紧密程度 编程的目标是让每一个子

《Code Complete》ch.20 软件质量概述

WHAT & WHY ? 软件质量的特性 外在特性 正确性(Correctness) 可用性(Usability) 效率(Efficiency) 可靠性(Reliability) 完整性(Integrity) 适应性(Adaptability) 精确性(Accuracy) 健壮性(Robustness) 内在特性 可维护性(Maintainability) 灵活性(Flexibility) 可移植性(Portability) 可重用性(Reusability) 可读性(Readability)