11.01.2015 Views

编程规范和范例

编程规范和范例

编程规范和范例

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

目 录<br />

1 排 版 6<br />

2 注 释 11<br />

3 标 识 符 命 名 18<br />

4 可 读 性 20<br />

5 变 量 、 结 构 22<br />

6 函 数 、 过 程 28<br />

7 可 测 性 36<br />

8 程 序 效 率 40<br />

9 质 量 保 证 44<br />

10 代 码 编 辑 、 编 译 、 审 查 50<br />

11 代 码 测 试 、 维 护 52<br />

12 宏 53


软 件 编 程 规 范 总 则<br />

1 排 版<br />

1 排 版<br />

¹1-1: 程 序 块 要 采 用 缩 进 风 格 编 写 , 缩 进 的 空 格 数 为 4 个 ⃞<br />

说 明 : 对 于 由 开 发 工 具 自 动 生 成 的 代 码 可 以 有 不 一 致 ⃞<br />

¹1-2: 相 对 独 立 的 程 序 块 之 间 、 变 量 说 明 之 后 必 须 加 空 行 ⃞<br />

示 例 : 如如 下 例 子 不 符 合 规 范 ⃞<br />

if (!valid_ni(ni))<br />

{<br />

... // program code<br />

}<br />

repssn_ind = ssn_data[index].repssn_index;<br />

repssn_ni = ssn_data[index].ni;<br />

应 如如 下 书 写<br />

if (!valid_ni(ni))<br />

{<br />

... // program code<br />

}<br />

repssn_ind = ssn_data[index].repssn_index;<br />

repssn_ni = ssn_data[index].ni;<br />

¹1-3: 较 长 的 语 句 (>80 字 符 ) 要 分 成 多 行 书 写 , 长 表 达 式 要 在 低 优 先 级 操 作 符 处 划 分 新 行 ,<br />

操 作 符 放 在 新 行 之 首 , 划 分 出 的 新 行 要 进 行 适 当 的 缩 进 , 使 排 版 整 齐 , 语 句 可 读 ⃞<br />

示 例 :<br />

perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN<br />

+ STAT_SIZE_PER_FRAM * sizeof( _UL );<br />

act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied<br />

= stat_poi[index].occupied;<br />

act_task_table[taskno].duration_true_or_false<br />

= SYS_get_sccp_statistic_state( stat_item );<br />

report_or_not_flag = ((taskno < MAX_ACT_TASK_NUMBER)<br />

仅 供 内 部 使 用 2


软 件 编 程 规 范 总 则<br />

1 排 版<br />

&& (n7stat_stat_item_valid (stat_item))<br />

&& (act_task_table[taskno].result_data != 0));<br />

仅 供 内 部 使 用 3


软 件 编 程 规 范 总 则<br />

1 排 版<br />

¹1-4: 循 环 、 判 断 等 语 句 中 若 有 较 长 的 表 达 式 或 语 句 , 则 要 进 行 适 应 的 划 分 , 长 表 达 式 要 在 低<br />

优 先 级 操 作 符 处 划 分 新 行 , 操 作 符 放 在 新 行 之 首 ⃞<br />

示 例 :<br />

if ((taskno < max_act_task_number)<br />

&& (n7stat_stat_item_valid (stat_item)))<br />

{<br />

... // program code<br />

}<br />

for (i = 0, j = 0; (i < BufferKeyword[word_index].word_length)<br />

&& (j < NewKeyword.word_length); i++, j++)<br />

{<br />

... // program code<br />

}<br />

for (i = 0, j = 0;<br />

(i < first_word_length) && (j < second_word_length);<br />

i++, j++)<br />

{<br />

... // program code<br />

}<br />

¹1-5: 若 函 数 或 过 程 中 的 参 数 较 长 , 则 要 进 行 适 当 的 划 分 ⃞<br />

示 例 :<br />

n7stat_str_compare((BYTE *) & stat_object,<br />

(BYTE *) & (act_task_table[taskno].stat_object),<br />

sizeof (_STAT_OBJECT));<br />

n7stat_flash_act_duration( stat_item, frame_id *STAT_TASK_CHECK_NUMBER<br />

+ index, stat_object );<br />

¹1-6: 不 允 许 把 多 个 短 语 句 写 在 一 行 中 , 即 一 行 只 写 一 条 语 句 ⃞<br />

示 例 : 如如 下 例 子 不 符 合 规 范 ⃞<br />

rect.length = 0; rect.width = 0;<br />

应 如如 下 书 写<br />

仅 供 内 部 使 用 4


软 件 编 程 规 范 总 则<br />

1 排 版<br />

rect.length = 0;<br />

rect.width = 0;<br />

¹1-7:if、for、do、while、case、switch、default 等 语 句 自 占 一 行 , 且 if、for、<br />

do、while 等 语 句 的 执 行 语 句 部 分 无 论 多 少 都 要 加 括 号 {}⃞<br />

示 例 : 如如 下 例 子 不 符 合 规 范 ⃞<br />

if (pUserCR == NULL) return;<br />

应 如如 下 书 写 :<br />

if (pUserCR == NULL)<br />

{<br />

return;<br />

}<br />

¹1-8: 对 齐 只 使 用 空 格 键 , 不 使 用 TAB 键 ⃞<br />

说 明 : 以 免 用 不 同 的 编 辑 器 阅 读 程 序 时 , 因 TAB 键 所 设 置 的 空 格 数 目 不 同 而 造 成 程 序 布 局<br />

不 整 齐 , 不 要 使 用 BC 作 为 编 辑 器 合 版 本 , 因 为 BC 会 自 动 将 8 个 空 格 变 为 一 个 TAB 键 ,<br />

因 此 使 用 BC 合 入 的 版 本 大 多 会 将 缩 进 变 乱 ⃞<br />

¹1-9: 函 数 或 过 程 的 开 始始 、 结 构 的 定 义 及 循 环 、 判 断 等 语 句 中 的 代 码 都 要 采 用 缩 进 风 格 ,case<br />

语 句 下 的 情 况 处 理 语 句 也 要 遵 从 语 句 缩 进 要 求 ⃞<br />

¹1-10: 程 序 块 的 分 界 符 ( 如如 C/C++ 语 言 的 大 括 号 ‘{’ 和和 ‘}’) 应 各 独 占 一 行 并 且 位 于 同 一<br />

列 , 同 时 与 引 用 它 们 的 语 句 左 对 齐 ⃞ 在 函 数 体 的 开 始始 、 类 的 定 义 、 结 构 的 定 义 、 枚 举 的 定 义 以<br />

及 if、for、do、while、switch、case 语 句 中 的 程 序 都 要 采 用 如如 上 的 缩 进 方 式 ⃞<br />

示 例 : 如如 下 例 子 不 符 合 规 范 ⃞<br />

for (...) {<br />

... // program code<br />

}<br />

if (...)<br />

{<br />

... // program code<br />

}<br />

仅 供 内 部 使 用 5


软 件 编 程 规 范 总 则<br />

1 排 版<br />

void example_fun( void )<br />

{<br />

... // program code<br />

}<br />

应 如如 下 书 写 ⃞<br />

for (...)<br />

{<br />

... // program code<br />

}<br />

if (...)<br />

{<br />

... // program code<br />

}<br />

void example_fun( void )<br />

{<br />

... // program code<br />

}<br />

¹1-11: 在 两 个 以 上 的 关 键 字 、 变 量 、 常 量 进 行 对 等 操 作 时 , 它 们 之 间 的 操 作 符 之 前前 、 之 后 或<br />

者 前前 后 要 加 空 格 ; 进 行 非 对 等 操 作 时 , 如如 果 是 关 系 密 切 的 立 即 操 作 符 ( 如如 ->),<br />

后 不 应 加 空<br />

格 ⃞<br />

说 明 : 采 用 这 种 松 散 方 式 编 写 代 码 的 目 的 是 使 代 码 更 加 清 晰 ⃞<br />

由 于 留 空 格 所 产 生 的 清 晰 性 是 相 对 的 , 所 以 , 在 已 经 非 常 清 晰 的 语 句 中 没 有 必 要 再 留 空 格 ,<br />

如如 果 语 句 已 足 够 清 晰 则 括 号 内 侧 ( 即 左 括 号 后 面 和和 右 括 号 前前 面 ) 不 需 要 加 空 格 , 多 重 括 号 间<br />

不 必 加 空 格 , 因 为 在 C/C++ 语 言 中 括 号 已 经 是 最 清 晰 的 标 志 了 ⃞<br />

在 长 语 句 中 , 如如 果 需 要 加 的 空 格 非 常 多 , 那 么 应 该 保 持 整 体 清 晰 , 而 在 局 部 不 加 空 格 ⃞ 给<br />

操 作 符 留 空 格 时 不 要 连 续 留 两 个 以 上 空 格 ⃞<br />

示 例 :<br />

(1) 逗 号 、 分 号 只 在 后 面 加 空 格 ⃞<br />

int a, b, c;<br />

仅 供 内 部 使 用 6


软 件 编 程 规 范 总 则<br />

1 排 版<br />

(2) 比 较 操 作 符 , 赋 值 操 作 符 "="、 "+=", 算 术 操 作 符 "+"、"%", 逻 辑 操 作 符 "&&"、<br />

"&", 位 域 操 作 符 ""、"." 前前 后 不 加 空 格 ⃞<br />

p->id = pid;<br />

// "->" 指 针 前前 后 不 加 空 格<br />

(5) if、for、while、switch 等 与 后 面 的 括 号 间 应 加 空 格 , 使 if 等 关 键 字 更 为 突 出 、<br />

明 显 ⃞<br />

if (a >= b && c > d)<br />

½1-1: 一 行 程 序 以 小 于 80 字 符 为 宜 , 不 要 写 得 过 长 ⃞<br />

仅 供 内 部 使 用 7


软 件 编 程 规 范 总 则<br />

2 注 释<br />

2 注 释<br />

¹2-1: 一 般 情 况 下 , 源 程 序 有 效 注 释 量 必 须 在 20% 以 上 ⃞<br />

说 明 : 注 释 的 原 则 是 有 助 于 对 程 序 的 阅 读 理 解 , 在 该 加 的 地 方 都 加 了 , 注 释 不 宜 太 多 也 不<br />

能 太 少 , 注 释 语 言 必 须 准 确 、 易 懂 、 简 洁 ⃞<br />

¹2-2: 说 明 性 文 件 ( 如如 头头 文 件 .h 文 件 、.inc 文 件 、.def 文 件 、 编 译 说 明 文 件 .cfg 等 ) 头头 部 应<br />

进 行 注 释 , 注 释 必 须 列 出 : 版 权 说 明 、 版 本 号 、 生 成 日 期 、 作 者 、 内 容 、 功 能 、 与 其 它 文 件 的<br />

关 系 、 修 改 日 志 等 , 头头 文 件 的 注 释 中 还 应 有 函 数 功 能 简 要 说 明 ⃞<br />

示 例 : 下 面 这 段 头头 文 件 的 头头 注 释 比 较 标 准 , 当 然 , 并 不 局 限 于 此 格 式 , 但 上 述 信 息 建 议 要<br />

包包 含 在 内 ⃞<br />

/*************************************************<br />

Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.<br />

File name: // 文 件 名<br />

Author: Version: Date: // 作 者 、 版 本 及 完 成 日 期<br />

Description:<br />

// 用 于 详 细 说 明 此 程 序 文 件 完 成 的 主 要 功 能 , 与 其 他 模 块<br />

// 或 函 数 的 接 口 , 输 出 值 、 取 值 范 围 、 含 义 及 参 数 间 的 控<br />

// 制制 、 顺 序 、 独 立 或 依 赖 等 关 系<br />

Others:<br />

// 其 它 内 容 的 说 明<br />

Function List: // 主 要 函 数 列 表 , 每 条 记 录 应 包包 括 函 数 名 及 功 能 简 要 说 明<br />

1. ....<br />

History: // 修 改 历 史 记 录 列 表 , 每 条 修 改 记 录 应 包包 括 修 改 日 期 、 修 改<br />

// 者 及 修 改 内 容 简 述<br />

1. Date:<br />

Author:<br />

Modification:<br />

2. ...<br />

*************************************************/<br />

¹2-3: 源 文 件 头头 部 应 进 行 注 释 , 列 出 : 版 权 说 明 、 版 本 号 、 生 成 日 期 、 作 者 、 模 块 目 的 / 功 能 、<br />

主 要 函 数 及 其 功 能 、 修 改 日 志 等 ⃞<br />

示 例 : 下 面 这 段 源 文 件 的 头头 注 释 比 较 标 准 , 当 然 , 并 不 局 限 于 此 格 式 , 但 上 述 信 息 建 议 要<br />

包包 含 在 内 ⃞<br />

仅 供 内 部 使 用 8


软 件 编 程 规 范 总 则<br />

2 注 释<br />

/************************************************************<br />

Copyright (C), 1988-1999, Huawei Tech. Co., Ltd.<br />

FileName: test.cpp<br />

Author: Version : Date:<br />

Description: // 模 块 描 述<br />

Version:<br />

// 版 本 信 息<br />

Function List: // 主 要 函 数 及 其 功 能<br />

1. -------<br />

History: // 历 史 修 改 记 录<br />

<br />

David 96/10/12 1.0 build this moudle<br />

***********************************************************/<br />

说 明 :Description 一 项 描 述 本 文 件 的 内 容 、 功 能 、 内 部 各 部 分 之 间 的 关 系 及 本 文 件 与<br />

其 它 文 件 关 系 等 ⃞History 是 修 改 历 史 记 录 列 表 , 每 条 修 改 记 录 应 包包 括 修 改 日 期 、 修 改<br />

者 及 修 改 内 容 简 述 ⃞<br />

¹2-4: 函 数 头头 部 应 进 行 注 释 , 列 出 : 函 数 的 目 的 / 功 能 、 输 入 参 数 、 输 出 参 数 、 返 回 值 、 调 用<br />

关 系 ( 函 数 、 表 ) 等 ⃞<br />

示 例 : 下 面 这 段 函 数 的 注 释 比 较 标 准 , 当 然 , 并 不 局 限 于 此 格 式 , 但 上 述 信 息 建 议 要 包包 含<br />

在 内 ⃞<br />

/*************************************************<br />

Function: // 函 数 名 称<br />

Description:<br />

Calls:<br />

Called By:<br />

// 函 数 功 能 、 性 能 等 的 描 述<br />

// 被 本 函 数 调 用 的 函 数 清 单<br />

// 调 用 本 函 数 的 函 数 清 单<br />

Table Accessed: // 被 访 问 的 表 ( 此 项 仅 对 于 牵 扯 到到 数 据 库 操 作 的 程 序 )<br />

Table Updated: // 被 修 改 的 表 ( 此 项 仅 对 于 牵 扯 到到 数 据 库 操 作 的 程 序 )<br />

Input:<br />

// 输 入 参 数 说 明 , 包包 括 每 个 参 数 的 作<br />

// 用 、 取 值 说 明 及 参 数 间 关 系 ⃞<br />

Output:<br />

Return:<br />

// 对 输 出 参 数 的 说 明 ⃞<br />

// 函 数 返 回 值 的 说 明<br />

Others:<br />

// 其 它 说 明<br />

*************************************************/<br />

仅 供 内 部 使 用 9


软 件 编 程 规 范 总 则<br />

2 注 释<br />

¹2-5: 边 写 代 码 边 注 释 , 修 改 代 码 同 时 修 改 相 应 的 注 释 , 以 保 证 注 释 与 代 码 的 一 致 性 ⃞ 不 再 有<br />

用 的 注 释 要 删 除 ⃞<br />

¹2-6: 注 释 的 内 容 要 清 楚 、 明 了 , 含 义 准 确 , 防 止 注 释 二 义 性 ⃞<br />

说 明 : 错 误 的 注 释 不 但 无 益 反 而 有 害 ⃞<br />

规 则 2-7: 避 免 在 注 释 中 使 用 缩 写 , 特 别 是 非 常 用 缩 写 ⃞<br />

说 明 : 在 使 用 缩 写 时 或 之 前前 , 应 对 缩 写 进 行 必 要 的 说 明 ⃞<br />

¹2-8: 注 释 应 与 其 描 述 的 代 码 相 近 , 对 代 码 的 注 释 应 放 在 其 上 方 或 右 方 ( 对 单 条 语 句 的 注 释 )<br />

相 邻 位 置 , 不 可 放 在 下 面 , 如如 放 于 上 方 则 需 与 其 上 面 的 代 码 用 空 行 隔 开 ⃞<br />

示 例 : 如如 下 例 子 不 符 合 规 范 ⃞<br />

例 1:<br />

