软件编程规范(6)

2019-09-01 12:20

软件编程规范

};

如果将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; }


软件编程规范(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:工程热力学课后作业答案(第七章)第五版

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: