编码检查 表
总结 了《 Writing Clean Code 》的所有 观 点,教你 编 写整 洁 无 错 的代 码 。使用本表的最好 办 法是花两周 时间评审 一下你的 设计 和 编码实现 。先花几分 钟时间 看一看列表,一旦熟悉了 这 些 问题 ,就可以灵活自如地按它写代 码 了。此 时 ,就可以把表放在一 边 了。
一般问题
── 你是否 为 程序建立了 DEBUG 版本?
── 你是否将 发现 的 错误 及 时 改正了?
─一 你是否 坚 持 彻 底 测试 代 码 .即使耽 误 了 进 度也在所不惜?
── 你是否依靠 测试组为 你 测试 代 码 ?
─一 你是否知道 编码 的 优 先 顺 序?
─一 你的 编译 程序是否有可 选 的各 种 警告?
关于将更改归并到主程序
─一 你是否将 编译 程序的警告(包括可 选 的)都 处 理了?
── 你的代 码 是否未用 Lint
─一 你的代 码进 行了 单 元 测试吗 ?
─一 你是否逐 步 通 过 了 每 一条 编码 路径以 观 察数据流?
─一 你是否逐 步 通 过 了 汇编语 言 层 次上的所有 关键 代 码 ?
── 是否清理 过 了任何代 码 ?如果是,修改 处经过彻 底 测试 了 吗 ?
─一 文档是否指出了使用你的代 码 有危 险 之 处 ?
── 程序 维护 人 员 是否能 够 理解你的代 码 ?
每当实现了一个函数或子系统之时
─一 是否用断言 证实 了函数参数的有效性?
─一 代 码 中是否有未定 义 的或者无意 义 的代 码 ?
─一 代 码 能否 创 建未定 义 的数据?
─一 有没有 难 以理解的断言? 对 它 们 作解 释 了没有?
─一 你在代 码 中是否作 过 任何假 设 ?
─一 是否使用断言警告可能出 现 的非常情况?
─一 是否作 过 防御性程序 设计 ?代 码 是否 隐 藏了 错误 ?
─一 是否用第二个算法来 验证 第一个算法?
─一 是否有可用于确 认 代 码 或数据的启 动 ( startup ) 检查 ?
─一 代 码 是否包含了随机行 为 ?能消除 这 些行 为吗 ?
── 你的代 码 若 产 生了无用信息,你是否在 DEBUG 代 码 中也把它 们 置 为 无用信息?
── 代 码 中是否有稀奇古怪的行 为 ?
── 若代 码 是子系 统 的一部分,那 么 你是否建立了一个子系 统测试 ?
── 在你的 设计 和代 码 中是否有任意情况?
── 即使程序 员 不感到需要,你也作完整性 检查吗 ?
── 你是否因 为 排 错 程序太大或太慢,而将有价 值 的 DEBUG 测试 抛置一 边 ?
── 是否使用了不可移植的数据 类 型?
─一 代 码 中是否有 变 量或表达式 产 生上溢或下溢?
── 是否准确地 实现 了你的 设计 ? 还 是非常近似地 实现 了你的 设计 ?
── 代 码 是否不止一次地解同一个 问题 ?
── 是否企 图 消除代 码 中的 每 一个 if 语 句?
── 是否用 过 嵌套?:运算符?
── 是否已将 专 用代 码 孤立出来?
── 是否用到了有 风险 的 语 言 惯 用 语 ?
─一 是否不必要地将不同 类 型的运算符混用?
── 是否 调 用了返回 错误 的函数?你能消除 这种调 用 吗 ?
─一 是否引用了尚未分配的存 储 空 间 ?
─一 是否引用已 经释 放了的存 储 空 间 ?
── 是否不必要地多用了 输 出 缓 冲存 储 ?
── 是否向静 态 或全局 缓 冲区 传 送了数据?
── 你的函数是否依 赖 于另一个函数的内部 细节 ?
── 是否使用了怪异的或有疑 问 的 C 惯 用 语 ?
── 在代 码 中是否有 挤 在一行的毛病?
── 代 码 有不必要的灵活性 吗 ?你能消除它 们吗 ?
─一 你的代 码 是 经过 多次“ 试 着”求解的 结 果 吗 ?
─一 函数是否小并容易 测试 ?
每当设计了一个函数或子系统后
─一 此特征是否符合 产 品的市 场 策略?
─一 错误 代 码 是否作 为 正常返回 值 的特殊情况而 隐 藏起来?
─一 是否 评审 了你的界面,它能保 证难 于出 现误 操作 吗 ?
─一 是否具有多用途且面面 俱 到的函数?
─一 你是否有太灵活的(空空洞洞的)函数参数?
─一 当你的函数不再需要 时 ,它是否返回一个 错误 条件?
─一 在 调 用点你的函数是出易 读 ?
─一 你的函数是否有布 尔 量 输 入?
修改错误之时
── 错误 无法消失,是否能找到 错误 的根源?
─一 是修改了 错误 的真正根源, 还 是 仅仅 修改了 错误 的症状?