/* get replicate sub system index and net indicator */<br />

repssn_ind = ssn_data[index].repssn_index;<br />

repssn_ni = ssn_data[index].ni;<br />

例 2:<br />

repssn_ind = ssn_data[index].repssn_index;<br />

repssn_ni = ssn_data[index].ni;<br />

/* get replicate sub system index and net indicator */<br />

应 如如 下 书 写<br />

/* get replicate sub system index and net indicator */<br />

repssn_ind = ssn_data[index].repssn_index;<br />

repssn_ni = ssn_data[index].ni;<br />

¹2-9: 对 于 所 有 有 物 理 含 义 的 变 量 、 常 量 , 如如 果 其 命命 名 不 是 充 分 自 注 释 的 , 在 声 明 时 都 必 须 加<br />

以 注 释 , 说 明 其 物 理 含 义 ⃞ 变 量 、 常 量 、 宏 的 注 释 应 放 在 其 上 方 相 邻 位 置 或 右 方 ⃞<br />

示 例 :<br />

/* active statistic task number */<br />

#define MAX_ACT_TASK_NUMBER 1000<br />

仅 供 内 部 使 用 10


软 件 编 程 规 范 总 则<br />

2 注 释<br />

#define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number */<br />

¹2-10: 数 据 结 构 声 明 ( 包包 括 数 组 、 结 构 、 类 、 枚 举 等 ), 如如 果 其 命命 名 不 是 充 分 自 注 释 的 , 必 须<br />

加 以 注 释 ⃞ 对 数 据 结 构 的 注 释 应 放 在 其 上 方 相 邻 位 置 , 不 可 放 在 下 面 ; 对 结 构 中 的 每 个 域 的 注<br />

释 放 在 此 域 的 右 方 ⃞<br />

示 例 : 可 按 如如 下 形 式 说 明 枚 举 / 数 据 / 联 合 结 构 ⃞<br />

/* sccp interface with sccp user primitive message name */<br />

enum SCCP_USER_PRIMITIVE<br />

{<br />

N_UNITDATA_IND, /* sccp notify sccp user unit data come */<br />

N_NOTICE_IND, /* sccp notify user the No.7 network can not */<br />

/* transmission this message */<br />

N_UNITDATA_REQ, /* sccp user's unit data transmission request*/<br />

};<br />

¹2-11: 全 局 变 量 要 有 较 详 细 的 注 释 , 包包 括 对 其 功 能 、 取 值 范 围 、 哪哪 些 函 数 或 过 程 存 取 它 以 及<br />

存 取 时 注 意 事 项 等 的 说 明 ⃞<br />

示 例 :<br />

/* The ErrorCode when SCCP translate */<br />

/* Global Title failure, as follows */ // 变 量 作 用 、 含 义<br />

/* 0 - SUCCESS 1 - GT Table error */<br />

/* 2 - GT error Others - no use */ // 变 量 取 值 范 围<br />

/* only function SCCPTranslate() in */<br />

/* this modual can modify it, and other */<br />

/* module can visit it through call */<br />

/* the function GetGTTransErrorCode() */ // 使 用 方 法<br />

BYTE g_GTTranErrorCode;<br />

¹2-12: 注 释 与 所 描 述 内 容 进 行 同 样 的 缩 排 ⃞<br />

说 明 : 可 使 程 序 排 版 整 齐 , 并 方 便 注 释 的 阅 读 与 理 解 ⃞<br />

示 例 : 如如 下 例 子 , 排 版 不 整 齐 , 阅 读 稍 感 不 方 便 ⃞<br />

void example_fun( void )<br />

{<br />

/* code one comments */<br />

CodeBlock One<br />

仅 供 内 部 使 用 11


软 件 编 程 规 范 总 则<br />

2 注 释<br />

}<br />

/* code two comments */<br />

CodeBlock Two<br />

应 改 为 如如 下 布 局 ⃞<br />

void example_fun( void )<br />

{<br />

/* code one comments */<br />

CodeBlock One<br />

}<br />

/* code two comments */<br />

CodeBlock Two<br />

¹2-13: 将 注 释 与 其 上 面 的 代 码 用 空 行 隔 开 ⃞<br />

示 例 : 如如 下 例 子 , 显 得 代 码 过 于 紧 凑 ⃞<br />

/* code one comments */<br />

program code one<br />

/* code two comments */<br />

program code two<br />

应 如如 下 书 写<br />

/* code one comments */<br />

program code one<br />

/* code two comments */<br />

program code two<br />

¹2-14: 对 变 量 的 定 义 和和 分 支 语 句 ( 条 件 分 支 、 循 环 语 句 等 ) 必 须 编 写 注 释 ⃞<br />

说 明 : 这 些 语 句 往 往 是 程 序 实 现 某 一 特 定 功 能 的 关 键 , 对 于 维 护 人 员员 来 说 , 良 好好 的 注 释 帮<br />

助 更 好好 的 理 解 程 序 , 有 时 甚 至 优 于 看 设 计 文 档 ⃞<br />

¹2-15: 对 于 switch 语 句 下 的 case 语 句 , 如如 果 因 为 特 殊 情 况 需 要 处 理 完 一 个 case 后 进 入 下 一<br />

个 case 处 理 , 必 须 在 该 case 语 句 处 理 完 、 下 一 个 case 语 句 前前 加 上 明 确 的 注 释 ⃞<br />

说 明 : 这 样 比 较 清 楚 程 序 编 写 者 的 意 图 , 有 效 防 止 无 故 遗 漏 break 语 句 ⃞<br />

仅 供 内 部 使 用 12


软 件 编 程 规 范 总 则<br />

2 注 释<br />

示 例 ( 注 意 斜 体 加 粗 部 分 ):<br />

case CMD_UP:<br />

ProcessUp();<br />

break;<br />

case CMD_DOWN:<br />

ProcessDown();<br />

break;<br />

case CMD_FWD:<br />

ProcessFwd();<br />

if (...)<br />

{<br />

...<br />

break;<br />

}<br />

else<br />

{<br />

ProcessCFW_B();<br />

}<br />

// now jump into case CMD_A<br />

case CMD_A:<br />

ProcessA();<br />

break;<br />

case CMD_B:<br />

ProcessB();<br />

break;<br />

case CMD_C:<br />

ProcessC();<br />

break;<br />

case CMD_D:<br />

ProcessD();<br />

仅 供 内 部 使 用 13


软 件 编 程 规 范 总 则<br />

2 注 释<br />

break;<br />

...<br />

½2-1: 避 免 在 一 行 代 码 或 表 达 式 的 中 间 插 入 注 释 ⃞<br />

说 明 : 除 非 必 要 , 不 应 在 代 码 或 表 达 中 间 插 入 注 释 , 否 则 容 易 使 代 码 可 理 解 性 变 差 ⃞<br />

½2-2: 通 过 对 函 数 或 过 程 、 变 量 、 结 构 等 正 确 的 命命 名 以 及 合 理 地 组 织 代 码 的 结 构 , 使 代 码 成 为<br />

自 注 释 的 ⃞<br />

说 明 : 清 晰 准 确 的 函 数 、 变 量 等 的 命命 名 , 可 增 加 代 码 可 读 性 , 并 减 少 不 必 要 的 注 释 ⃞<br />

½2-3: 在 代 码 的 功 能 、 意 图 层 次 上 进 行 注 释 , 提 供 有 用 、 额 外 的 信 息 ⃞<br />

说 明 : 注 释 的 目 的 是 解 释 代 码 的 目 的 、 功 能 和和 采 用 的 方 法 , 提 供 代 码 以 外 的 信 息 , 帮 助 读<br />

者 理 解 代 码 , 防 止 没 必 要 的 重 复 注 释 信 息 ⃞<br />

示 例 : 如如 下 注 释 意 义 不 大 ⃞<br />

/* if receive_flag is TRUE */<br />

if (receive_flag)<br />

而 如如 下 的 注 释 则 给 出 了 额 外 有 用 的 信 息 ⃞<br />

/* if mtp receive a message from links */<br />

if (receive_flag)<br />

½2-4: 在 程 序 块 的 结 束 行 右 方 加 注 释 标 记 , 以 表 明 某 程 序 块 的 结 束 ⃞<br />

说 明 : 当 代 码 段 较 长 , 特 别 是 多 重 嵌 套套 时 , 这 样 做 可 以 使 代 码 更 清 晰 , 更 便 于 阅 读 ⃞<br />

示 例 : 参 见 如如 下 例 子 ⃞<br />

if (...)<br />

{<br />

// program code<br />

while (index < MAX_INDEX)<br />

{<br />

// program code<br />

} /* end of while (index < MAX_INDEX) */ // 指 明 该 条 while 语 句 结<br />

束<br />

} /* end of if (...)*/ // 指 明 是 哪哪 条 if 语 句 结 束<br />

仅 供 内 部 使 用 14


软 件 编 程 规 范 总 则<br />

2 注 释<br />

½2-5: 注 释 格 式 尽 量 统 一 , 建 议 使 用 ‚/* …“…“ */‛⃞<br />

½2-6: 注 释 应 考 虑 程 序 易 读 及 外 观 排 版 的 因 素 , 使 用 的 语 言 若 是 中 、 英 兼 有 的 , 建 议 多 使 用 中<br />

文 , 除 非 能 用 非 常 流 利 准 确 的 英 文 表 达 ⃞<br />

说 明 : 注 释 语 言 不 统 一 , 影 响响 程 序 易 读 性 和和 外 观 排 版 , 出 于 对 维 护 人 员员 的 考 虑 , 建 议 使 用<br />

中 文 ⃞<br />

仅 供 内 部 使 用 15


软 件 编 程 规 范 总 则<br />

3 标 志 符 命命 名<br />

3 标 识 符 命命 名<br />

¹3-1: 标 识 符 的 命命 名 要 清 晰 、 明 了 , 有 明 确 含 义 , 同 时 使 用 完 整 的 单 词 或 大 家 基 本 可 以 理 解 的<br />

缩 写 , 避 免 使 人 产 生 误 解 ⃞<br />

说 明 : 较 短 的 单 词 可 通 过 去 掉 ‚ 元 音 ‛ 形 成 缩 写 ; 较 长 的 单 词 可 取 单 词 的 头头 几 个 字 母 形 成<br />

缩 写 ; 一 些 单 词 有 大 家 公 认 的 缩 写 ⃞<br />

示 例 : 如如 下 单 词 的 缩 写 能 够 被 大 家 基 本 认 可 ⃞<br />

temp 可 缩 写 为 tmp ;<br />

flag 可 缩 写 为 flg ;<br />

statistic 可 缩 写 为 stat ;<br />

increment 可 缩 写 为 inc ;<br />

message 可 缩 写 为 msg ;<br />

¹3-2: 命命 名 中 若 使 用 特 殊 约 定 或 缩 写 , 则 要 有 注 释 说 明 ⃞<br />

说 明 : 应 该 在 源 文 件 的 开 始始 之 处 , 对 文 件 中 所 使 用 的 缩 写 或 约 定 , 特 别 是 特 殊 的 缩 写 , 进<br />

行 必 要 的 注 释 说 明 ⃞<br />

¹3-3: 自 己 特 有 的 命命 名 风 格 , 要 自 始始 至 终 保 持 一 致 , 不 可 来 回 变 化化 ⃞<br />

说 明 : 个 人 的 命命 名 风 格 , 在 符 合 所 在 项 目 组 或 产 品品 组 的 命命 名 规 则 的 前前 提 下 , 才 可 使 用 ⃞( 即<br />

命命 名 规 则 中 没 有 规 定 到到 的 地 方 才 可 有 个 人 命命 名 风 格 )⃞<br />

¹3-4: 对 于 变 量 命命 名 , 禁 止 取 单 个 字 符 ( 如如 i、j、k...),<br />

建 议 除 了 要 有 具 体 含 义 外 , 还 能<br />

表 明 其 变 量 类 型 、 数 据 类 型 等 , 但 i、j、k 作 局 部 循 环 变 量 是 允 许 的 ⃞<br />

说 明 : 变 量 , 尤 其 是 局 部 变 量 , 如如 果 用 单 个 字 符 表 示 , 很 容 易 敲 错 ( 如如 i 写 成 j), 而 编<br />

译 时 又 检 查 不 出 来 , 有 可 能 为 了 这 个 小 小 的 错 误 而 花 费 大 量 的 查 错 时 间 ⃞<br />

示 例 : 下 面 所 示 的 局 部 变 量 名 的 定 义 方 法 可 以 借 鉴 ⃞<br />

int liv_Width<br />

其 变 量 名 解 释 如如 下 :<br />

l 局 部 变 量 (Local) ( 其 它 :g 全 局 变 量 (Global)...)<br />

i<br />

数 据 类 型 (Interger)<br />

v 变 量 (Variable) ( 其 它 :c 常 量 (Const)...)<br />

Width 变 量 含 义<br />

仅 供 内 部 使 用 16


软 件 编 程 规 范 总 则<br />

3 标 志 符 命命 名<br />

这 样 可 以 防 止 局 部 变 量 与 全 局 变 量 重 名 ⃞<br />

¹3-5: 命命 名 规 范 必 须 与 所 使 用 的 系 统 风 格 保 持 一 致 , 并 在 同 一 项 目 中 统 一 , 比 如如 采 用 UNIX 的<br />

全 小 写 加 下 划 线 的 风 格 或 大 小 写 混 排 的 方 式 , 不 要 使 用 大 小 写 与 下 划 线 混 排 的 方 式 , 用 作 特 殊<br />

标 识 如如 标 识 成 员员 变 量 或 全 局 变 量 的 m_ 和和 g_, 其 后 加 上 大 小 写 混 排 的 方 式 是 允 许 的 ⃞<br />

示 例 : Add_User 不 允 许 ,add_user、AddUser、m_AddUser 允 许 ⃞<br />

½3-1: 除 非 必 要 , 不 要 用 数 字 或 较 奇奇 怪 的 字 符 来 定 义 标 识 符 ⃞<br />

示 例 : 如如 下 命命 名 , 使 人 产 生 疑 惑 ⃞<br />

#define _EXAMPLE_0_TEST_<br />

#define _EXAMPLE_1_TEST_<br />

void set_sls00( BYTE sls );<br />

应 改 为 有 意 义 的 单 词 命命 名<br />

#define _EXAMPLE_UNIT_TEST_<br />

#define _EXAMPLE_ASSERT_TEST_<br />

void set_udt_msg_sls( BYTE sls );<br />

½3-2: 在 同 一 软 件 产 品品 内 , 应 规 划 好好 接 口 部 分 标 识 符 ( 变 量 、 结 构 、 函 数 及 常 量 ) 的 命命 名 , 防<br />

止 编 译 、 链 接 时 产 生 冲 突 ⃞<br />

说 明 : 对 接 口 部 分 的 标 识 符 应 该 有 更 严 格 限 制制 , 防 止 冲 突 ⃞ 如如 可 规 定 接 口 部 分 的 变 量 与 常<br />

量 之 前前 加 上 ‚ 模 块 ‛ 标 识 等 ⃞<br />

½3-3: 用 正 确 的 反 义 词 组 命命 名 具 有 互 斥 意 义 的 变 量 或 相 反 动 作 的 函 数 等 ⃞<br />

说 明 : 下 面 是 一 些 在 软 件 中 常 用 的 反 义 词 组 ⃞<br />

add / remove begin / end create / destroy<br />

insert / delete first / last get / release<br />

increment / decrement<br />

put / get<br />

add / delete lock / unlock open / close<br />

min / max old / new start / stop<br />

next / previous source / target show / hide<br />

send / receive source / destination<br />

cut / paste up / down<br />

示 例 :<br />

int min_sum;<br />

仅 供 内 部 使 用 17


软 件 编 程 规 范 总 则<br />

3 标 志 符 命命 名<br />

int max_sum;<br />

int add_user( BYTE *user_name );<br />

int delete_user( BYTE *user_name );<br />

½3-4: 除 了 编 译 开 关 / 头头 文 件 等 特 殊 应 用 , 应 避 免 使 用 _EXAMPLE_TEST_ 之 类 以 下 划 线 开 始始 和和<br />

结 尾 的 定 义 ⃞<br />

仅 供 内 部 使 用 18


软 件 编 程 规 范 总 则<br />

4 可 读 性<br />

4 可 读 性<br />

¹4-1: 注 意 运 算 符 的 优 先 级 , 并 用 括 号 明 确 表 达 式 的 操 作 顺 序 , 避 免 使 用 默 认 优 先 级 ⃞<br />

说 明 : 防 止 阅 读 程 序 时 产 生 误 解 , 防 止 因 默 认 的 优 先 级 与 设 计 思 想 不 符 而 导 致 程 序 出 错 ⃞<br />

