软件编程规范
};
如果将a赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data = a.m_data。这将造成以下的错误:
1) b.m_data原有的内存没被释放,造成内存泄露;
2) b.m_data和a.m_data指向同一块内存,a或b任何一方变动都会影响另一方; 3) 在对象被析构时,m_data被释放了两次。
~ String(void); // 析构函数 String & operate =(const String &other); // 赋值函数 private: char *m_data; // 用于保存字符串
String a , b ;
建议6-5:尽量不使用与程序运行的环境相关的系统函数
示例:如strxfrm () 和strcoll () ,这两个函数依赖于 LC_COLLATE 的设置。如果进程所运行的环境变量没有与开发环境一样设置,可能会产生错误的结果
建议6-6:尽量不要编写依赖于其他函数内部实现的函数。
说明:此条为函数独立性的基本要求。由于目前大部分高级语言都是结构化的,所以通过具体语言的语法要求与编译器功能,基本就可以防止这种情况发生。但在汇编语言中,由于其灵活性,很可能使函数出现这种情况。
示例:如下是在DOS下TASM的汇编程序例子。过程Print_Msg的实现依赖于Input_Msg的具体实现,这种程序是非结构化的,难以维护、修改。
... // 程序代码
proc Print_Msg // 过程(函数)Print_Msg ... // 程序代码 jmp LABEL ... // 程序代码 endp
proc Input_Msg // 过程(函数)Input_Msg ... // 程序代码
软件编程规范
LABEL:
... // 程序代码 endp
规则6-3:检查函数所有参数与非参数的有效性。 说明:
1. 函数的输入主要有两种:一种是参数输入;另一种是全局变量、数据文件的输入,即
非参数输入。函数在使用输入之前,应进行必要的检查。 2. 不应该的入口情况要用ASSERT来确认
3. 有时候不处理也是一种处理,但要明确哪些情况不处理。try...catch 是一种常用的不处
理的处理手段
建议6-7:函数实现中不改变内容的参数要定义成const
示例: int GetStrLen(const char*);
int GetNumberCount(const CString&);
规则6-4:函数的返回值要清楚、明了,让使用者不容易忽视错误情况。
说明:函数的每种出错返回值的意义要清晰、明了、准确,防止使用者误用、理解错误或忽视错误返回码。
建议6-8:设计高扇入、合理扇出(小于7)的函数。
说明:
1. 扇出是指一个函数直接调用(控制)其它函数的数目,而扇入是指有多少上级函数调
用它。
2. 扇出过大,表明函数过分复杂,需要控制和协调过多的下级函数;而扇出过小,如总
是1,表明函数的调用层次可能过多,这样不利程序阅读和函数结构的分析,并且程序运行时会对系统资源如堆栈空间等造成压力。函数较合理的扇出(调度函数除外)通常是3-5。扇出太大,一般是由于缺乏中间层次,可适当增加中间层次的函数。扇出太小,可把下级函数进一步分解多个函数,或合并到上级函数中。当然分解或合并函数时,不能改变要实现的功能,也不能违背函数间的独立性。
3. 扇入越大,表明使用此函数的上级函数越多,这样的函数使用效率高,但不能违背函
数间的独立性而单纯地追求高扇入。公共模块中的函数及底层函数应该有较高的扇入。 4. 较良好的软件结构通常是顶层函数的扇出较高,中层函数的扇出较少,而底层函数则
扇入到公共模块中。
软件编程规范
规则6-5:减少函数本身或函数间的递归调用。
说明:递归调用特别是函数间的递归调用(如A->B->C->A),影响程序的可理解性;递归调用一般都占用较多的系统资源(如栈空间);递归调用对程序的测试有一定影响。故除非为某些算法或功能的实现方便,应减少没必要的递归调用。
软件编程规范
第七章 程序效率
规则7-1:在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。 说明:
1. 代码效率分为全局效率、局部效率、时间效率及空间效率。全局效率是站在整个系统
的角度上的系统效率;局部效率是站在模块或函数角度上的效率;时间效率是程序处理输入任务所需的时间长短;空间效率是程序所需内存空间,如机器代码空间大小、数据空间大小、栈空间大小等。
2. 不能一味地追求代码效率,而对软件的正确性、稳定性、可读性及可测性造成影响。 规则7-2:局部效率应为全局效率服务,不能因为提高局部效率而对全局效率造成影响。
建议7-1:通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。
说明:这种方式是解决软件空间效率的根本办法。
示例:如下记录学生学习成绩的结构不合理。
typedef unsigned char BYTE; typedef unsigned short WORD;
typedef struct STUDENT_SCORE_STRU
BYTE name[8]; BYTE age; BYTE sex; BYTE class; BYTE subject; float score; } STUDENT_SCORE;
因为每位学生都有多科学习成绩,故如上结构将占用较大空间。应如下改进(分为两个结
软件编程规范
构),总的存贮空间将变小,操作也变得更方便。 typedef struct STUDENT_STRU {
BYTE name[8]; BYTE age; BYTE sex; BYTE class; } STUDENT;
typedef struct STUDENT_SCORE_STRU {
WORD student_index; BYTE subject; float score; } STUDENT_SCORE; 规则7-3:循环体内工作量最小化。 说明:
1. 应仔细考虑循环体内的语句是否可以放在循环体之外,使循环体内工作量最小,从而
提高程序的时间效率。
2. 在多重循环中,应将最忙的循环放在最内层,这样可以减少CPU切入循环层的次数,
从而提高效率
示例:如下代码效率不高。
for (ind = 0; ind < MAX_ADD_NUMBER; ind++) {
sum += ind;
back_sum = sum; /* backup sum */ }
语句“back_sum = sum;”完全可以放在for语句之后,如下。 for (ind = 0; ind < MAX_ADD_NUMBER; ind++) {
sum += ind; }