目录
第 10 章 使用变量的一般事项
第 11 章 变量名的力量
第 12 章 基本数据类型
第 13 章 不常见的数据类型
第 10 章 使用变量的一般事项
变量初始化的原则
- 在声明变量的时候初始化。
- 在靠近变量第一次使用的位置初始化它。结合第一条,应当在即将使用的时候声明,然后马上初始化变量。
- 尽量使用 final 或 const 声明变量,防止意外修改。
- 构造函数初始化类的所有数据成员。
- 个别情况下,注意检查是否需要重新初始化。
- 留意编译器警告信息。
缩小变量的作用域
- 尽量缩小变量在代码中的横跨的代码行数。
- 尽量缩小变量的存活时间。
减小变量作用域的原则
- 在即将用到的时候再声明、初始化。
- 把相关语句放到一起,缩小散布的范围。
- 把相关语句提取成单独的子程序。
- 一开始就对变量采用最严格的可见性,必要时再扩展。
为变量指定单一的用途
- 每个变量只用于单一用途。
- 避免变量隐含着不同变量代表完全不同的含义。
- 删除已声明的但从没使用过的变量。
核对表
第 11 章 变量名的力量
核对表
- 名字完整并准确地表达了变量所代表的含义吗?
- 名字反映了现实世界的问题而非编程语言方案吗?
- 循环下标的名字有意义吗?
- 所有的“临时”变量都重新命名为更有意义的名字了吗?
- 枚举类型的名字中含有能够表示其类别的前缀或后缀了吗?
- 是否避免只为节省一个字符而缩写名字的情况了?
- 是否避免使用容易看错或读错的名字了?
- 是否避免使用有相近含义的名字了?
- 是否避免使用与标准库子程序名或者预定义变量名冲突的名字了?
- 是否避免使用含有难读字符的名字了?
第 12 章 基本数据类型
核对表
数值概论
- 代码中使用神秘数值了吗
- 考虑了除零错误吗
- 类型转换明显吗
- 如果同一条语句中出现两个数据类型,会出错吗
- 避免混合类型比较了吗
- 编译警告都消除了吗
整数
- 整数除法注意处理结果的小数截断问题了吗
- 表达式避免了计算过程及结果的取值范围问题了吗
浮点数
- 避免了数量级相差巨大的形如 5000000.1、5000000.1+1 的数字做加减运算吗
- 注意处理了舍入错误发生的可能吗
- 注意避免了浮点数做相等比较吗
这里推荐朋友写的浮点数的二进制表示博文:
字符和字符串
- 代码中使用了神秘字符和神秘字符串吗
- 字符串使用存在 off-by-one 错误吗
- 注意字符串指针和字符数组的区别了吗
- 注意吧字符数组程度声明为 CONSTANT+1 了吗
- 注意在适当时候使用字符数组代替指针了吗
- 字符串变量初始化为 NULL 了吗
- 使用 strncpy、strncat、strncmp 而非其非 n 版本了吗
布尔变量
- 使用布尔变量来表意逻辑结果了吗
- 使用布尔变量来分割简化复杂条件判断了吗
枚举类型
- 使用了枚举类型替代散乱的具名变量来提高可读性、可靠性和可修改性了吗
- 在不能仅用 true、false 表示的情况下,使用枚举类型了吗
- 把枚举类型的第一条设定为非法值了吗
具名常量
- 神秘数值、神秘字符串、循环界限使用具名常量来替换了吗
- 存在部分使用具名常量部分直接使用数值、文字量的情况吗
数组
- 注意数组下标有超出边界了吗
- 数组引用有出现 off-by-one 错误吗
- 多维数组的多个下标的顺序正确吗
- 多重循环代码中不同循环的下标变量出现串话了吗
创建类型
- 程序对每一种可能变化的数据分别采用不同的类型吗
- 类型名是以实际含义为导向而非语言类型为导向吗
- 类型名描述性足够强吗
- 重新定义预定义类型吗
- 复杂情景下考虑创建一个类而非简单重定义类型了吗
第 13 章 不常见的数据类型
核对表:使用不常见的数据类型的注意事项
结构体
- 你有注意考虑使用结构体来使得程序更简单、易懂以及易于维护吗
- 有进一步考虑使用类来代替结构体会更方便吗
全局数据
- 设立的全局变量是否都是绝对有必要的?
- 变量的命名能够把局部数据、类数据和全局数据区分开吗
- 所有全局变量都加以文档说明了吗
- 是否有使用了包含大量杂乱数据的四处传递的巨大对象这种伪全局数据?
- 用访问器子程序来取代全局数据了吗
- 所有相关的访问器子程序都在同一抽象层之上吗
指针
- 把指针操作隔离在子程序里了吗
- 使用指针前检查它的有效性了吗?可能是悬空指针吗
- 指针使用完后把它设置为空值了吗
- 是否避免了一个指针变量重复使用指向不同含义的数据?
- 链表中的指针有按正确的顺序释放吗
- 在使用指针前是否已评估确认了没有其他非指针的替代方案?
2020年11月11日