示 例 : 下 列 语 句 中 的 表 达 式<br />

word = (high


软 件 编 程 规 范 总 则<br />

4 可 读 性<br />

}<br />

... // program code<br />

½4-1: 源 程 序 中 关 系 较 为 紧 密 的 代 码 应 尽 可 能 相 邻 ⃞<br />

说 明 : 便 于 程 序 阅 读 和和 查 找 ⃞<br />

示 例 : 以 下 代 码 布 局 不 太 合 理 ⃞<br />

rect.length = 10;<br />

char_poi = str;<br />

rect.width = 5;<br />

若 按 如如 下 形 式 书 写 , 可 能 更 清 晰 一 些 ⃞<br />

rect.length = 10;<br />

rect.width = 5; // 矩 形 的 长 与 宽 关 系 较 密 切 , 放 在 一 起 ⃞<br />

char_poi = str;<br />

½4-2: 不 要 使 用 难 懂 的 技 巧 性 很 高 的 语 句 , 除 非 很 有 必 要 时 ⃞<br />

说 明 : 高 技 巧 语 句 不 等 于 高 效 率 的 程 序 , 实 际 上 程 序 的 效 率 关 键 在 于 算 法 ⃞<br />

示 例 : 如如 下 表 达 式 , 考 虑 不 周周 就 可 能 出 问 题 , 也 较 难 理 解 ⃞<br />

* stat_poi ++ += 1;<br />

* ++ stat_poi += 1;<br />

应 分 别 改 为 如如 下 ⃞<br />

*stat_poi += 1;<br />

stat_poi++; // 此 二 语 句 功 能 相 当 于 ‚ * stat_poi ++ += 1; ‛<br />

++ stat_poi;<br />

*stat_poi += 1; // 此 二 语 句 功 能 相 当 于 ‚ * ++ stat_poi += 1; ‛<br />

仅 供 内 部 使 用 20


软 件 编 程 规 范 总 则<br />

5 变 量 、 结 构<br />

5 变 量 、 结 构<br />

¹5-1: 去 掉 没 必 要 的 公 共 变 量 ⃞<br />

说 明 : 公 共 变 量 是 增 大 模 块 间 耦 合 的 原 因 之 一 , 故 应 减 少 没 必 要 的 公 共 变 量 以 降 低 模 块 间<br />

的 耦 合 度 ⃞<br />

¹5-2: 仔 细 定 义 并 明 确 公 共 变 量 的 含 义 、 作 用 、 取 值 范 围 及 公 共 变 量 间 的 关 系 ⃞<br />

说 明 : 在 对 变 量 声 明 的 同 时 , 应 对 其 含 义 、 作 用 及 取 值 范 围 进 行 注 释 说 明 , 同 时 若 有 必 要<br />

还 应 说 明 与 其 它 变 量 的 关 系 ⃞<br />

¹5-3: 明 确 公 共 变 量 与 操 作 此 公 共 变 量 的 函 数 或 过 程 的 关 系 , 如如 访 问 、 修 改 及 创 建 等 ⃞<br />

说 明 : 明 确 过 程 操 作 变 量 的 关 系 后 , 将 有 利 于 程 序 的 进 一 步 优 化化 、 单 元 测 试 、 系 统 联 调 以<br />

及 代 码 维 护 等 ⃞ 这 种 关 系 的 说 明 可 在 注 释 或 文 档 中 描 述 ⃞<br />

示 例 : 在 源 文 件 中 , 可 按 如如 下 注 释 形 式 说 明 ⃞<br />

RELATION System_Init Input_Rec Print_Rec Stat_Score<br />

Student Create Modify Access Access<br />

Score Create Modify Access Access, Modify<br />

注 :RELATION 为 操 作 关 系 ;System_Init、Input_Rec、Print_Rec、Stat_Score<br />

为 四 个 不 同 的 函 数 ;Student、Score 为 两 个 全 局 变 量 ;Create 表 示 创 建 ,Modify 表<br />

示 修 改 ,Access 表 示 访 问 ⃞<br />

其 中 , 函 数 Input_Rec、Stat_Score 都 可 修 改 变 量 Score, 故 此 变 量 将 引 起 函 数 间 较<br />

大 的 耦 合 , 并 可 能 增 加 代 码 测 试 、 维 护 的 难 度 ⃞<br />

¹5-4: 当 向 公 共 变 量 传 递 数 据 时 , 要 十 分 小 心 , 防 止 赋 与 不 合 理 的 值 或 越 界 等 现 象 发 生 ⃞<br />

说 明 : 对 公 共 变 量 赋 值 时 , 若 有 必 要 应 进 行 合 法 性 检 查 , 以 提 高 代 码 的 可 靠 性 、 稳 定 性 ⃞<br />

¹5-5: 防 止 局 部 变 量 与 公 共 变 量 同 名 ⃞<br />

说 明 : 若 使 用 了 较 好好 的 命命 名 规 则 , 那 么 此 问 题 可 自 动 消 除 ⃞<br />

¹5-6: 严 禁 使 用 未 经 初 始始 化化 的 变 量 作 为 右 值 ⃞<br />

说 明 : 特 别 是 在 C/C++ 中 引 用 未 经 赋 值 的 指 针 , 经 常 会 引 起 系 统 崩 溃 ⃞<br />

仅 供 内 部 使 用 21


软 件 编 程 规 范 总 则<br />

5 变 量 、 结 构<br />

½5-1: 构 造 仅 有 一 个 模 块 或 函 数 可 以 修 改 、 创 建 , 而 其 余 有 关 模 块 或 函 数 只 访 问 的 公 共 变 量 ,<br />

防 止 多 个 不 同 模 块 或 函 数 都 可 以 修 改 、 创 建 同 一 公 共 变 量 的 现 象 ⃞<br />

说 明 : 降 低 公 共 变 量 耦 合 度 ⃞<br />

½5-2: 使 用 严 格 形 式 定 义 的 、 可 移 植 的 数 据 类 型 , 尽 量 不 要 使 用 与 具 体 硬 件 或 软 件 环 境 关 系 密<br />

切 的 变 量 ⃞<br />

说 明 : 使 用 标 准 的 数 据 类 型 , 有 利 于 程 序 的 移 植 ⃞<br />

示 例 : 如如 下 例 子 ( 在 DOS 下 BC3.1 环 境 中 ), 在 移 植 时 可 能 产 生 问 题 ⃞<br />

void main()<br />

{<br />

register int index; // 寄 存 器 变 量<br />

}<br />

_AX = 0x4000; // _AX 是 BC3.1 提 供 的 寄 存 器 ‚ 伪 变 量 ‛<br />

... // program code<br />

½5-3: 结 构 的 功 能 要 单 一 , 是 针 对 一 种 事 务 的 抽 象 ⃞<br />

说 明 : 设 计 结 构 时 应 力力 争 使 结 构 代 表 一 种 现 实 事 务 的 抽 象 , 而 不 是 同 时 代 表 多 种 ⃞ 结 构 中<br />

的 各 元 素 应 代 表 同 一 事 务 的 不 同 侧 面 , 而 不 应 把 描 述 没 有 关 系 或 关 系 很 弱 的 不 同 事 务 的 元<br />

素 放 到到 同 一 结 构 中 ⃞<br />

示 例 : 如如 下 结 构 不 太 清 晰 、 合 理 ⃞<br />

typedef struct STUDENT_STRU<br />

{<br />

unsigned char name[8]; /* student's name */<br />

unsigned char age; /* student's age */<br />

unsigned char sex; /* student's sex, as follows */<br />

/* 0 - FEMALE; 1 - MALE */<br />

unsigned char<br />

teacher_name[8]; /* the student teacher's name */<br />

unisgned char<br />

teacher_sex; /* his teacher sex */<br />

} STUDENT;<br />

若 改 为 如如 下 , 可 能 更 合 理 些 ⃞<br />

仅 供 内 部 使 用 22


软 件 编 程 规 范 总 则<br />

5 变 量 、 结 构<br />

typedef struct TEACHER_STRU<br />

{<br />

unsigned char name[8]; /* teacher name */<br />

unisgned char sex; /* teacher sex, as follows */<br />

/* 0 - FEMALE; 1 - MALE */<br />

} TEACHER;<br />

typedef struct STUDENT_STRU<br />

{<br />

unsigned char name[8]; /* student's name */<br />

unsigned char age; /* student's age */<br />

unsigned char sex; /* student's sex, as follows */<br />

/* 0 - FEMALE; 1 - MALE */<br />

unsigned int teacher_ind; /* his teacher index */<br />

} STUDENT;<br />

½5-4: 不 要 设 计 面 面 俱 到到 、 非 常 灵 活 的 数 据 结 构 ⃞<br />

说 明 : 面 面 俱 到到 、 灵 活 的 数 据 结 构 反 而 容 易 引 起 误 解 和和 操 作 困 难 ⃞<br />

½5-5: 不 同 结 构 间 的 关 系 不 要 过 于 复 杂 ⃞<br />

说 明 : 若 两 个 结 构 间 关 系 较 复 杂 、 密 切 , 那 么 应 合 为 一 个 结 构 ⃞<br />

示 例 : 如如 下 两 个 结 构 的 构 造 不 合 理 ⃞<br />

typedef struct PERSON_ONE_STRU<br />

{<br />

unsigned char name[8];<br />

unsigned char addr[40];<br />

unsigned char sex;<br />

unsigned char city[15];<br />

} PERSON_ONE;<br />

typedef struct PERSON_TWO_STRU<br />

{<br />

unsigned char name[8];<br />

unsigned char age;<br />

unsigned char tel;<br />

} PERSON_TWO;<br />

仅 供 内 部 使 用 23


软 件 编 程 规 范 总 则<br />

5 变 量 、 结 构<br />

由 于 两 个 结 构 都 是 描 述 同 一 事 物 的 , 那 么 不 如如 合 成 一 个 结 构 ⃞<br />

typedef struct PERSON_STRU<br />

{<br />

unsigned char name[8];<br />

unsigned char age;<br />

unsigned char sex;<br />

unsigned char addr[40];<br />

unsigned char city[15];<br />

unsigned char tel;<br />

} PERSON;<br />

½5-6: 结 构 中 元 素 的 个 数 应 适 中 ⃞ 若 结 构 中 元 素 个 数 过 多 可 考 虑 依 据 某 种 原 则 把 元 素 组 成 不 同<br />

的 子 结 构 , 以 减 少 原 结 构 中 元 素 的 个 数 ⃞<br />

说 明 : 增 加 结 构 的 可 理 解 性 、 可 操 作 性 和和 可 维 护 性 ⃞<br />

示 例 : 假 如如 认 为 如如 上 的 _PERSON 结 构 元 素 过 多 , 那 么 可 如如 下 对 之 划 分 ⃞<br />

typedef struct PERSON_BASE_INFO_STRU<br />

{<br />

unsigned char name[8];<br />

unsigned char age;<br />

unsigned char sex;<br />

} PERSON_BASE_INFO;<br />

typedef struct PERSON_ADDRESS_STRU<br />

{<br />

unsigned char addr[40];<br />

unsigned char city[15];<br />

unsigned char tel;<br />

} PERSON_ADDRESS;<br />

typedef struct PERSON_STRU<br />

{<br />

PERSON_BASE_INFO person_base;<br />

PERSON_ADDRESS person_addr;<br />

} PERSON;<br />

仅 供 内 部 使 用 24


软 件 编 程 规 范 总 则<br />

5 变 量 、 结 构<br />

½5-7: 仔 细 设 计 结 构 中 元 素 的 布 局 与 排 列 顺 序 , 使 结 构 容 易 理 解 、 节 省 占 用 空 间 , 并 减 少 引 起<br />

误 用 现 象 ⃞<br />

说 明 : 合 理 排 列 结 构 中 元 素 顺 序 , 可 节 省 空 间 并 增 加 可 理 解 性 ⃞<br />

示 例 : 如如 下 结 构 中 的 位 域 排 列 , 将 占 较 大 空 间 , 可 读 性 也 稍 差 ⃞<br />

typedef struct EXAMPLE_STRU<br />

{<br />

unsigned int valid: 1;<br />

PERSON person;<br />

unsigned int set_flg: 1;<br />

} EXAMPLE;<br />

若 改 成 如如 下 形 式 , 不 仅 可 节 省 1 字 节 空 间 , 可 读 性 也 变 好好 了 ⃞<br />

typedef struct EXAMPLE_STRU<br />

{<br />

unsigned int valid: 1;<br />

unsigned int set_flg: 1;<br />

PERSON person ;<br />

} EXAMPLE;<br />

½5-8: 结 构 的 设 计 要 尽 量 考 虑 向 前前 兼 容 和和 以 后 的 版 本 升 级 , 并 为 某 些 未 来 可 能 的 应 用 保 留 余 地<br />

( 如如 预 留 一 些 空 间 等 )⃞<br />

说 明 : 软 件 向 前前 兼 容 的 特 性 , 是 软 件 产 品品 是 否 成 功 的 重 要 标 志 之 一 ⃞ 如如 果 要 想 使 产 品品 具 有<br />

较 好好 的 前前 向 兼 容 , 那 么 在 产 品品 设 计 之 初 就 应 为 以 后 版 本 升 级 保 留 一 定 余 地 , 并 且 在 产 品品 升<br />

级 时 必 须 考 虑 前前 一 版 本 的 各 种 特 性 ⃞<br />

½5-9: 留 心 具 体 语 言 及 编 译 器 处 理 不 同 数 据 类 型 的 原 则 及 有 关 细 节 ⃞<br />

说 明 : 如如 在 C 语 言 中 ,static 局 部 变 量 将 在 内 存 ‚ 数 据 区 ‛ 中 生 成 , 而 非 static 局 部<br />

变 量 将 在 ‚ 堆 栈 ‛ 中 生 成 ⃞ 这 些 细 节 对 程 序 质 量 的 保 证 非 常 重 要 ⃞<br />

½5-10: 编 程 时 , 要 注 意 数 据 类 型 的 强 制制 转 换 ⃞<br />

说 明 : 当 进 行 数 据 类 型 强 制制 转 换 时 , 其 数 据 的 意 义 、 转 换 后 的 取 值 等 都 有 可 能 发 生 变 化化 ,<br />

而 这 些 细 节 若 考 虑 不 周周 , 就 很 有 可 能 留 下 隐 患 ⃞<br />

½5-11: 对 编 译 系 统 默 认 的 数 据 类 型 转 换 , 也 要 有 充 分 的 认 识 ⃞<br />

示 例 : 如如 下 赋 值 , 多 数 编 译 器 不 产 生 告告 警 , 但 值 的 含 义 还 是 稍 有 变 化化 ⃞<br />

仅 供 内 部 使 用 25


软 件 编 程 规 范 总 则<br />

5 变 量 、 结 构<br />

char chr;<br />

unsigned short int exam;<br />

chr = -1;<br />

exam = chr; // 编 译 器 不 产 生 告告 警 , 此 时 exam 为 0xFFFF⃞<br />

½5-12: 尽 量 减 少 没 有 必 要 的 数 据 类 型 默 认 转 换 与 强 制制 转 换 ⃞<br />

½5-13: 合 理 地 设 计 数 据 并 使 用 自 定 义 数 据 类 型 , 避 免 数 据 间 进 行 不 必 要 的 类 型 转 换 ⃞<br />

½5-14: 对 自 定 义 数 据 类 型 进 行 恰 当 命命 名 , 使 它 成 为 自 描 述 性 的 , 以 提 高 代 码 可 读 性 ⃞ 注 意 其<br />

命命 名 方 式 在 同 一 产 品品 中 的 统 一 ⃞<br />

说 明 : 使 用 自 定 义 类 型 , 可 以 弥 补 编 程 语 言 提 供 类 型 少 、 信 息 量 不 足 的 缺 点 , 并 能 使 程 序<br />

清 晰 、 简 洁 ⃞<br />

示 例 : 可 参 考 如如 下 方 式 声 明 自 定 义 数 据 类 型 ⃞<br />

下 面 的 声 明 可 使 数 据 类 型 的 使 用 简 洁 、 明 了 ⃞<br />

typedef unsigned char BYTE;<br />

typedef unsigned short WORD;<br />

typedef unsigned int DWORD;<br />

下 面 的 声 明 可 使 数 据 类 型 具 有 更 丰 富 的 含 义 ⃞<br />

typedef float DISTANCE;<br />

typedef float SCORE;<br />

½5-15: 当 声 明 用 于 分 布 式 环 境 或 不 同 CPU 间 通 信 环 境 的 数 据 结 构 时 , 必 须 考 虑 机 器 的 字 节 顺<br />

