1、软件开发代码规范VC版软件开发代码规范(VC版)在团队协作开发的情况下,编程时应该强调的一个重要方面是程序的易读性,在保证软件的速度等性能指标能满足用户需求的情况下,能让其他程序员容易读懂你的程序。一套鲜明的编程风格,可以让协作者、后继者和自己一目了然,在很短的时间内看清程序的结构,理解设计的思路。大大的提高代码的可读性、可重用性、程序健壮性、可移植性和可维护性。 制定本编程规范的目的是为了提高软件开发效率及所开发的软件的可维护性,提高软件的质量。本规范基于VC开发语言,由程序风格、命名规则、注释规范、程序健壮性、可移植性、错误处理以及软件的模块化规范等部分组成。本规范主要适用于WINDOWS
2、平台相关代码编写,对于跨操作系统的标准C/C+代码规范,请参见软件开发代码规范(C/C+版)。一、程序风格:1、严格采用阶梯层次组织程序代码:各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行。要求相匹配的大括号在同一列,对继行则要求再缩进4格。例如: void main() . long lI; / 循环变量 long lSum; / 用来记录和 float fAvg; / 用来求平均值 . / 对数进行累加。 for( lI=0;lI=0)|(bIsReaded=TRUE)五、可移植性:1、高质量的代码要求能够跨平台,所以我们的代码应该考虑到对不同的平台的支持,特别是对
3、windows98和windowsnt的支持。 2、由于C语言的移植性比较好,所以对算法函数要求用C代码,不能用C+代码。 3、对不同的硬件与软件的函数要做不同的处理。六、错误处理:1、错误报告处理。编程中要求考虑函数的各种执行情况,尽可能处理所有的流程情况。将函数分为两类: 一类为与屏幕的显示无关,(不与用户交换信息的函数) 一类为与屏幕的显示相关。(与用户交换信息的函数)对于与屏幕显示无关的函数,函数通过返回值来报告错误。对于与屏幕显示有关的函数,函数要负责向用户发出警告,并进行错误处理。错误处理代码一般单独建立通用处理函数。如下: void cmDeal_With_Error(long
4、ErrCode) switch(ErrCode) case 1:/注释 . case 2:/注释 . default:/注释 . 2、尽早发现程序中的错误:1、 重视编译器中的警告信息。对于编译器产生的警告信息,我们应该引起足够的重视,实际上许多警告信息指示了程序中潜在的错误危险。所以我们要认真检查每一个警告信息,查看是否有某种隐患。尽量消除警告信息。2、 利用断言来检查错误对于程序中的某种假设,或防止某些参数的非法值,利用断言来帮助查错是一种好办法。 例如下面的函数: long cmMemCpy(void * pvToMem, void* pvFromMem, size_t wSize) i
5、f(pvToMem=NULL|pvFromMem=NULL) lResult=CM _POINT_IS_NULL;goto: END;while(wSize- 0) *pvToMem+=pvFromMem+;END:return lResult;采用判断可以检查传入的指针错误,但是这样的判断是程序最终的编译代码变大,同时降低了最终发布的程序的执行效率。由于传入空指针明显是调用这函数的程序的错误,而不是这个函数的错误,我们可以考虑采用断言来代替指针检查,即用ASSERT( pvToMem!=NULL&pvFromMem!=NULL)代替if(pvToMem=NULL|pvFromMem=NULL
6、) lResult=CM_POINT_IS_NULL;goto: END;这样只会在debug版中才会产生检查代码,而在正式发布版中不会带有这些代码。并且可以方便我们在程序调试中和测试时发现错误,同时又不影响程序的效率。 在下面的一些情况中必须加断言:a、 数的参数,特别是指针参数必须利用断言来进行确认。b、 利用断言检查程序中的各种假设的正确性。c、 在程序设计中不要轻易认为某种情况不可能发生,对你认为不可能发生的情况必须用断言来证实。为了使程序中的断言发挥作用,所有用于在开发内部进行测试或调试的动态库、执行程序、组件必须采用debug版。 说明:在程序效率要求较高、或者调用比较频繁的函数,
7、对入口参数的错误检查,使用断言方式,其优点如上所叙,但其健壮性不强,所以在其他情况下,仍要求使用传统的检查方式,以增强程序的健壮性,当然,为了调试方便,可同时使用断言方式。3、 严格的测试:对每一段代码都要求进行严格的测试,特别对一些功能函数要对其各种临界点(比如零值、无穷大的值等)进行测试。尽量做到每一段代码零错误。七、模块化规范:为了提高软件的重用性,减少重复开发的工作量。同时也为了提高程序的可读性,方便程序的维护,必须加强软件的模块化工作。模块化应该遵循以下几个基本规范:1、 函数应该作到精而小,函数的代码应该控制在一个适度的规模,每个函数的代码一般不能超过150行,如果超过这个规模,应
8、该进行模块化的工作。对于一些特殊的函数确实要超过150行,应该提交出来讨论,通过后,要求编写者更加详细的对函数注释,并写明函数超行的原因,以及设计思想等。2、 某一功能,如果重复实现三遍以上,既应该考虑模块化,将其写成通用函数。并向开发人员发布。并要求将接口文档和实现的功能备案。3、 每一个开发人员要尽可能的利用其他人的现成的模块,减少重复开发。4、 对函数进行模块化时,要考虑函数的层次关系,特别是在增加新的功能模块时,对原来的函数代码要进行认真的调整,做到相同功能的不同函数没有重复代码,此要求的目的在于便于代码维护。举例如下:现有如下函数:/从szFileName文件中取 .long . c
9、mGetSomething(const char * c_szFileName,.) CFile * pFile;/用来保存打开文件的地址 pFile=new CFile(c_szFileName,CFile:modeRead);/用创建一个只读文件if(pFile=NULL) lResult=CM_POINT_IS_NULL; goto END;/从文件中读取./关闭文件delete pFile; END:return lResult; 若现在需要增加如下接口的新函数: long . cmReadSomething(CFile * pFile) if(pFile=NULL) lResult=
10、CM_POINT_IS_NULL; goto END;/从文件中读取. . END:return lResult; 则要求如下: 将 long .cmGetSomething(const char * c_szFileName,.)改为 long . cmGetSomething (const char * c_szFileName,.)CFile * pFile; /用来保存打开文件的地址long lResult=CM_OK;/错误返回码/打开文件pFile=new CFile(c_szFileName,CFile:modeRead);if(pFile=NULL) lResult=CM_PO
11、INT_IS_NULL; goto END;/从文件中读取.lResult=cmReadSomething(pFile,.);IF_ERROR_GOTO_END/关闭文件delete pFile;END:return lResult;模块化的一些注意事项:1 、设计好模块接口,用面向对象的观点看,包括:函数接口和变量接口。2 、定义好接口以后不要轻易改动,并在模块开头(文件的开头或函数的开头)加以说明,所以在定义接口时,一定要反复琢磨,保持风格一致。3 、注意全局变量也是一种接口,如果不是确实必要,应该尽量少用全局变量。4 、在函数接口中,尽量使函数的接口容易理解和使用,其中每个输入输出参数都
12、只代表一种类型数据,不要把错误值和其他专用值混在函数的其他输入输出参数中。5 、争取编写出永远成功的函数,使调用者不必进行相应的错误处理。八、类(class)的规范化1.类成员声明按以下顺序排列 成员函数 public: 构造函数 析构函数 protected: private: 成员变量 public: protected: private:其中,成员变量(命名规则按上述规定,不同之处在前面加“m_”),成员函数的住释以及自动提取标识的位置与前面的规定相同。2.应尽量避免在一个实现文件中实现多个类,如果确有必要,则每一个类的实现成员应放在一起;3. 禁止在类定义里面实现成员函数,只允许定义.哪怕只有函数实现只有一句话也要放到外面实现,以避免在自动提取开发手册出现问题.4. 对于类的成员函数的说明按照MSDN的方式,比如:重载的成员函数放在一起进行参数说明,成员函数的命名规则也参照MSDN等等,加标识可以按如下,可选参数加:.5.类定义的缩进规则按VC缺省的缩进规则.6.在一个类或结构的前面应有一
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1