编程规范和范例-经营管理(编辑修改稿)内容摘要:

符来定义标识符。 示例:如下命名,使人产生疑惑。 define _EXAMPLE_0_TEST_ define _EXAMPLE_1_TEST_ void set_sls00( BYTE sls )。 应改为有意义的单词命名 define _EXAMPLE_UNIT_TEST_ define _EXAMPLE_ASSERT_TEST_ void set_udt_msg_sls( BYTE sls )。 189。 32:在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。 说明:对接口部分的标识符应该有更严格限制,防止冲突。 如可规定接口部分的变量与常量之前加 上“模块”标识等。 189。 33:用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。 说明:下面是一些在软件中常用的反义词组。 add / remove begin / end create / destroy insert / delete first / last get / release increment / decrement put / get add / delete lock / unlock open / close min / max old / new start / stop next / previous source / target show / hide send / receive source / destination cut / paste up / down 示例: int min_sum。 软件编程规范总则 3 标志符命名 仅供内部使用 19 int max_sum。 int add_user( BYTE *user_name )。 int delete_user( BYTE *user_name )。 189。 34:除了编译开关 /头文件等特殊应用,应避免使用 _EXAMPLE_TEST_之类以下划线开始和结尾的定义。 软件编程规范总则 4 可读性 仅供内部使用 20 4 可读性 185。 41:注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。 说明:防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。 示例:下列语句中的表达式 word = (high 8) | low (1) if ((a | b) amp。 amp。 (a amp。 c)) (2) if ((a | b) (c amp。 d)) (3) 如果书写为 high 8 | low a | b amp。 amp。 a amp。 c a | b c amp。 d 由于 high 8 | low = ( high 8) | low, a | b amp。 amp。 a amp。 c = (a | b) amp。 amp。 (a amp。 c), (1)(2)不会出错,但语句不易理解; a | b c amp。 d = a | ( b c) amp。 d, (3)造成了判断条件出错。 185。 42:避免使用不易理解的数字,用有意义的标识来替代。 涉及 物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的枚举或宏来代替。 示例:如下的程序可读性差。 if (Trunk[index].trunk_state == 0) { Trunk[index].trunk_state = 1。 ... // program code } 应改为如下形式。 define TRUNK_IDLE 0 define TRUNK_BUSY 1 if (Trunk[index].trunk_state == TRUNK_IDLE) { Trunk[index].trunk_state = TRUNK_BUSY。 软件编程规范总则 4 可读性 仅供内部使用 21 ... // program code } 189。 41:源程序中关系较为紧密的代码应尽可能相邻。 说明:便于程序阅读和查找。 示例:以下代码布局不太合理。 = 10。 char_poi = str。 = 5。 若按如下形式书写,可能更清晰一些。 = 10。 = 5。 // 矩形的长与宽关系较密切,放在一起。 char_poi = str。 189。 42:不要使用难懂的技巧性很高的语句,除非很有必要时。 说明:高技巧语句不等于高效率的程序,实际上程序的效率关键在于算法。 示例:如下表达式,考虑不周就可能出问题,也较难理解。 * stat_poi ++ += 1。 * ++ stat_poi += 1。 应分别改为如下。 *stat_poi += 1。 stat_poi++。 // 此二语句功能相当于“ * stat_poi ++ += 1。 ” ++ stat_poi。 *stat_poi += 1。 // 此二语句功能相当于“ * ++ stat_poi += 1。 ” 软件编程规范总则 5 变量、结构 仅供内部使用 22 5 变量、结构 185。 51:去掉没必要的公共变量。 说明:公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度。 185。 52:仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。 说明:在对变量声明的同时,应对其含义、作用及取值范围进行注释说明,同时若有必要还应说明与其它变量的关系。 185。 53:明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等。 说明:明确过程操作变量的关系后,将有利于程序的进一步优化、单元测试、 系统联调以及代码维护等。 这种关系的说明可在注释或文档中描述。 示例:在源文件中,可按如下注释形式说明。 RELATION System_Init Input_Rec Print_Rec Stat_Score Student Create Modify Access Access Score Create Modify Access Access, Modify 注: RELATION为操作关 系; System_Init、 Input_Rec、 Print_Rec、 Stat_Score为四个不同的函数; Student、 Score为两个全局变量; Create表示创建, Modify表示修改, Access表示访问。 其中,函数 Input_Rec、 Stat_Score都可修改变量 Score,故此变量将引起函数间较大的耦合,并可能增加代码测试、维护的难度。 185。 54:当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。 说明:对公共变量赋值时,若有必要应进行合法性检查,以提高代码的可靠性、稳定 性。 185。 55:防止局部变量与公共变量同名。 说明:若使用了较好的命名规则,那么此问题可自动消除。 185。 56:严禁使用未经初始化的变量作为右值。 说明:特别是在 C/C++中引用未经赋值的指针,经常会引起系统崩溃。 软件编程规范总则 5 变量、结构 仅供内部使用 23 189。 51:构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共变量,防止多个不同模块或函数都可以修改、创建同一公共变量的现象。 说明:降低公共变量耦合度。 189。 52:使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系密切的变量。 说明:使用标准的数据类型,有利于程 序的移植。 示例:如下例子(在 DOS下 ),在移植时可能产生问题。 void main() { register int index。 // 寄存器变量 _AX = 0x4000。 // _AX 是 “伪变量” ... // program code } 189。 53:结构的功能要单一,是针对一种事务的抽象。 说明:设计结构时应力争使结构代表一种现实事务的抽象,而不是同时代表多种。 结构中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同 事务的元素放到同一结构中。 示例:如下结构不太清晰、合理。 typedef struct STUDENT_STRU { unsigned char name[8]。 /* student39。 s name */ unsigned char age。 /* student39。 s age */ unsigned char sex。 /* student39。 s sex, as follows */ /* 0 FEMALE。 1 MALE */ unsigned char teacher_name[8]。 /* the student teacher39。 s name */ unisgned char teacher_sex。 /* his teacher sex */ } STUDENT。 若改为如下,可能更合理些。 软件编程规范总则 5 变量、结构 仅供内部使用 24 typedef struct TEACHER_STRU { unsigned char name[8]。 /* teacher name */ unisgned char sex。 /* teacher sex, as follows */ /* 0 FEMALE。 1 MALE */ } TEACHER。 typedef struct STUDENT_STRU { unsigned char name[8]。 /* student39。 s name */ unsigned char age。 /* student39。 s age */ unsigned char sex。 /* student39。 s sex, as follows */ /* 0 FEMALE。 1 MALE */ unsigned int teacher_ind。 /* his teacher index */ } STUDENT。 189。 54:不要设计面面俱到、非常灵活的数据结构。 说明:面面俱到、灵活的数据结构反而容易引起误解和操作困难。 189。 55:不同结构间的关系不要过于复杂。 说明:若两个结构间关系较复杂、密切,那么应合为一个结构。 示例:如下两个结构的构造不合理。 typedef struct PERSON_ONE_STRU { unsigned char name[8]。 unsigned char addr[40]。 unsigned char sex。 unsigned char city[15]。 } PERSON_ONE。 typedef struct PERSON_TWO_STRU { unsigned char name[8]。 unsigned char age。 unsigned char tel。 } PERSON_TWO。 软件编程规范总则 5 变量、结构 仅供内部使用 25 由于两个结构都是描述同一事物的,那么不如合成一个结构。 typedef struct PERSON_STRU { unsigned char name[8]。 unsigned char age。 unsigned char sex。 unsigned char addr[40]。 unsigned char city[15]。 unsigned char tel。 } PERSON。 189。 56:结构中元素的个数应适中。 若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数。 说明:增加结构的可理解性、可操作性和可维护性。 示例:假如认为如上的 _PERSON结构元素过多,那么可如下对之划分。 typedef struct PERSON_BASE_INFO_STRU { unsigned char name[8]。 unsigned char age。 unsigned char sex。 } PERSON_BASE_INFO。 typedef stru。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。