序 、 使 用 的 位 域 及 字 节 对 齐 等 问 题 ⃞<br />

说 明 : 比 如如 Intel CPU 与 68360 CPU, 在 处 理 位 域 及 整 数 时 , 其 在 内 存 存 放 的 ‚ 顺 序 ‛<br />

正 好好 相 反 ⃞<br />

示 例 : 假 如如 有 如如 下 短 整 数 及 结 构 ⃞<br />

unsigned short int exam;<br />

typedef struct EXAM_BIT_STRU<br />

{ /* Intel 68360 */<br />

unsigned int A1: 1; /* bit 0 7 */<br />

unsigned int A2: 1; /* bit 1 6 */<br />

仅 供 内 部 使 用 26


软 件 编 程 规 范 总 则<br />

5 变 量 、 结 构<br />

unsigned int A3: 1; /* bit 2 5 */<br />

} EXAM_BIT;<br />

如如 下 是 Intel CPU 生 成 短 整 数 及 位 域 的 方 式 ⃞<br />

内 存 : 0 1 2 ... ( 从 低 到到 高 , 以 字 节 为 单 位 )<br />

exam exam 低 字 节 exam 高 字 节<br />

内 存 : 0 bit 1 bit 2 bit ... ( 字 节 的 各 ‚ 位 ‛)<br />

EXAM_BIT A1 A2 A3<br />

如如 下 是 68360 CPU 生 成 短 整 数 及 位 域 的 方 式 ⃞<br />

内 存 : 0 1 2 ... ( 从 低 到到 高 , 以 字 节 为 单 位 )<br />

exam exam 高 字 节 exam 低 字 节<br />

内 存 : 7 bit 6 bit 5 bit ... ( 字 节 的 各 ‚ 位 ‛)<br />

EXAM_BIT A1 A2 A3<br />

说 明 : 在 对 齐 方 式 下 ,CPU 的 运 行 效 率 要 快 得 多 ⃞<br />

示 例 : 如如 下 图 , 当 一 个 long 型 数 ( 如如 图 中 long1) 在 内 存 中 的 位 置 正 好好 与 内 存 的 字 边 界<br />

对 齐 时 ,CPU 存 取 这 个 数 只 需 访 问 一 次 内 存 , 而 当 一 个 long 型 数 ( 如如 图 中 的 long2) 在<br />

内 存 中 的 位 置 跨 越 了 字 边 界 时 ,CPU 存 取 这 个 数 就 需 要 多 次 访 问 内 存 , 如如 i960cx 访 问 这<br />

样 的 数 需 读 内 存 三 次 ( 一 个 BYTE、 一 个 SHORT、 一 个 BYTE, 由 CPU 的 微 代 码 执 行 , 对<br />

软 件 透 明 ), 所 有 对 齐 方 式 下 CPU 的 运 行 效 率 明 显 快 多 了 ⃞<br />

1 8 16 24 32<br />

------- ------- ------- -------<br />

| long1 | long1 | long1 | long1 |<br />

------- ------- ------- -------<br />

| | | | long2 |<br />

------- ------- ------- --------<br />

| long2 | long2 | long2 | |<br />

------- ------- ------- --------<br />

| ....<br />

仅 供 内 部 使 用 27


软 件 编 程 规 范 总 则<br />

6 函 数 、 过 程<br />

6 函 数 、 过 程<br />

¹6-1: 对 所 调 用 函 数 的 错 误 返 回 码 要 仔 细 、 全 面 地 处 理 ⃞<br />

¹6-2: 明 确 函 数 功 能 , 精 确 ( 而 不 是 近 似 ) 地 实 现 函 数 设 计 ⃞<br />

¹6-3: 编 写 可 重 入 函 数 时 , 应 注 意 局 部 变 量 的 使 用 ( 如如 编 写 C/C++ 语 言 的 可 重 入 函 数 时 , 应 使<br />

用 auto 即 缺 省 态 局 部 变 量 或 寄 存 器 变 量 )⃞<br />

说 明 : 编 写 C/C++ 语 言 的 可 重 入 函 数 时 , 不 应 使 用 static 局 部 变 量 , 否 则 必 须 经 过 特 殊<br />

处 理 , 才 能 使 函 数 具 有 可 重 入 性 ⃞<br />

¹6-4: 编 写 可 重 入 函 数 时 , 若 使 用 全 局 变 量 , 则 应 通 过 关 中 断 、 信 号 量 ( 即 P、V 操 作 ) 等 手 段<br />

对 其 加 以 保 护 ⃞<br />

说 明 : 若 对 所 使 用 的 全 局 变 量 不 加 以 保 护 , 则 此 函 数 就 不 具 有 可 重 入 性 , 即 当 多 个 进 程 调<br />

用 此 函 数 时 , 很 有 可 能 使 有 关 全 局 变 量 变 为 不 可 知 状 态 ⃞<br />

示 例 : 假 设 Exam 是 int 型 全 局 变 量 , 函 数 Squre_Exam 返 回 Exam 平 方 值 ⃞ 那 么 如如 下<br />

函 数 不 具 有 可 重 入 性 ⃞<br />

unsigned int example( int para )<br />

{<br />

unsigned int temp;<br />

Exam = para; // (**)<br />

temp = Square_Exam( );<br />

}<br />

return temp;<br />

此 函 数 若 被 多 个 进 程 调 用 的 话 , 其 结 果 可 能 是 未 知 的 , 因 为 当 (**) 语 句 刚 执 行 完 后 , 另<br />

外 一 个 使 用 本 函 数 的 进 程 可 能 正 好好 被 激 活 , 那 么 当 新 激 活 的 进 程 执 行 到到 此 函 数 时 , 将 使<br />

Exam 赋 与 另 一 个 不 同 的 para 值 , 所 以 当 控 制制 重 新 回 到到 ‚temp = Square_Exam( )‛<br />

后 , 计 算 出 的 temp 很 可 能 不 是 预 想 中 的 结 果 ⃞ 此 函 数 应 如如 下 改 进 ⃞<br />

unsigned int example( int para )<br />

{<br />

unsigned int temp;<br />

仅 供 内 部 使 用 28


软 件 编 程 规 范 总 则<br />

6 函 数 、 过 程<br />

[ 申 请 信 号 量 操 作 ] // 若 申 请 不 到到 ‚ 信 号 量 ‛, 说 明 另 外 的 进 程 正 处 于<br />

Exam = para;<br />

// 给 Exam 赋 值 并 计 算 其 平 方 过 程 中 ( 即 正 在 使 用 此<br />

temp = Square_Exam( ); // 信 号 ), 本 进 程 必 须 等 待 其 释 放 信 号 后 , 才 可 继<br />

[ 释 放 信 号 量 操 作 ] // 续 执 行 ⃞ 若 申 请 到到 信 号 , 则 可 继 续 执 行 , 但 其<br />

// 它 进 程 必 须 等 待 本 进 程 释 放 信 号 量 后 , 才 能 再 使<br />

}<br />

return temp;<br />

// 用 本 信 号 ⃞<br />

¹6-5: 在 同 一 项 目 组 应 明 确 规 定 对 接 口 函 数 参 数 的 合 法 性 检 查 应 由 函 数 的 调 用 者 负 责 还 是 由 接<br />

口 函 数 本 身 负 责 , 缺 省 是 由 函 数 调 用 者 负 责 ⃞<br />

说 明 : 对 于 模 块 间 接 口 函 数 的 参 数 的 合 法 性 检 查 这 一 问 题 , 往 往 有 两 个 极 端 现 象 , 即 : 要<br />

么 是 调 用 者 和和 被 调 用 者 对 参 数 均 不 作 合 法 性 检 查 , 结 果 就 遗 漏 了 合 法 性 检 查 这 一 必 要 的 处<br />

理 过 程 , 造 成 问 题 隐 患 ; 要 么 就 是 调 用 者 和和 被 调 用 者 均 对 参 数 进 行 合 法 性 检 查 , 这 种 情 况<br />

虽 不 会 造 成 问 题 , 但 产 生 了 冗 余 代 码 , 降 低 了 效 率 ⃞<br />

½6-1: 防 止 将 函 数 的 参 数 作 为 工 作 变 量 ⃞<br />

说 明 : 将 函 数 的 参 数 作 为 工 作 变 量 , 有 可 能 错 误 地 改 变 参 数 内 容 , 所 以 很 危 险 ⃞ 对 必 须 改<br />

变 的 参 数 , 最 好好 先 用 局 部 变 量 代 之 , 最 后 再 将 该 局 部 变 量 的 内 容 赋 给 该 参 数 ⃞<br />

示 例 : 下 函 数 的 实 现 不 太 好好 ⃞<br />

void sum_data( unsigned int num, int *data, int *sum )<br />

{<br />

unsigned int count;<br />

}<br />

*sum = 0;<br />

for (count = 0; count < num; count++)<br />

{<br />

*sum += data[count]; // sum 成 了 工 作 变 量 , 不 太 好好 ⃞<br />

}<br />

若 改 为 如如 下 , 则 更 好好 些 ⃞<br />

void sum_data( unsigned int num, int *data, int *sum )<br />

仅 供 内 部 使 用 29


软 件 编 程 规 范 总 则<br />

6 函 数 、 过 程<br />

{<br />

unsigned int count ;<br />

int sum_temp;<br />

sum_temp = 0;<br />

for (count = 0; count < num; count ++)<br />

{<br />

sum_temp += data[count];<br />

}<br />

}<br />

*sum = sum_temp;<br />

½6-2: 函 数 的 规 模 尽 量 限 制制 在 200 行 以 内 ⃞<br />

说 明 : 不 包包 括 注 释 和和 空 格 行 ⃞<br />

½6-3: 一 个 函 数 仅 完 成 一 件 功 能 ⃞<br />

½6-4: 为 简 单 功 能 编 写 函 数 ⃞<br />

说 明 : 虽 然 为 仅 用 一 两 行 就 可 完 成 的 功 能 去 编 函 数 好好 象 没 有 必 要 , 但 用 函 数 可 使 功 能 明 确<br />

化化 , 增 加 程 序 可 读 性 , 亦 可 方 便 维 护 、 测 试 ⃞<br />

示 例 : 如如 下 语 句 的 功 能 不 很 明 显 ⃞<br />

value = ( a > b ) a : b ;<br />

改 为 如如 下 就 很 清 晰 了 ⃞<br />

int max (int a, int b)<br />

{<br />

return ((a > b) a : b);<br />

}<br />

value = max (a, b);<br />

或 改 为 如如 下 ⃞<br />

#define MAX (a, b) (((a) > (b)) (a) : (b))<br />

value = MAX (a, b);<br />

仅 供 内 部 使 用 30


软 件 编 程 规 范 总 则<br />

6 函 数 、 过 程<br />

½6-5: 不 要 设 计 多 用 途 面 面 俱 到到 的 函 数 ⃞<br />

说 明 : 多 功 能 集 于 一 身 的 函 数 , 很 可 能 使 函 数 的 理 解 、 测 试 、 维 护 等 变 得 困 难 ⃞<br />

½6-6: 函 数 的 功 能 应 该 是 可 以 预 测 的 , 也 就 是 只 要 输 入 数 据 相 同 就 应 产 生 同 样 的 输 出 ⃞<br />

说 明 : 带 有 内 部 ‚ 存 储 器 ‛ 的 函 数 的 功 能 可 能 是 不 可 预 测 的 , 因 为 它 的 输 出 可 能 取 决 于 内<br />

部 存 储 器 ( 如如 某 标 记 ) 的 状 态 ⃞ 这 样 的 函 数 既 不 易 于 理 解 又 不 利 于 测 试 和和 维 护 ⃞ 在 C/C++<br />

语 言 中 , 函 数 的 static 局 部 变 量 是 函 数 的 内 部 存 储 器 , 有 可 能 使 函 数 的 功 能 不 可 预 测 ,<br />

然 而 , 当 某 函 数 的 返 回 值 为 指 针 类 型 时 , 则 必 须 是 STATIC 的 局 部 变 量 的 地 址 作 为 返 回 值 ,<br />

若 为 AUTO 类 , 则 返 回 为 错 针 ⃞<br />

示 例 : 如如 下 函 数 , 其 返 回 值 ( 即 功 能 ) 是 不 可 预 测 的 ⃞<br />

unsigned int integer_sum( unsigned int base )<br />

{<br />

unsigned int index;<br />

static unsigned int sum = 0; // 注 意 , 是 static 类 型 的 ⃞<br />

// 若 改 为 auto 类 型 , 则 函 数 即 变 为 可 预 测 ⃞<br />

for (index = 1; index


软 件 编 程 规 范 总 则<br />

6 函 数 、 过 程<br />

endp<br />

proc Input_Msg // 过 程 ( 函 数 )Input_Msg<br />

... // 程 序 代 码<br />

LABEL:<br />

... // 程 序 代 码<br />

endp<br />

½6-8: 避 免 设 计 多 参 数 函 数 , 不 使 用 的 参 数 从 接 口 中 去 掉 ⃞<br />

说 明 : 目 的 减 少 函 数 间 接 口 的 复 杂 度 ⃞<br />

½6-9: 非 调 度 函 数 应 减 少 或 防 止 控 制制 参 数 , 尽 量 只 使 用 数 据 参 数 ⃞<br />

说 明 : 本 建 议 目 的 是 防 止 函 数 间 的 控 制制 耦 合 ⃞ 调 度 函 数 是 指 根 据 输 入 的 消 息 类 型 或 控 制制 命命<br />

令 , 来 启启 动 相 应 的 功 能 实 体 ( 即 函 数 或 过 程 ), 而 本 身 并 不 完 成 具 体 功 能 ⃞ 控 制制 参 数 是 指<br />

改 变 函 数 功 能 行 为 的 参 数 , 即 函 数 要 根 据 此 参 数 来 决 定 具 体 怎 样 工 作 ⃞ 非 调 度 函 数 的 控 制制<br />

参 数 增 加 了 函 数 间 的 控 制制 耦 合 , 很 可 能 使 函 数 间 的 耦 合 度 增 大 , 并 使 函 数 的 功 能 不 唯 一 ⃞<br />

示 例 : 如如 下 函 数 构 造 不 太 合 理 ⃞<br />

int add_sub( int a, int b, unsigned char add_sub_flg )<br />

{<br />

if (add_sub_flg == INTEGER_ADD)<br />

{<br />

return (a + b);<br />

}<br />

else<br />

{<br />

return (a b);<br />

}<br />

}<br />

不 如如 分 为 如如 下 两 个 函 数 清 晰 ⃞<br />

int add( int a, int b )<br />

{<br />

return (a + b);<br />

}<br />

仅 供 内 部 使 用 32


软 件 编 程 规 范 总 则<br />

6 函 数 、 过 程<br />

int sub( int a, int b )<br />

{<br />

return (a b);<br />

}<br />

½6-10: 检 查 函 数 所 有 参 数 输 入 的 有 效 性 ⃞<br />

½6-11: 检 查 函 数 所 有 非 参 数 输 入 的 有 效 性 , 如如 数 据 文 件 、 公 共 变 量 等 ⃞<br />

说 明 : 函 数 的 输 入 主 要 有 两 种 : 一 种 是 参 数 输 入 ; 另 一 种 是 全 局 变 量 、 数 据 文 件 的 输 入 ,<br />

即 非 参 数 输 入 ⃞ 函 数 在 使 用 输 入 之 前前 , 应 进 行 必 要 的 检 查 ⃞<br />

½6-12: 函 数 名 应 准 确 描 述 函 数 的 功 能 ⃞<br />

½6-13: 使 用 动 宾 词 组 为 执 行 某 操 作 的 函 数 命命 名 ⃞ 如如 果 是 OOP 方 法 , 可 以 只 有 动 词 ( 名 词 是 对<br />

象 本 身 )⃞<br />

示 例 : 参 照 如如 下 方 式 命命 名 函 数 ⃞<br />

void print_record( unsigned int rec_ind ) ;<br />

int input_record( void ) ;<br />

unsigned char get_current_color( void ) ;<br />

建 议 6-14: 避 免 使 用 无 意 义 或 含 义 不 清 的 动 词 为 函 数 命命 名 ⃞<br />

说 明 : 避 免 用 含 义 不 清 的 动 词 如如 process、handle 等 为 函 数 命命 名 , 因 为 这 些 动 词 并 没 有<br />

说 明 要 具 体 做 什 么 ⃞<br />

建 议 6-15: 函 数 的 返 回 值 要 清 楚 、 明 了 , 让 使 用 者 不 容 易 忽 视 错 误 情 况 ⃞<br />

说 明 : 函 数 的 每 种 出 错 返 回 值 的 意 义 要 清 晰 、 明 了 、 准 确 , 防 止 使 用 者 误 用 、 理 解 错 误 或<br />

忽 视 错 误 返 回 码 ⃞<br />

½6-16: 除 非 必 要 , 最 好好 不 要 把 与 函 数 返 回 值 类 型 不 同 的 变 量 , 以 编 译 系 统 默 认 的 转 换 方 式 或<br />

强 制制 的 转 换 方 式 作 为 返 回 值 返 回 ⃞<br />

½6-17: 让 函 数 在 调 用 点 显 得 易 懂 、 容 易 理 解 ⃞<br />

½6-18: 在 调 用 函 数 填 写 参 数 时 , 应 尽 量 减 少 没 有 必 要 的 默 认 数 据 类 型 转 换 或 强 制制 数 据 类 型 转<br />

换 ⃞<br />

说 明 : 因 为 数 据 类 型 转 换 或 多 或 少 存 在 危 险 ⃞<br />

仅 供 内 部 使 用 33


软 件 编 程 规 范 总 则<br />

6 函 数 、 过 程<br />

½6-19: 避 免 函 数 中 不 必 要 语 句 , 防 止 程 序 中 的 垃 圾 代 码 ⃞<br />

说 明 : 程 序 中 的 垃 圾 代 码 不 仅 占 用 额 外 的 空 间 , 而 且 还 常 常 影 响响 程 序 的 功 能 与 性 能 , 很 可<br />

能 给 程 序 的 测 试 、 维 护 等 造 成 不 必 要 的 麻 烦 ⃞<br />

½6-20: 防 止 把 没 有 关 联 的 语 句 放 到到 一 个 函 数 中 ⃞<br />

说 明 : 防 止 函 数 或 过 程 内 出 现 随 机 内 聚 ⃞ 随 机 内 聚 是 指 将 没 有 关 联 或 关 联 很 弱 的 语 句 放 到到<br />

同 一 个 函 数 或 过 程 中 ⃞ 随 机 内 聚 给 函 数 或 过 程 的 维 护 、 测 试 及 以 后 的 升 级 等 造 成 了 不 便 ,<br />

同 时 也 使 函 数 或 过 程 的 功 能 不 明 确 ⃞ 使 用 随 机 内 聚 函 数 , 常 常 容 易 出 现 在 一 种 应 用 场 合 需<br />

要 改 进 此 函 数 , 而 另 一 种 应 用 场 合 又 不 允 许 这 种 改 进 , 从 而 陷 入 困 境 ⃞<br />

在 编 程 时 , 经 常 遇 到到 在 不 同 函 数 中 使 用 相 同 的 代 码 , 许 多 开 发 人 员员 都 愿 把 这 些 代 码 提 出 来 ,<br />

并 构 成 一 个 新 函 数 ⃞ 若 这 些 代 码 关 联 较 大 并 且 是 完 成 一 个 功 能 的 , 那 么 这 种 构 造 是 合 理 的 ,<br />

否 则 这 种 构 造 将 产 生 随 机 内 聚 的 函 数 ⃞<br />

示 例 : 如如 下 函 数 就 是 一 种 随 机 内 聚 ⃞<br />

void Init_Var( void )<br />

{<br />

Rect.length = 0;<br />

Rect.width = 0; /* 初 始始 化化 矩 形 的 长 与 宽 */<br />

Point.x = 10;<br />

}<br />

Point.y = 10; /* 初 始始 化化 ‚ 点 ‛ 的 坐 标 */<br />

矩 形 的 长 、 宽 与 点 的 坐 标 基 本 没 有 任 何 关 系 , 故 以 上 函 数 是 随 机 内 聚 ⃞<br />

应 如如 下 分 为 两 个 函 数 :<br />

void Init_Rect( void )<br />

{<br />

Rect.length = 0;<br />

Rect.width = 0; /* 初 始始 化化 矩 形 的 长 与 宽 */<br />

}<br />

void Init_Point( void )<br />

{<br />

Point.x = 10;<br />

Point.y = 10; /* 初 始始 化化 ‚ 点 ‛ 的 坐 标 */<br />

仅 供 内 部 使 用 34


软 件 编 程 规 范 总 则<br />

6 函 数 、 过 程<br />

}<br />

½6-21: 如如 果 多 段 代 码 重 复 做 同 一 件 事 情 , 那 么 在 函 数 的 划 分 上 可 能 存 在 问 题 ⃞<br />

说 明 : 若 此 段 代 码 各 语 句 之 间 有 实 质 性 关 联 并 且 是 完 成 同 一 件 功 能 的 , 那 么 可 考 虑 把 此 段<br />

代 码 构 造 成 一 个 新 的 函 数 ⃞<br />

½6-22: 功 能 不 明 确 较 小 的 函 数 , 特 别 是 仅 有 一 个 上 级 函 数 调 用 它 时 , 应 考 虑 把 它 合 并 到到 上 级<br />

函 数 中 , 而 不 必 单 独 存 在 ⃞<br />

说 明 : 模 块 中 函 数 划 分 的 过 多 , 一 般 会 使 函 数 间 的 接 口 变 得 复 杂 ⃞ 所 以 过 小 的 函 数 , 特 别<br />

是 扇 入 很 低 的 或 功 能 不 明 确 的 函 数 , 不 值 得 单 独 存 在 ⃞<br />

½6-23: 设 计 高 扇 入 、 合 理 扇 出 ( 小 于 7) 的 函 数 ⃞<br />

说 明 : 扇 出 是 指 一 个 函 数 直 接 调 用 ( 控 制制 ) 其 它 函 数 的 数 目 , 而 扇 入 是 指 有 多 少 上 级 函 数<br />

调 用 它 ⃞<br />

扇 出 过 大 , 表 明 函 数 过 分 复 杂 , 需 要 控 制制 和和 协 调 过 多 的 下 级 函 数 ; 而 扇 出 过 小 , 如如 总 是 1,<br />

表 明 函 数 的 调 用 层 次 可 能 过 多 , 这 样 不 利 程 序 阅 读 和和 函 数 结 构 的 分 析 , 并 且 程 序 运 行 时 会<br />

对 系 统 资 源 如如 堆 栈 空 间 等 造 成 压 力力 ⃞ 函 数 较 合 理 的 扇 出 ( 调 度 函 数 除 外 ) 通 常 是 3-5⃞ 扇<br />

出 太 大 , 一 般 是 由 于 缺 乏 中 间 层 次 , 可 适 当 增 加 中 间 层 次 的 函 数 ⃞ 扇 出 太 小 , 可 把 下 级 函<br />

数 进 一 步 分 解 多 个 函 数 , 或 合 并 到到 上 级 函 数 中 ⃞ 当 然 分 解 或 合 并 函 数 时 , 不 能 改 变 要 实 现<br />

的 功 能 , 也 不 能 违 背 函 数 间 的 独 立 性 ⃞<br />

扇 入 越 大 , 表 明 使 用 此 函 数 的 上 级 函 数 越 多 , 这 样 的 函 数 使 用 效 率 高 , 但 不 能 违 背 函 数 间<br />

的 独 立 性 而 单 纯 地 追 求 高 扇 入 ⃞ 公 共 模 块 中 的 函 数 及 底 层 函 数 应 该 有 较 高 的 扇 入 ⃞<br />

较 良 好好 的 软 件 结 构 通 常 是 顶 层 函 数 的 扇 出 较 高 , 中 层 函 数 的 扇 出 较 少 , 而 底 层 函 数 则 扇 入<br />

到到 公 共 模 块 中 ⃞<br />

½6-24: 减 少 函 数 本 身 或 函 数 间 的 递 归 调 用 ⃞<br />

说 明 : 递 归 调 用 特 别 是 函 数 间 的 递 归 调 用 ( 如如 A->B->C->A), 影 响响 程 序 的 可 理 解 性 ; 递<br />

归 调 用 一 般 都 占 用 较 多 的 系 统 资 源 ( 如如 栈 空 间 ); 递 归 调 用 对 程 序 的 测 试 有 一 定 影 响响 ⃞ 故<br />

除 非 为 某 些 算 法 或 功 能 的 实 现 方 便 , 应 减 少 没 必 要 的 递 归 调 用 ⃞<br />

½6-25: 仔 细 分 析 模 块 的 功 能 及 性 能 需 求 , 并 进 一 步 细 分 , 同 时 若 有 必 要 画 出 有 关 数 据 流 图 ,<br />

据 此 来 进 行 模 块 的 函 数 划 分 与 组 织 ⃞<br />

说 明 : 函 数 的 划 分 与 组 织 是 模 块 的 实 现 过 程 中 很 关 键 的 步 骤 , 如如 何 划 分 出 合 理 的 函 数 结 构 ,<br />

关 系 到到 模 块 的 最 终 效 率 和和 可 维 护 性 、 可 测 性 等 ⃞ 根 据 模 块 的 功 能 图 或 / 及 数 据 流 图 映 射 出<br />

仅 供 内 部 使 用 35


软 件 编 程 规 范 总 则<br />

6 函 数 、 过 程<br />

函 数 结 构 是 常 用 方 法 之 一 ⃞<br />

½6-26: 改 进 模 块 中 函 数 的 结 构 , 降 低 函 数 间 的 耦 合 度 , 并 提 高 函 数 的 独 立 性 以 及 代 码 可 读 性 、<br />

效 率 和和 可 维 护 性 ⃞ 优 化化 函 数 结 构 时 , 要 遵 守 以 下 原 则 :<br />

(1) 不 能 影 响响 模 块 功 能 的 实 现 ⃞<br />

(2) 仔 细 考 查 模 块 或 函 数 出 错 处 理 及 模 块 的 性 能 要 求 并 进 行 完 善 ⃞<br />

(3) 通 过 分 解 或 合 并 函 数 来 改 进 软 件 结 构 ⃞<br />

(4) 考 查 函 数 的 规 模 , 过 大 的 要 进 行 分 解 ⃞<br />

(5) 降 低 函 数 间 接 口 的 复 杂 度 ⃞<br />

(6) 不 同 层 次 的 函 数 调 用 要 有 较 合 理 的 扇 入 、 扇 出 ⃞<br />

(7) 函 数 功 能 应 可 预 测 ⃞<br />

(8) 提 高 函 数 内 聚 ⃞( 单 一 功 能 的 函 数 内 聚 最 高 )<br />

说 明 : 对 初 步 划 分 后 的 函 数 结 构 应 进 行 改 进 、 优 化化 , 使 之 更 为 合 理 ⃞<br />

½6-27: 在 多 任 务 操 作 系 统 的 环 境 下 编 程 , 要 注 意 函 数 可 重 入 性 的 构 造 ⃞<br />

说 明 : 可 重 入 性 是 指 函 数 可 以 被 多 个 任 务 进 程 调 用 ⃞ 在 多 任 务 操 作 系 统 中 , 函 数 是 否 具 有<br />

可 重 入 性 是 非 常 重 要 的 , 因 为 这 是 多 个 进 程 可 以 共 用 此 函 数 的 必 要 条 件 ⃞ 另 外 , 编 译 器 是<br />

否 提 供 可 重 入 函 数 库 , 与 它 所 服 务 的 操 作 系 统 有 关 , 只 有 操 作 系 统 是 多 任 务 时 , 编 译 器 才<br />

有 可 能 提 供 可 重 入 函 数 库 ⃞ 如如 DOS 下 BC 和和 MSC 等 就 不 具 备 可 重 入 函 数 库 , 因 为 DOS 是<br />

单 用 户 单 任 务 操 作 系 统 ⃞<br />

½6-28: 避 免 使 用 BOOL 参 数 ⃞<br />

说 明 : 原 因 有 二 , 其 一 是 BOOL 参 数 值 无 意 义 ,TURE/FALSE 的 含 义 是 非 常 模 糊 的 , 在 调<br />

用 时 很 难 知 道 该 参 数 到到 底 传 达 的 是 什 么 意 思 ; 其 二 是 BOOL 参 数 值 不 利 于 扩 充 ⃞ 还 有 NULL<br />

也 是 一 个 无 意 义 的 单 词 ⃞<br />

½6-29: 对 于 提 供 了 返 回 值 的 函 数 , 在 引 用 时 最 好好 使 用 其 返 回 值 ⃞<br />

½6-30: 当 一 个 过 程 ( 函 数 ) 中 对 较 长 变 量 ( 一 般 是 结 构 的 成 员员 ) 有 较 多 引 用 时 , 可 以 用 一 个<br />

意 义 相 当 的 宏 代 替 ⃞<br />

说 明 : 这 样 可 以 增 加 编 程 效 率 和和 程 序 的 可 读 性 ⃞<br />

示 例 : 在 某 过 程 中 较 多 引 用 TheReceiveBuffer[FirstSocket].byDataPtr,<br />

则 可 以 通 过 以 下 宏 定 义 来 代 替 :<br />

# define pSOCKDATA TheReceiveBuffer[FirstScoket].byDataPtr<br />

仅 供 内 部 使 用 36


软 件 编 程 规 范 总 则<br />

7 可 测 性<br />

7 可 测 性<br />

¹7-1: 在 同 一 项 目 组 或 产 品品 组 内 , 要 有 一 套套 统 一 的 为 集 成 测 试 与 系 统 联 调 准 备 的 调 测 开 关 及 相<br />

应 打 印 函 数 , 并 且 要 有 详 细 的 说 明 ⃞<br />

说 明 : 本 规 则 是 针 对 项 目 组 或 产 品品 组 的 ⃞<br />

¹7-2: 在 同 一 项 目 组 或 产 品品 组 内 , 调 测 打 印 出 的 信 息 串 的 格 式 要 有 统 一 的 形 式 ⃞ 信 息 串 中 至 少<br />

要 有 所 在 模 块 名 ( 或 源 文 件 名 ) 及 行 号 ⃞<br />

说 明 : 统 一 的 调 测 信 息 格 式 便 于 集 成 测 试 ⃞<br />

¹7-3: 编 程 的 同 时 要 为 单 元 测 试 选 择 恰 当 的 测 试 点 , 并 仔 细 构 造 测 试 代 码 、 测 试 用 例 , 同 时 给<br />

出 明 确 的 注 释 说 明 ⃞ 测 试 代 码 部 分 应 作 为 ( 模 块 中 的 ) 一 个 子 模 块 , 以 方 便 测 试 代 码 在 模 块 中<br />

的 安 装 与 拆 卸 ( 通 过 调 测 开 关 )⃞<br />

说 明 : 为 单 元 测 试 而 准 备 ⃞<br />

¹7-4: 在 进 行 集 成 测 试 / 系 统 联 调 之 前前 , 要 构 造 好好 测 试 环 境 、 测 试 项 目 及 测 试 用 例 , 同 时 仔 细<br />

分 析 并 优 化化 测 试 用 例 , 以 提 高 测 试 效 率 ⃞<br />

说 明 : 好好 的 测 试 用 例 应 尽 可 能 模 拟 出 程 序 所 遇 到到 的 边 界 值 、 各 种 复 杂 环 境 及 一 些 极 端 情 况<br />

等 ⃞<br />

¹7-5: 使 用 断 言 来 发 现 软 件 问 题 , 提 高 代 码 可 测 性 ⃞<br />

说 明 : 断 言 是 对 某 种 假 设 条 件 进 行 检 查 ( 可 理 解 为 若 条 件 成 立 则 无 动 作 , 否 则 应 报 告告 ),<br />

它 可 以 快 速 发 现 并 定 位 软 件 问 题 , 同 时 对 系 统 错 误 进 行 自 动 报 警 ⃞ 断 言 可 以 对 在 系 统 中 隐<br />

藏 很 深 , 用 其 它 手 段 极 难 发 现 的 问 题 进 行 定 位 , 从 而 缩 短 软 件 问 题 定 位 时 间 , 提 高 系 统 的<br />

可 测 性 ⃞ 实 际 应 用 时 , 可 根 据 具 体 情 况 灵 活 地 设 计 断 言 ⃞<br />

示 例 : 下 面 是 C 语 言 中 的 一 个 断 言 , 用 宏 来 设 计 的 ⃞( 其 中 NULL 为 0L)<br />

#ifdef _EXAM_ASSERT_TEST_ // 若 使 用 断 言 测 试<br />

void exam_assert( char * file_name, unsigned int line_no )<br />

{<br />

printf( "\n[EXAM]Assert failed: %s, line %u\n",<br />

file_name, line_no );<br />

abort( );<br />

仅 供 内 部 使 用 37


软 件 编 程 规 范 总 则<br />

7 可 测 性<br />

}<br />

#define EXAM_ASSERT( condition )<br />

if (condition) // 若 条 件 成 立 , 则 无 动 作<br />

NULL;<br />

else // 否 则 报 告告<br />

exam_assert( __FILE__, __LINE__ )<br />

#else // 若 不 使 用 断 言 测 试<br />

#define EXAM_ASSERT(condition) NULL<br />

#endif /* end of ASSERT */<br />

¹7-6: 用 断 言 来 检 查 程 序 正 常 运 行 时 不 应 发 生 但 在 调 测 时 有 可 能 发 生 的 非 法 情 况 ⃞<br />

¹7-7: 不 能 用 断 言 来 检 查 最 终 产 品品 肯 定 会 出 现 且 必 须 处 理 的 错 误 情 况 ⃞<br />

说 明 : 断 言 是 用 来 处 理 不 应 该 发 生 的 错 误 情 况 的 , 对 于 可 能 会 发 生 的 且 必 须 处 理 的 情 况 要<br />

写 防 错 程 序 , 而 不 是 断 言 ⃞ 如如 某 模 块 收 到到 其 它 模 块 或 链 路 上 的 消 息 后 , 要 对 消 息 的 合 理 性<br />

进 行 检 查 , 此 过 程 为 正 常 的 错 误 检 查 , 不 能 用 断 言 来 实 现 ⃞<br />

¹7-8: 对 较 复 杂 的 断 言 加 上 明 确 的 注 释 ⃞<br />

说 明 : 为 复 杂 的 断 言 加 注 释 , 可 澄 清 断 言 含 义 并 减 少 不 必 要 的 误 用 ⃞<br />

¹7-9: 用 断 言 确 认 函 数 的 参 数 ⃞<br />

示 例 : 假 设 某 函 数 参 数 中 有 一 个 指 针 , 那 么 使 用 指 针 前前 可 对 它 检 查 , 如如 下 ⃞<br />

int exam_fun( unsigned char *str )<br />

{<br />

EXAM_ASSERT( str != NULL ); // 用 断 言 检 查 ‚ 假 设 指 针 不 为 空 ‛ 这 个 条 件<br />

}<br />

... //other program code<br />

¹7-10: 用 断 言 保 证 没 有 定 义 的 特 性 或 功 能 不 被 使 用 ⃞<br />

示 例 : 假 设 某 通 信 模 块 在 设 计 时 , 准 备 提 供 ‚ 无 连 接 ‛ 和和 ‚ 连 接 ‛ 这 两 种 业 务 ⃞ 但 当 前前<br />

的 版 本 中 仅 实 现 了 ‚ 无 连 接 ‛ 业 务 , 且 在 此 版 本 的 正 式 发 行 版 中 , 用 户 ( 上 层 模 块 ) 不 应<br />

仅 供 内 部 使 用 38


软 件 编 程 规 范 总 则<br />

7 可 测 性<br />

产 生 ‚ 连 接 ‛ 业 务 的 请 求 , 那 么 在 测 试 时 可 用 断 言 检 查 用 户 是 否 使 用 ‚ 连 接 ‛ 业 务 ⃞ 如如 下 ⃞<br />

#define EXAM_CONNECTIONLESS 0 // 无 连 接 业 务<br />

#define EXAM_CONNECTION<br />

1 // 连 接 业 务<br />

int msg_process( EXAM_MESSAGE *msg )<br />

{<br />

unsigned char service; /* message service class */<br />

EXAM_ASSERT( msg != NULL );<br />

service = get_msg_service_class( msg );<br />

EXAM_ASSERT( service != EXAM_CONNECTION ); // 假 设 不 使 用 连 接 业 务<br />

}<br />

... //other program code<br />

¹7-11: 用 断 言 对 程 序 开 发 环 境 (OS/Compiler/Hardware) 的 假 设 进 行 检 查 ⃞<br />

说 明 : 程 序 运 行 时 所 需 的 软 硬 件 环 境 及 配 置 要 求 , 不 能 用 断 言 来 检 查 , 而 必 须 由 一 段 专 门<br />

代 码 处 理 ⃞ 用 断 言 仅 可 对 程 序 开 发 环 境 中 的 假 设 及 所 配 置 的 某 版 本 软 硬 件 是 否 具 有 某 种 功<br />

能 的 假 设 进 行 检 查 ⃞ 如如 某 网 卡 是 否 在 系 统 运 行 环 境 中 配 置 了 , 应 由 程 序 中 正 式 代 码 来 检 查 ;<br />

而 此 网 卡 是 否 具 有 某 设 想 的 功 能 , 则 可 由 断 言 来 检 查 ⃞<br />

对 编 译 器 提 供 的 功 能 及 特 性 假 设 可 用 断 言 检 查 , 原 因 是 软 件 最 终 产 品品 ( 即 运 行 代 码 或 机 器<br />

码 ) 与 编 译 器 已 没 有 任 何 直 接 关 系 , 即 软 件 运 行 过 程 中 ( 注 意 不 是 编 译 过 程 中 ) 不 会 也 不<br />

应 该 对 编 译 器 的 功 能 提 出 任 何 需 求 ⃞<br />

示 例 : 用 断 言 检 查 编 译 器 的 int 型 数 据 占 用 的 内 存 空 间 是 否 为 2, 如如 下 ⃞<br />

EXAM_ASSERT( sizeof( int ) == 2 );<br />

¹7-12: 正 式 软 件 产 品品 中 应 把 断 言 及 其 它 调 测 代 码 去 掉 ( 即 把 有 关 的 调 测 开 关 关 掉 )⃞<br />

说 明 : 加 快 软 件 运 行 速 度 ⃞<br />

¹7-13: 在 软 件 系 统 中 设 置 与 取 消 有 关 测 试 手 段 , 不 能 对 软 件 实 现 的 功 能 等 产 生 影 响响 ⃞<br />

说 明 : 即 有 测 试 代 码 的 软 件 和和 关 掉 测 试 代 码 的 软 件 , 在 功 能 行 为 上 应 一 致 ⃞<br />

¹7-14: 用 调 测 开 关 来 切 换 软 件 的 DEBUG 版 和和 正 式 版 , 而 不 要 同 时 存 在 正 式 版 本 和和 DEBUG 版 本<br />

仅 供 内 部 使 用 39


软 件 编 程 规 范 总 则<br />

7 可 测 性<br />

的 不 同 源 文 件 , 以 减 少 维 护 的 难 度 ⃞<br />

¹7-15: 软 件 的 DEBUG 版 本 和和 发 行 版 本 应 该 统 一 维 护 , 不 允 许 分 家 , 并 且 要 时 刻刻 注 意 保 证 两 个<br />

版 本 在 实 现 功 能 上 的 一 致 性 ⃞<br />

½7-1: 在 编 写 代 码 之 前前 , 应 预 先 设 计 好好 程 序 调 试 与 测 试 的 方 法 和和 手 段 , 并 设 计 好好 各 种 调 测 开 关<br />

及 相 应 测 试 代 码 如如 打 印 函 数 等 ⃞<br />

说 明 : 程 序 的 调 试 与 测 试 是 软 件 生 存 周周 期 中 很 重 要 的 一 个 阶 段 , 如如 何 对 软 件 进 行 较 全 面 、<br />

高 率 的 测 试 并 尽 可 能 地 找 出 软 件 中 的 错 误 就 成 为 很 关 键 的 问 题 ⃞ 因 此 在 编 写 源 代 码 之 前前 ,<br />

除 了 要 有 一 套套 比 较 完 善 的 测 试 计 划 外 , 还 应 设 计 出 一 系 列 代 码 测 试 手 段 , 为 单 元 测 试 、 集<br />

成 测 试 及 系 统 联 调 提 供 方 便 ⃞<br />

½7-2: 调 测 开 关 应 分 为 不 同 级 别 和和 类 型 ⃞<br />

说 明 : 调 测 开 关 的 设 置 及 分 类 应 从 以 下 几 方 面 考 虑 : 针 对 模 块 或 系 统 某 部 分 代 码 的 调 测 ;<br />

针 对 模 块 或 系 统 某 功 能 的 调 测 ; 出 于 某 种 其 它 目 的 , 如如 对 性 能 、 容 量 等 的 测 试 ⃞ 这 样 做 便<br />

于 软 件 功 能 的 调 测 , 并 且 便 于 模 块 的 单 元 测 试 、 系 统 联 调 等 ⃞<br />

½7-3: 编 写 防 错 程 序 , 然 后 在 处 理 错 误 之 后 可 用 断 言 宣 布 发 生 错 误 ⃞<br />

示 例 : 假 如如 某 模 块 收 到到 通 信 链 路 上 的 消 息 , 则 应 对 消 息 的 合 法 性 进 行 检 查 , 若 消 息 类 别 不<br />

是 通 信 协 议 中 规 定 的 , 则 应 进 行 出 错 处 理 , 之 后 可 用 断 言 报 告告 , 如如 下 例 ⃞<br />

#ifdef _EXAM_ASSERT_TEST_ // 若 使 用 断 言 测 试<br />

/* Notice: this function does not call 'abort' to exit program */<br />

void assert_report( char * file_name, unsigned int line_no )<br />

{<br />

printf( "\n[EXAM]Error Report: %s, line %u\n",<br />

file_name, line_no );<br />

}<br />

#define ASSERT_REPORT( condition )<br />

if ( condition ) // 若 条 件 成 立 , 则 无 动 作<br />

NULL;<br />

else // 否 则 报 告告<br />

assert_report ( __FILE__, __LINE__ )<br />

仅 供 内 部 使 用 40


软 件 编 程 规 范 总 则<br />

7 可 测 性<br />

#else // 若 不 使 用 断 言 测 试<br />

#define ASSERT_REPORT( condition ) NULL<br />

#endif /* end of ASSERT */<br />

int msg_handle( unsigned char msg_name, unsigned char * msg )<br />

{<br />

switch( msg_name )<br />

{<br />

case MSG_ONE:<br />

... // 消 息 MSG_ONE 处 理<br />

return MSG_HANDLE_SUCCESS;<br />

... // 其 它 合 法 消 息 处 理<br />

default:<br />

... // 消 息 出 错 处 理<br />

}<br />

}<br />

ASSERT_REPORT( FALSE ); // ‚ 合 法 ‛ 消 息 不 成 立 , 报 告告<br />

return MSG_HANDLE_ERROR;<br />

仅 供 内 部 使 用 41


软 件 编 程 规 范 总 则<br />

8 程 序 效 率<br />

8 程 序 效 率<br />

¹8-1: 编 程 时 要 经 常 注 意 代 码 的 效 率 ⃞<br />

说 明 : 代 码 效 率 分 为 全 局 效 率 、 局 部 效 率 、 时 间 效 率 及 空 间 效 率 ⃞ 全 局 效 率 是 站 在 整 个 系<br />

统 的 角 度 上 的 系 统 效 率 ; 局 部 效 率 是 站 在 模 块 或 函 数 角 度 上 的 效 率 ; 时 间 效 率 是 程 序 处 理<br />

输 入 任 务 所 需 的 时 间 长 短 ; 空 间 效 率 是 程 序 所 需 内 存 空 间 , 如如 机 器 代 码 空 间 大 小 、 数 据 空<br />

间 大 小 、 栈 空 间 大 小 等 ⃞<br />

¹8-2: 在 保 证 软 件 系 统 的 正 确 性 、 稳 定 性 、 可 读 性 及 可 测 性 的 前前 提 下 , 提 高 代 码 效 率 ⃞<br />

说 明 : 不 能 一 味味 地 追 求 代 码 效 率 , 而 对 软 件 的 正 确 性 、 稳 定 性 、 可 读 性 及 可 测 性 造 成 影 响响 ⃞<br />

¹8-3: 局 部 效 率 应 为 全 局 效 率 服 务 , 不 能 因 为 提 高 局 部 效 率 而 对 全 局 效 率 造 成 影 响响 ⃞<br />

¹8-4: 通 过 对 系 统 数 据 结 构 的 划 分 与 组 织 的 改 进 , 以 及 对 程 序 算 法 的 优 化化 来 提 高 空 间 效 率 ⃞<br />

说 明 : 这 种 方 式 是 解 决 软 件 空 间 效 率 的 根 本 办 法 ⃞<br />

示 例 : 如如 下 记 录 学 生 学 习 成 绩 的 结 构 不 合 理 ⃞<br />

typedef unsigned char BYTE;<br />

typedef unsigned short WORD;<br />

typedef struct STUDENT_SCORE_STRU<br />

BYTE name[8];<br />

BYTE age;<br />

BYTE sex;<br />

BYTE class;<br />

BYTE subject;<br />

float score;<br />

} STUDENT_SCORE;<br />

因 为 每 位 学 生 都 有 多 科 学 习 成 绩 , 故 如如 上 结 构 将 占 用 较 大 空 间 ⃞ 应 如如 下 改 进 ( 分 为 两 个 结<br />

构 ), 总 的 存 贮 空 间 将 变 小 , 操 作 也 变 得 更 方 便 ⃞<br />

typedef struct STUDENT_STRU<br />

{<br />

仅 供 内 部 使 用 42


软 件 编 程 规 范 总 则<br />

8 程 序 效 率<br />

BYTE name[8];<br />

BYTE age;<br />

BYTE sex;<br />

BYTE class;<br />

} STUDENT;<br />

typedef struct STUDENT_SCORE_STRU<br />

{<br />

WORD student_index;<br />

BYTE subject;<br />

float score;<br />

} STUDENT_SCORE;<br />

¹8-5: 循 环 体 内 工 作 量 最 小 化化 ⃞<br />

说 明 : 应 仔 细 考 虑 循 环 体 内 的 语 句 是 否 可 以 放 在 循 环 体 之 外 , 使 循 环 体 内 工 作 量 最 小 , 从<br />

而 提 高 程 序 的 时 间 效 率 ⃞<br />

示 例 : 如如 下 代 码 效 率 不 高 ⃞<br />

for (ind = 0; ind < MAX_ADD_NUMBER; ind++)<br />

{<br />

sum += ind;<br />

back_sum = sum; /* backup sum */<br />

}<br />

语 句 ‚back_sum = sum;‛ 完 全 可 以 放 在 for 语 句 之 后 , 如如 下 ⃞<br />

for (ind = 0; ind < MAX_ADD_NUMBER; ind++)<br />

{<br />

sum += ind;<br />

}<br />

back_sum = sum; /* backup sum */<br />

½8-1: 仔 细 分 析 有 关 算 法 , 并 进 行 优 化化 ⃞<br />

½8-2: 仔 细 考 查 、 分 析 系 统 及 模 块 处 理 输 入 ( 如如 事 务 、 消 息 等 ) 的 方 式 , 并 加 以 改 进 ⃞<br />

½8-3: 对 模 块 中 函 数 的 划 分 及 组 织 方 式 进 行 分 析 、 优 化化 , 改 进 模 块 中 函 数 的 组 织 结 构 , 提 高 程<br />

序 效 率 ⃞<br />

仅 供 内 部 使 用 43


软 件 编 程 规 范 总 则<br />

8 程 序 效 率<br />

说 明 : 软 件 系 统 的 效 率 主 要 与 算 法 、 处 理 任 务 方 式 、 系 统 功 能 及 函 数 结 构 有 很 大 关 系 , 仅<br />

在 代 码 上 下 功 夫 一 般 不 能 解 决 根 本 问 题 ⃞<br />

½8-4: 编 程 时 , 要 随 时 留 心 代 码 效 率 ; 优 化化 代 码 时 , 要 考 虑 周周 全 ⃞<br />

½8-5: 不 应 花 过 多 的 时 间 拼 命命 地 提 高 调 用 不 很 频 繁 的 函 数 代 码 效 率 ⃞<br />

说 明 : 对 代 码 优 化化 可 提 高 效 率 , 但 若 考 虑 不 周周 很 有 可 能 引 起 严 重 后 果 ⃞<br />

½8-6: 要 仔 细 地 构 造 或 直 接 用 汇 编 编 写 调 用 频 繁 或 性 能 要 求 极 高 的 函 数 ⃞<br />

说 明 : 只 有 对 编 译 系 统 产 生 机 器 码 的 方 式 以 及 硬 件 系 统 较 为 熟 悉 时 , 才 可 使 用 汇 编 嵌 入 方<br />

式 ⃞ 嵌 入 汇 编 可 提 高 时 间 及 空 间 效 率 , 但 也 存 在 一 定 风 险 ⃞<br />

½8-7: 在 保 证 程 序 质 量 的 前前 提 下 , 通 过 压 缩 代 码 量 、 去 掉 不 必 要 代 码 以 及 减 少 不 必 要 的 局 部 和和<br />

全 局 变 量 , 来 提 高 空 间 效 率 ⃞<br />

说 明 : 这 种 方 式 对 提 高 空 间 效 率 可 起 到到 一 定 作 用 , 但 往 往 不 能 解 决 根 本 问 题 ⃞<br />

½8-8: 在 多 重 循 环 中 , 应 将 最 忙 的 循 环 放 在 最 内 层 ⃞<br />

说 明 : 减 少 CPU 切 入 循 环 层 的 次 数 ⃞<br />

示 例 : 如如 下 代 码 效 率 不 高 ⃞<br />

for (row = 0; row < 100; row++)<br />

{<br />

for (col = 0; col < 5; col++)<br />

{<br />

sum += a[row][col];<br />

}<br />

}<br />

可 以 改 为 如如 下 方 式 , 以 提 高 效 率 ⃞<br />

for (col = 0; col < 5; col++)<br />

{<br />

for (row = 0; row < 100; row++)<br />

{<br />

sum += a[row][col];<br />

}<br />

}<br />

仅 供 内 部 使 用 44


软 件 编 程 规 范 总 则<br />

8 程 序 效 率<br />

½8-9: 尽 量 减 少 循 环 嵌 套套 层 次 ⃞<br />

½8-10: 避 免 循 环 体 内 含 判 断 语 句 , 应 将 循 环 语 句 置 于 判 断 语 句 的 代 码 块 之 中 ⃞<br />

说 明 : 目 的 是 减 少 判 断 次 数 ⃞ 循 环 体 中 的 判 断 语 句 是 否 可 以 移 到到 循 环 体 外 , 要 视 程 序 的 具<br />

体 情 况 而 言 , 一 般 情 况 , 与 循 环 变 量 无 关 的 判 断 语 句 可 以 移 到到 循 环 体 外 , 而 有 关 的 则 不 可<br />

以 ⃞<br />

示 例 : 如如 下 代 码 效 率 稍 低 ⃞<br />

for (ind = 0; ind < MAX_RECT_NUMBER; ind++)<br />

{<br />

if (data_type == RECT_AREA)<br />

{<br />

area_sum += rect_area[ind];<br />

}<br />

else<br />

{<br />

rect_length_sum += rect[ind].length;<br />

rect_width_sum += rect[ind].width;<br />

}<br />

}<br />

因 为 判 断 语 句 与 循 环 变 量 无 关 , 故 可 如如 下 改 进 , 以 减 少 判 断 次 数 ⃞<br />

if (data_type == RECT_AREA)<br />

{<br />

for (ind = 0; ind < MAX_RECT_NUMBER; ind++)<br />

{<br />

area_sum += rect_area[ind];<br />

}<br />

}<br />

else<br />

{<br />

for (ind = 0; ind < MAX_RECT_NUMBER; ind++)<br />

{<br />

rect_length_sum += rect[ind].length;<br />

rect_width_sum += rect[ind].width;<br />

}<br />

仅 供 内 部 使 用 45


软 件 编 程 规 范 总 则<br />

8 程 序 效 率<br />

}<br />

½8-11: 尽 量 用 乘 法 或 其 它 方 法 代 替 除 法 , 特 别 是 浮 点 运 算 中 的 除 法 ⃞<br />

说 明 : 浮 点 运 算 除 法 要 占 用 较 多 CPU 资 源 ⃞<br />

示 例 : 如如 下 表 达 式 运 算 可 能 要 占 较 多 CPU 资 源 ⃞<br />

#define PAI 3.1416<br />

radius = circle_length / (2 * PAI);<br />

应 如如 下 把 浮 点 除 法 改 为 浮 点 乘 法 ⃞<br />

#define PAI_RECIPROCAL (1 / 3.1416 ) // 编 译 器 编 译 时 , 将 生 成 具 体 浮 点 数<br />

radius = circle_length * PAI_RECIPROCAL / 2;<br />

½8-12: 不 要 一 味味 追 求 紧 凑 的 代 码 ⃞<br />

说 明 : 因 为 紧 凑 的 代 码 并 不 代 表 高 效 的 机 器 码 ⃞<br />

仅 供 内 部 使 用 46


软 件 编 程 规 范 总 则<br />

9 质 量 保 证<br />

9 质 量 保 证<br />

¹9-1: 在 软 件 设 计 过 程 中 构 筑 软 件 质 量 ⃞<br />

¹9-2: 代 码 质 量 保 证 优 先 原 则<br />

(1) 正 确 性 , 指 程 序 要 实 现 设 计 要 求 的 功 能 ⃞<br />

(2) 稳 定 性 、 安 全 性 , 指 程 序 稳 定 、 可 靠 、 安 全 ⃞<br />

(3) 可 测 试 性 , 指 程 序 要 具 有 良 好好 的 可 测 试 性 ⃞<br />

(4) 规 范 / 可 读 性 , 指 程 序 书 写 风 格 、 命命 名 规 则 等 要 符 合 规 范 ⃞<br />

(5) 全 局 效 率 , 指 软 件 系 统 的 整 体 效 率 ⃞<br />

(6) 局 部 效 率 , 指 某 个 模 块 / 子 模 块 / 函 数 的 本 身 效 率 ⃞<br />

(7) 个 人 表 达 方 式 / 个 人 方 便 性 , 指 个 人 编 程 习 惯 ⃞<br />

¹9-3: 只 引 用 属 于 自 己 的 存 贮 空 间 ⃞<br />

说 明 : 若 模 块 封 装 的 较 好好 , 那 么 一 般 不 会 发 生 非 法 引 用 他 人 的 空 间 ⃞<br />

¹9-4: 防 止 引 用 已 经 释 放 的 内 存 空 间 ⃞<br />

说 明 : 在 实 际 编 程 过 程 中 , 稍 不 留 心 就 会 出 现 在 一 个 模 块 中 释 放 了 某 个 内 存 块 ( 如如 C 语 言<br />

指 针 ), 而 另 一 模 块 在 随 后 的 某 个 时 刻刻 又 使 用 了 它 ⃞ 要 防 止 这 种 情 况 发 生 ⃞<br />

¹9-5: 过 程 / 函 数 中 分 配 的 内 存 , 在 过 程 / 函 数 退 出 之 前前 要 释 放 ⃞<br />

¹9-6: 过 程 / 函 数 中 申 请 的 ( 为 打 开 文 件 而 使 用 的 ) 文 件 句 柄 , 在 过 程 / 函 数 退 出 之 前前 要 关 闭 ⃞<br />

说 明 : 分 配 的 内 存 不 释 放 以 及 文 件 句 柄 不 关 闭 , 是 较 常 见 的 错 误 , 而 且 稍 不 注 意 就 有 可 能<br />

发 生 ⃞ 这 类 错 误 往 往 会 引 起 很 严 重 后 果 , 且 难 以 定 位 ⃞<br />

示 例 : 下 函 数 在 退 出 之 前前 , 没 有 把 分 配 的 内 存 释 放 ⃞<br />

typedef unsigned char BYTE;<br />

int example_fun( BYTE gt_len, BYTE *gt_code )<br />

{<br />

BYTE *gt_buf;<br />

gt_buf = (BYTE *) malloc (MAX_GT_LENGTH);<br />

... //program code, include check gt_buf if or not NULL.<br />

仅 供 内 部 使 用 47


软 件 编 程 规 范 总 则<br />

9 质 量 保 证<br />

/* global title length error */<br />

if (gt_len > MAX_GT_LENGTH)<br />

{<br />

return GT_LENGTH_ERROR; // 忘 了 释 放 gt_buf<br />

}<br />

}<br />

... // other program code<br />

应 改 为 如如 下 ⃞<br />

int example_fun( BYTE gt_len, BYTE *gt_code )<br />

{<br />

BYTE *gt_buf;<br />

gt_buf = (BYTE * ) malloc ( MAX_GT_LENGTH );<br />

... // program code, include check gt_buf if or not NULL.<br />

/* global title length error */<br />

if (gt_len > MAX_GT_LENGTH)<br />

{<br />

free( gt_buf ); // 退 出 之 前前 释 放 gt_buf<br />

return GT_LENGTH_ERROR;<br />

}<br />

}<br />

... // other program code<br />

¹9-7: 防 止 内 存 操 作 越 界 ⃞<br />

说 明 : 内 存 操 作 主 要 是 指 对 数 组 、 指 针 、 内 存 地 址 等 的 操 作 ⃞ 内 存 操 作 越 界 是 软 件 系 统 主<br />

要 错 误 之 一 , 后 果 往 往 非 常 严 重 , 所 以 当 我 们 进 行 这 些 操 作 时 一 定 要 仔 细 小 心 ⃞<br />

示 例 : 假 设 某 软 件 系 统 最 多 可 由 10 个 用 户 同 时 使 用 , 用 户 号 为 1-10, 那 么 如如 下 程 序 存 在<br />

问 题 ⃞<br />

#define MAX_USR_NUM 10<br />

unsigned char usr_login_flg[MAX_USR_NUM]= "";<br />

仅 供 内 部 使 用 48


软 件 编 程 规 范 总 则<br />

9 质 量 保 证<br />

void set_usr_login_flg( unsigned char usr_no )<br />

{<br />

if (!usr_login_flg[usr_no])<br />

{<br />

usr_login_flg[usr_no]= TRUE;<br />

}<br />

}<br />

当 usr_no 为 10 时 , 将 使 用 usr_login_flg 越 界 ⃞ 可 采 用 如如 下 方 式 解 决 ⃞<br />

void set_usr_login_flg( unsigned char usr_no )<br />

{<br />

if (!usr_login_flg[usr_no - 1])<br />

{<br />

usr_login_flg[usr_no - 1]= TRUE;<br />

}<br />

}<br />

¹9-8: 认 真 处 理 程 序 所 能 遇 到到 的 各 种 出 错 情 况 ⃞<br />

¹9-9: 系 统 运 行 之 初 , 要 初 始始 化化 有 关 变 量 及 运 行 环 境 , 防 止 未 经 初 始始 化化 的 变 量 被 引 用 ⃞<br />

¹9-10: 系 统 运 行 之 初 , 要 对 加 载 到到 系 统 中 的 数 据 进 行 一 致 性 检 查 ⃞<br />

说 明 : 使 用 不 一 致 的 数 据 , 容 易 使 系 统 进 入 混 乱 状 态 和和 不 可 知 状 态 ⃞<br />

¹9-11: 严 禁 随 意 更 改 其 它 模 块 或 系 统 的 有 关 设 置 和和 配 置 ⃞<br />

说 明 : 编 程 时 , 不 能 随 心 所 欲 地 更 改 不 属 于 自 己 模 块 的 有 关 设 置 如如 常 量 、 数 组 的 大 小 等 ⃞<br />

¹9-12: 不 能 随 意 改 变 与 其 它 模 块 的 接 口 ⃞<br />

¹9-13: 充 分 了 解 系 统 的 接 口 之 后 , 再 使 用 系 统 提 供 的 功 能 ⃞<br />

示 例 : 在 B 型 机 的 各 模 块 与 操 作 系 统 的 接 口 函 数 中 , 有 一 个 要 由 各 模 块 负 责 编 写 的 初 始始 化化<br />

过 程 , 此 过 程 在 软 件 系 统 加 载 完 成 后 , 由 操 作 系 统 发 送 的 初 始始 化化 消 息 来 调 度 ⃞ 因 此 就 涉 及<br />

到到 初 始始 化化 消 息 的 类 型 与 消 息 发 送 的 顺 序 问 题 , 特 别 是 消 息 顺 序 , 若 没 搞 清 楚 就 开 始始 编 程 ,<br />

很 容 易 引 起 严 重 后 果 ⃞ 以 下 示 例 引 自 B 型 曾 出 现 过 的 实 际 代 码 , 其 中 使 用 了<br />

FID_FETCH_DATA 与 FID_INITIAL 初 始始 化化 消 息 类 型 , 注 意 B 型 机 的 系 统 是 在<br />

仅 供 内 部 使 用 49


软 件 编 程 规 范 总 则<br />

9 质 量 保 证<br />

FID_FETCH_DATA 之 前前 发 送 FID_INITIAL 的 ⃞<br />

MID alarm_module_list[MAX_ALARM_MID];<br />

int FAR SYS_ALARM_proc( FID function_id, int handle )<br />

{<br />

_UI i, j;<br />

switch ( function_id )<br />

{<br />

... // program code<br />

case FID_INITAIL:<br />

for (i = 0; i < MAX_ALARM_MID; i++)<br />

{<br />

if (alarm_module_list[i]== BAM_MODULE // **)<br />

|| (alarm_module_list[i]== LOCAL_MODULE)<br />

{<br />

}<br />

}<br />

for (j = 0; j < ALARM_CLASS_SUM; j++)<br />

{<br />

FAR_MALLOC( ... );<br />

}<br />

... // program code<br />

break;<br />

case FID_FETCH_DATA:<br />

... // program code<br />

Get_Alarm_Module( ); // 初 始始 化化 alarm_module_list<br />

仅 供 内 部 使 用 50


软 件 编 程 规 范 总 则<br />

9 质 量 保 证<br />

break;<br />

}<br />

}<br />

... // program code<br />

由 于 FID_INITIAL 是 在 FID_FETCH_DATA 之 前前 执 行 的 , 而 初 始始 化化<br />

alarm_module_list 是 在 FID_FETCH_DATA 中 进 行 的 , 故 在 FID_INITIAL 中 (**)<br />

处 引 用 alarm_module_list 变 量 时 , 它 还 没 有 被 初 始始 化化 ⃞ 这 是 个 严 重 错 误 ⃞<br />

应 如如 下 改 正 : 要 么 把 Get_Alarm_Module 函 数 放 在 FID_INITIAL 中 (**) 之 前前 ; 要<br />

么 就 必 须 考 虑 (**) 处 的 判 断 语 句 是 否 可 以 用 ( 不 使 用 alarm_module_list 变 量 的 )<br />

其 它 方 式 替 代 , 或 者 是 否 可 以 取 消 此 判 断 语 句 ⃞<br />

¹9-14: 编 程 时 , 要 防 止 差 1 错 误 ⃞<br />

说 明 : 此 类 错 误 一 般 是 由 于 把 ‚‛ 等 造 成 的 , 由 此<br />

引 起 的 后 果 , 很 多 情 况 下 是 很 严 重 的 , 所 以 编 程 时 , 一 定 要 在 这 些 地 方 小 心 ⃞ 当 编 完 程 序<br />

后 , 应 对 这 些 操 作 符 进 行 彻 底 检 查 ⃞<br />

¹9-15: 要 时 刻刻 注 意 易 混 淆 的 操 作 符 ⃞ 当 编 完 程 序 后 , 应 从 头头 至 尾 检 查 一 遍 这 些 操 作 符 , 以 防<br />

止 拼 写 错 误 ⃞<br />

说 明 : 形 式 相 近 的 操 作 符 最 容 易 引 起 误 用 , 如如 C/C++ 中 的 ‚=‛ 与 ‚==‛、‚|‛ 与 ‚||‛、<br />

‚&‛ 与 ‚&&‛ 等 , 若 拼 写 错 了 , 编 译 器 不 一 定 能 够 检 查 出 来 ⃞<br />

示 例 : 如如 把 ‚&‛ 写 成 ‚&&‛, 或 反 之 ⃞<br />

ret_flg = (pmsg->ret_flg & RETURN_MASK);<br />

被 写 为 :<br />

ret_flg = (pmsg->ret_flg && RETURN_MASK);<br />

rpt_flg = (VALID_TASK_NO( taskno ) && DATA_NOT_ZERO( stat_data ));<br />

被 写 为 :<br />

rpt_flg = (VALID_TASK_NO( taskno ) & DATA_NOT_ZERO( stat_data ));<br />

¹9-16: 有 可 能 的 话 ,if 语 句 尽 量 加 上 else 分 支 , 对 没 有 else 分 支 的 语 句 要 小 心 对 待 ;switch<br />

语 句 必 须 有 default 分 支 ⃞<br />

仅 供 内 部 使 用 51


软 件 编 程 规 范 总 则<br />

9 质 量 保 证<br />

¹9-17:Unix 下 , 多 线 程 的 中 的 子 线 程 退 出 必 需 采 用 主 动 退 出 方 式 , 即 子 线 程 应 return 出 口 ⃞<br />

¹9-18: 不 要 滥 用 goto 语 句 ⃞<br />

说 明 :goto 语 句 会 破 坏 程 序 的 结 构 性 , 所 以 除 非 确 实 需 要 , 最 好好 不 使 用 goto 语 句 ⃞<br />

½9-1: 不 使 用 与 硬 件 或 操 作 系 统 关 系 很 大 的 语 句 , 而 使 用 建 议 的 标 准 语 句 , 以 提 高 软 件 的 可 移<br />

植 性 和和 可 重 用 性 ⃞<br />

½9-2: 除 非 为 了 满 足 特 殊 需 求 , 避 免 使 用 嵌 入 式 汇 编 ⃞<br />

说 明 : 程 序 中 嵌 入 式 汇 编 , 一 般 都 对 可 移 植 性 有 较 大 的 影 响响 ⃞<br />

½9-3: 精 心 地 构 造 、 划 分 子 模 块 , 并 按 ‚ 接 口 ‛ 部 分 及 ‚ 内 核 ‛ 部 分 合 理 地 组 织 子 模 块 , 以 提<br />

高 ‚ 内 核 ‛ 部 分 的 可 移 植 性 和和 可 重 用 性 ⃞<br />

说 明 : 对 不 同 产 品品 中 的 某 个 功 能 相 同 的 模 块 , 若 能 做 到到 其 内 核 部 分 完 全 或 基 本 一 致 , 那 么<br />

无 论 对 产 品品 的 测 试 、 维 护 , 还 是 对 以 后 产 品品 的 升 级 都 会 有 很 大 帮 助 ⃞<br />

½9-4: 精 心 构 造 算 法 , 并 对 其 性 能 、 效 率 进 行 测 试 ⃞<br />

½9-5: 对 较 关 键 的 算 法 最 好好 使 用 其 它 算 法 来 确 认 ⃞<br />

½9-6: 时 刻刻 注 意 表 达 式 是 否 会 上 溢 、 下 溢 ⃞<br />

示 例 : 如如 下 程 序 将 造 成 变 量 下 溢 ⃞<br />

unsigned char size ;<br />

while (size-- >= 0) // 将 出 现 下 溢<br />

{<br />

... // program code<br />

}<br />

当 size 等 于 0 时 , 再 减 1 不 会 小 于 0, 而 是 0xFF, 故 程 序 是 一 个 死 循 环 ⃞ 应 如如 下 修 改 ⃞<br />

char size; // 从 unsigned char 改 为 char<br />

while (size-- >= 0)<br />

{<br />

... // program code<br />

}<br />

½9-7: 使 用 变 量 时 要 注 意 其 边 界 值 的 情 况 ⃞<br />

仅 供 内 部 使 用 52


软 件 编 程 规 范 总 则<br />

9 质 量 保 证<br />

示 例 : 如如 C 语 言 中 字 符 型 变 量 , 有 效 值 范 围 为 -128 到到 127⃞ 故 以 下 表 达 式 的 计 算 存 在 一<br />

定 风 险 ⃞<br />

char chr = 127;<br />

int sum = 200;<br />

chr += 1; // 127 为 chr 的 边 界 值 , 再 加 1 将 使 chr 上 溢 到到 -128, 而 不 是 128⃞<br />

sum += chr; // 故 sum 的 结 果 不 是 328, 而 是 72⃞<br />

若 chr 与 sum 为 同 一 种 类 型 , 或 表 达 式 按 如如 下 方 式 书 写 , 可 能 会 好好 些 ⃞<br />

sum = sum + chr + 1;<br />

½9-8: 留 心 程 序 机 器 码 大 小 ( 如如 指 令 空 间 大 小 、 数 据 空 间 大 小 、 堆 栈 空 间 大 小 等 ) 是 否 超 出 系<br />

统 有 关 限 制制 ⃞<br />

½9-9: 为 用 户 提 供 良 好好 的 接 口 界 面 , 使 用 户 能 较 充 分 地 了 解 系 统 内 部 运 行 状 态 及 有 关 系 统 出 错<br />

情 况 ⃞<br />

½9-10: 系 统 应 具 有 一 定 的 容 错 能 力力 , 对 一 些 错 误 事 件 ( 如如 用 户 误 操 作 等 ) 能 进 行 自 动 补 救 ⃞<br />

½9-11: 对 一 些 具 有 危 险 性 的 操 作 代 码 ( 如如 写 硬 盘 、 删 数 据 等 ) 要 仔 细 考 虑 , 防 止 对 数 据 、 硬<br />

件 等 的 安 全 构 成 危 害 , 以 提 高 系 统 的 安 全 性 ⃞<br />

½9-12: 使 用 第 三 方 提 供 的 软 件 开 发 工 具 包包 或 控 件 时 , 要 注 意 以 下 几 点 :<br />

(1) 充 分 了 解 应 用 接 口 、 使 用 环 境 及 使 用 时 注 意 事 项 ⃞<br />

(2) 不 能 过 分 相 信 其 正 确 性 ⃞<br />

(3) 除 非 必 要 , 不 要 使 用 不 熟 悉 的 第 三 方 工 具 包包 与 控 件 ⃞<br />

说 明 : 使 用 工 具 包包 与 控 件 , 可 加 快 程 序 开 发 速 度 , 节 省 时 间 , 但 使 用 之 前前 一 定 对 它 有 较 充<br />

分 的 了 解 , 同 时 第 三 方 工 具 包包 与 控 件 也 有 可 能 存 在 问 题 ⃞<br />

½9-13: 资 源 文 件 ( 多 语 言 版 本 支 持 ), 如如 果 资 源 是 对 语 言 敏 感 的 , 应 让 该 资 源 与 源 代 码 文 件<br />

脱 离 , 具 体 方 法 有 下 面 几 种 : 使 用 单 独 的 资 源 文 件 、DLL 文 件 或 其 它 单 独 的 描 述 文 件 ( 如如 数 据<br />

库 格 式 )<br />

仅 供 内 部 使 用 53


软 件 编 程 规 范 总 则<br />

10 代 码 编 辑 、 编 译 、 审 查<br />

10 代 码 编 辑 、 编 译 、 审 查<br />

¹10-1: 打 开 编 译 器 的 所 有 告告 警 开 关 对 程 序 进 行 编 译 ⃞<br />

¹10-2: 在 产 品品 软 件 ( 项 目 组 ) 中 , 要 统 一 编 译 开 关 选 项 ⃞<br />

¹10-3: 通 过 代 码 走 读 及 审 查 方 式 对 代 码 进 行 检 查 ⃞<br />

说 明 : 代 码 走 读 主 要 是 对 程 序 的 编 程 风 格 如如 注 释 、 命命 名 等 以 及 编 程 时 易 出 错 的 内 容 进 行 检<br />

查 , 可 由 开 发 人 员员 自 己 或 开 发 人 员员 交 叉 的 方 式 进 行 ; 代 码 审 查 主 要 是 对 程 序 实 现 的 功 能 及<br />

程 序 的 稳 定 性 、 安 全 性 、 可 靠 性 等 进 行 检 查 及 评 审 , 可 通 过 自 审 、 交 叉 审 核 或 指 定 部 门 抽<br />

查 等 方 式 进 行 ⃞<br />

¹10-4: 测 试 部 测 试 产 品品 之 前前 , 应 对 代 码 进 行 抽 查 及 评 审 ⃞<br />

½10-1: 编 写 代 码 时 要 注 意 随 时 保 存 , 并 定 期 备 份 , 防 止 由 于 断 电 、 硬 盘 损 坏 等 原 因 造 成 代 码<br />

丢 失失 ⃞<br />

½10-2: 同 产 品品 软 件 ( 项 目 组 ) 内 , 最 好好 使 用 相 同 的 编 辑 器 , 并 使 用 相 同 的 设 置 选 项 ⃞<br />

说 明 : 同 一 项 目 组 最 好好 采 用 相 同 的 智 能 语 言 编 辑 器 , 如如 Muiti Editor,Visual Editor<br />

等 , 并 设 计 、 使 用 一 套套 缩 进 宏 及 注 释 宏 等 , 将 缩 进 等 问 题 交 由 编 辑 器 处 理 ⃞<br />

½10-3: 要 小 心 地 使 用 编 辑 器 提 供 的 块 拷 贝 功 能 编 程 ⃞<br />

说 明 : 当 某 段 代 码 与 另 一 段 代 码 的 处 理 功 能 相 似 时 , 许 多 开 发 人 员员 都 用 编 辑 器 提 供 的 块 拷<br />

贝 功 能 来 完 成 这 段 代 码 的 编 写 ⃞ 由 于 程 序 功 能 相 近 , 故 所 使 用 的 变 量 、 采 用 的 表 达 式 等 在<br />

功 能 及 命命 名 上 可 能 都 很 相 近 , 所 以 使 用 块 拷 贝 时 要 注 意 , 除 了 修 改 相 应 的 程 序 外 , 一 定 要<br />

把 使 用 的 每 个 变 量 仔 细 查 看 一 遍 , 以 改 成 正 确 的 ⃞ 不 应 指 望 编 译 器 能 查 出 所 有 这 种 错 误 ,<br />

比 如如 当 使 用 的 是 全 局 变 量 时 , 就 有 可 能 使 某 种 错 误 隐 藏 下 来 ⃞<br />

½10-4: 合 理 地 设 计 软 件 系 统 目 录 , 方 便 开 发 人 员员 使 用 ⃞<br />

说 明 : 方 便 、 合 理 的 软 件 系 统 目 录 , 可 提 高 工 作 效 率 ⃞ 目 录 构 造 的 原 则 是 方 便 有 关 源 程 序<br />

的 存 储 、 查 询 、 编 译 、 链 接 等 工 作 , 同 时 目 录 中 还 应 具 有 工 作 目 录 ---- 所 有 的 编 译 、 链<br />

接 等 工 作 应 在 此 目 录 中 进 行 , 工 具 目 录 ---- 有 关 文 件 编 辑 器 、 文 件 查 找 等 工 具 可 存 放 在<br />

此 目 录 中 ⃞<br />

仅 供 内 部 使 用 54


软 件 编 程 规 范 总 则<br />

10 代 码 编 辑 、 编 译 、 审 查<br />

½10-5: 某 些 语 句 经 编 译 后 产 生 告告 警 , 但 如如 果 你 认 为 它 是 正 确 的 , 那 么 应 通 过 某 种 手 段 去 掉 告告<br />

警 信 息 ⃞<br />

说 明 : 在 Borland C/C++ 中 , 可 用 ‚#pragma warn‛ 来 关 掉 或 打 开 某 些 告告 警 ⃞<br />

示 例 :<br />

#pragma warn -rvl // 关 闭 告告 警<br />

int examples_fun( void )<br />

{<br />

// 程 序 , 但 无 return 语 句 ⃞<br />

}<br />

#pragma warn +rvl // 打 开 告告 警<br />

编 译 函 数 examples_fun 时 本 应 产 生 ‚ 函 数 应 有 返 回 值 ‛ 告告 警 , 但 由 于 关 掉 了 此 告告 警 信<br />

息 显 示 , 所 以 编 译 时 将 不 会 产 生 此 告告 警 提 示 ⃞<br />

½10-6: 使 用 代 码 检 查 工 具 ( 如如 C 语 言 用 PC-Lint) 对 源 程 序 检 查 ⃞<br />

½10-7: 使 用 软 件 工 具 ( 如如 LogiSCOPE) 进 行 代 码 审 查 ⃞<br />

仅 供 内 部 使 用 55


软 件 编 程 规 范 总 则<br />

11 代 码 测 试 、 维 护<br />

11 代 码 测 试 、 维 护<br />

¹11-1: 单 元 测 试 要 求 至 少 达 到到 语 句 覆 盖 ⃞<br />

¹11-2: 单 元 测 试 开 始始 要 跟 踪 每 一 条 语 句 , 并 观 察 数 据 流 及 变 量 的 变 化化 ⃞<br />

¹11-3: 清 理 、 整 理 或 优 化化 后 的 代 码 要 经 过 审 查 及 测 试 ⃞<br />

¹11-4: 代 码 版 本 升 级 要 经 过 严 格 测 试 ⃞<br />

¹11-5: 使 用 工 具 软 件 对 代 码 版 本 进 行 维 护 ⃞<br />

¹11-6: 正 式 版 本 上 软 件 的 任 何 修 改 都 应 有 详 细 的 文 档 记 录 ⃞<br />

½11-1: 发 现 错 误 立 即 修 改 , 并 且 要 记 录 下 来 ⃞<br />

½11-2: 关 键 的 代 码 在 汇 编 级 跟 踪 ⃞<br />

½11-3: 仔 细 设 计 并 分 析 测 试 用 例 , 使 测 试 用 例 覆 盖 尽 可 能 多 的 情 况 , 以 提 高 测 试 用 例 的 效 率 ⃞<br />

½11-4: 尽 可 能 模 拟 出 程 序 的 各 种 出 错 情 况 , 对 出 错 处 理 代 码 进 行 充 分 的 测 试 ⃞<br />

½11-5: 仔 细 测 试 代 码 处 理 数 据 、 变 量 的 边 界 情 况 ⃞<br />

½11-6: 保 留 测 试 信 息 , 以 便 分 析 、 总 结 经 验 及 进 行 更 充 分 的 测 试 ⃞<br />

½11-7: 不 应 通 过 ‚ 试 ‛ 来 解 决 问 题 , 应 寻 找 问 题 的 根 本 原 因 ⃞<br />

½11-8: 对 自 动 消 失失 的 错 误 进 行 分 析 , 搞 清 楚 错 误 是 如如 何 消 失失 的 ⃞<br />

½11-9: 修 改 错 误 不 仅 要 治 表 , 更 要 治 本 ⃞<br />

½11-10: 测 试 时 应 设 法 使 很 少 发 生 的 事 件 经 常 发 生 ⃞<br />

½11-11: 明 确 模 块 或 函 数 处 理 哪哪 些 事 件 , 并 使 它 们 经 常 发 生 ⃞<br />

½11-12: 坚 持 在 编 码 阶 段 就 对 代 码 进 行 彻 底 的 单 元 测 试 , 不 要 等 以 后 的 测 试 工 作 来 发 现 问 题 ⃞<br />

仅 供 内 部 使 用 56


软 件 编 程 规 范 总 则<br />

11 代 码 测 试 、 维 护<br />

½11-13: 去 除 代 码 运 行 的 随 机 性 ( 如如 去 掉 无 用 的 数 据 、 代 码 及 尽 可 能 防 止 并 注 意 函 数 中 的 ‚ 内<br />

部 寄 存 器 ‛ 等 ), 让 函 数 运 行 的 结 果 可 预 测 , 并 使 出 现 的 错 误 可 再 现 ⃞<br />

仅 供 内 部 使 用 57


软 件 编 程 规 范 总 则<br />

11 代 码 测 试 、 维 护<br />

12 宏<br />

¹12-1: 用 宏 定 义 表 达 式 时 , 要 使 用 完 备 的 括 号 ⃞<br />

示 例 : 如如 下 定 义 的 宏 都 存 在 一 定 的 风 险 ⃞<br />

#define RECTANGLE_AREA( a, b ) a * b<br />

#define RECTANGLE_AREA( a, b ) (a * b)<br />

#define RECTANGLE_AREA( a, b ) (a) * (b)<br />

正 确 的 定 义 应 为 :<br />

#define RECTANGLE_AREA( a, b ) ((a) * (b))<br />

¹12-2: 将 宏 所 定 义 的 多 条 表 达 式 放 在 大 括 号 中 ⃞<br />

示 例 : 下 面 的 语 句 只 有 宏 的 第 一 条 表 达 式 被 执 行 ⃞ 为 了 说 明 问 题 ,for 语 句 的 书 写 稍<br />

不 符 规 范 ⃞<br />

#define INTI_RECT_VALUE( a, b )\<br />

a = 0;\<br />

b = 0;<br />

for (index = 0; index < RECT_TOTAL_NUM; index++)<br />

INTI_RECT_VALUE( rect.a, rect.b );<br />

正 确 的 用 法 应 为 :<br />

#define INTI_RECT_VALUE( a, b )\<br />

{\<br />

a = 0;\<br />

b = 0;\<br />

}<br />

for (index = 0; index < RECT_TOTAL_NUM; index++)<br />

{<br />

仅 供 内 部 使 用 58


软 件 编 程 规 范 总 则<br />

11 代 码 测 试 、 维 护<br />

INTI_RECT_VALUE( rect[index].a, rect[index].b );<br />

}<br />

¹12-3: 使 用 宏 时 , 不 允 许 参 数 发 生 变 化化 ⃞<br />

示 例 : 如如 下 用 法 可 能 导 致 错 误 ⃞<br />

#define SQUARE( a ) ((a) * (a))<br />

int a = 5;<br />

int b;<br />

b = SQUARE( a++ ); // 结 果 :a = 7, 即 执 行 了 两 次 增 1⃞<br />

正 确 的 用 法 是 :<br />

b = SQUARE( a );<br />

a++; // 结 果 :a = 6, 即 只 执 行 了 一 次 增 1⃞<br />

_<br />

仅 供 内 部 使 用 59

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!