当前位置:文档之家› 软件开发命名规范

软件开发命名规范

软件开发命名规范
软件开发命名规范

软件开发规范

C++命名规范

在研究项目团队协作开发的情况下(这里的团队协作也适合于应用项目的开发),编程时应该强调的一个重要方面是程序的易读性,在保证软件速度等性能指标能满足用户需求的情况下,能让其他程序员容易读懂你所编写的程序。若研究项目小组的所有开发人员都遵循统一的、鲜明的一套编程风格,可以让协作者、后继者和自己一目了然,在很短的时间内看清楚程序结构,理解设计的思路,大大提高代码的可读性、可重用性、程序健壮性、可移植性、可维护性。

制定本编程规范的目的是为了提高软件开发效率及所开发软件的可维护性,提高软件的质量。本规范由程序风格、命名规范、注释规范、程序健壮性、可移植性、错误处理以及软件的模块化规范等部分组成。

本软件开发规范适合讨论C/C++程序设计。

1 文件结构

每个C++/C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。

C++/C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀,C++程序的定义文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。

1.1 文件信息声明

文件信息声明位于头文件和定义文件的开头(参见示例1-1),主要内容有:

(1)版权信息;

(2)文件名称,项目代码,摘要,参考文献;

(3)当前版本号,作者/修改者,完成日期;

(4)版本历史信息;

(5)主要函数描述。

☆【规则1.1-1】文件信息声明以两行斜杠开始,以两行斜杠结束,每一行都以两个斜杠开始;

☆【规则1.1-2】文件信息声明包含五个部分,各部分之间以一空行间隔;

☆【规则1.1-3】在主要函数部分描述了文件所包含的主要函数的声明信息,如果是头文件,这一部分是可以省略的。

1.2 头文件的结构

头文件由三部分内容组成:

(1)头文件开头处的文件信息声明(参见示例1-1);

(2)预处理块;

(3)函数和类结构声明等。

假设头文件名称为 filesystem.h,头文件的结构参见示例1-2。

☆【规则1.2-1】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块;“#ifndef”或者“#define”后以TAB键代替SPACE键做空格;如果头文件名称是由多个单词组成,则各单词

间以下划线“_”连接,例如有头文件名称为“filesystem.h”,则定义如下:“#ifndef _FILE_SYSTEM_H_”;

☆【规则1.2-2】用#include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索);

☆【规则1.2-3】用#include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索);

☆【建议1.2-1】头文件中只存放“声明”而不存放“定义”;

☆【建议1.2-1】头文件中应包含所有定义文件所定义的函数声明,如果一个头文件对应多个定义文件,则不同定义文件内实现的函数要分开声明,并作注释以解释所声明的函数从属于那一个定义文件;☆【建议1.2-3】宏定义和函数声明分离,在两个头文件中定义,如果没有类成员函数,可以将类和结构的定义与函数声明分离,也就是说一个头文件专用于宏定义,一个头文件专用于类和结构的定义,一

个头文件专用于函数声明;

☆【建议1.2-4】在C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。建议将成员函数的定义与声明分开,

不论该函数体有多么小。

头文件的结构如下:

1.3 定义文件的结构

定义文件有三部分内容:

(1)定义文件开头处的文件信息声明(参见示例1-1);

(2)对一些头文件的引用;

(3)程序的实现体(包括数据和代码)。

1.4 头文件的作用

早期的编程语言如Basic、Fortran没有头文件的概念,C++/C语言的初学者虽然会用使用头文件,但常常不明其理。这里对头文件的作用略作解释:

(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码;

(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

1.5 目录结构

如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别保存于不同的目录,以便于维

例如可将头文件保存于include目录,将定义文件保存于source目录(可以是多级目录)。

如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。

2 命名规则

比较著名的命名规则当推“匈牙利”命名法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。

“匈牙利”法最大的缺点是烦琐,例如

int i, j, k;

float x, y, z;

倘若采用“匈牙利”命名规则,则应当写成

int iI, iJ, ik; // 前缀 i表示int类型

float fX, fY, fZ; // 前缀 f表示float类型

如此烦琐的程序会让绝大多数程序员无法忍受。

总的说来,没有一种命名规则可以让所有的程序员赞同,且命名规则对软件产品而言并不是“成败悠关”的事,而且在不同的平台和不同的环境下编写的程序所应遵循的规则也不尽相同,所以我们只是追求制定一种令大多数项目成员满意的命名规则,并在项目中贯彻实施。

2.1 共性原则

本节论述的共性规则是被大多数程序员采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则,如2.2节

☆【规则2.1-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”;

☆【规则2.1-2】标识符的长度应当符合“min-length && max-information”原则;

☆【规则2.1-3】命名规则尽量与所采用的操作系统或开发工具的风格保持一致;

☆【规则2.1-4】程序中不要出现仅靠大小写区分的相似的标识符。

☆【规则2.1-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解;

☆【规则2.1-6】变量的名字应当使用“名词”或者“形容词+名词”;

☆【规则2.1-7】全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组);

☆【规则2.1-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等;

☆【建议2.1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号;

注:

2.1.1标识符最好采用英文单词或其组合,便于记忆和阅读,切忌使用汉语拼音来命名,程序中的英文单词一般不

要太复杂,用词应当准确,例如不要把CurrentValue写成NowValue;

2.1.2标示符的长度应当以最小的长度实现最多信息,一般来说,长名字能更好地表达含义,但并非长的变量名就

一定要比短的变量名要好,此外单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们通常可用作函数内的局部变量;

2.1.3不同的操作系统的程序设计风格是不一样的,例如Windows应用程序的标识符通常采用“大小写”混排的方

式,如AddChild,而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child,别把这两类风格混在一起使用;

2.2 Windows变量命名规则

☆【规则2.2-1】变量的命名规则要求采用“匈牙利法则”,即开头字母用变量的类型,其余部分用变量的英文意思或其英文意思的缩写,尽量避免采用中文拼音,要求单词的第一个字母大写;

即:变量名=变量类型+变量英文意思(或缩写)

变量类型请参见附表1-变量类型表;

☆【规则2.2-2】类名和函数名用大写字母开头的单词组合而成;对struct、union、class变量的命名要求定义的类型用大写,结构采用S开头,联合体采用U开头,类采用C开头;

例如:

struct SPoint

{

int m_nX;

int m_nY;

};

union URecordLen

{

BYTE m_byRecordNum;

BYTE m_byRecordLen;

}

class CNode

{

//类成员变量或成员函数

};

☆【规则2.2-3】指针变量命名的基本原则为:

一重指针变量的基本原则为:

变量名=“p”+变量类型前缀+命名

对多重指针变量的基本原则为:

二重指针:

变量名=“pp”+变量类型前缀+命名

三重指针:

变量名=“ppp”+变量类型前缀+命名

......

例如一个short*型的变量应该表示为pnStart;

☆【规则2.2-4】全局变量用g_开头;例如一个全局的长型变量定义为g_lFileNum,

即:变量名=g_+变量类型+变量的英文意思(或缩写);

☆【规则2.2-5】静态变量采用s_开头;例如一个静态的指针变量定义为s_plPrevInst,

即:变量名=s_+变量类型+变量的英文意思(或缩写);

☆【规则2.2-6】类成员变量采用m_开头;例如一个长型成员变量定义为m_lCount,

即:变量名=m_+变量类型+变量的英文意思(或缩写);

☆【规则2.2-7】对const的变量要求在变量的命名规则前加入c_(若作为函数的输入参数,可以不加),

即:变量名=c_+变量命名规则,例如:

const char* c_szFileName;

☆【规则2.2-8】对枚举类型(enum)中的变量,要求用枚举变量或其缩写做前缀,且用下划线隔离变量名,所有枚举类型都要用大写,例如:

enum EMDAYS

{

EMDAYS_MONDAY;

EMDAYS_TUESDAY;

......

};

☆【规则2.2-9】对常量(包括错误的编码)命名,要求常量名用大写,常量名用英文意思表示其意思,用下划线分割单词,例如:

#define CM_7816_OK 0x9000;

☆【规则2.2-10】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL的所有库函数均以gl开头,所有常量(或宏定义)

均以GL开头。

3 程序风格

程序风格虽然不会影响程序的功能,但会影响程序的可读性,追求清晰、美观,是程序风格的重要构成因素。

3.1 空行

空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。

☆ 【规则3.1-1】 在每个类声明之后、每个函数定义结束之后都要加空行。参见示例3.1(a); ☆ 【规则3.1-2】 在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。参见示例

3.1(b);

3.2 代码行

☆ 【规则3.2-1】 一行代码只做一件事情,如只定义一个变量,或只写一条语句,这样的代码容易阅读,并且方便于写注释;

☆ 【规则3.2-2】 if 、for

、while 、do 等语句自占一行,执行语句不得紧跟其后,不论执行语句有多少都要加{},这样可以防止书写失误;

☆ 【规则3.2-3】 if 、for 、while 、do 等语句的“{”要单独占用一行; ☆ 【建议3.2-1】 所有函数内的变量都在函数开始处定义;

☆ 【建议3.2-2】

尽可能在定义变量的同时初始化该变量(就近原则),如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用了未被初始化的变量,可能会导致程序错误,本建议可以减少隐患。

示例3.2(a)为风格良好的代码行,示例3.2(b)为风格不良的代码行。

3.3 代码行内的空格

☆【规则3.3-1】关键字之后要留空格,象const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字,象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字;☆【规则3.3-2】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别;

☆【规则3.3-3】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格;

☆【规则3.3-4】‘,’之后要留空格,如Function(x, y, z),如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition; update);

☆【规则3.3-5】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格;

☆【规则3.3-6】一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格;

☆【规则3.3-7】象“[]”、“.”、“->”这类操作符前后不加空格;

☆【建议3.3-1】对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0;

i<10; i++)和if ((a<=b) && (c<=d))

3.4 对齐

☆【规则3.4-1】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐;

☆【规则3.4-2】{ }之内的代码块在‘{’右边数格处左对齐;

☆【规则3.4.3】代码的的对齐采用TAB键而不采用空格键对齐,一般TAB键设置为向后空4个空格。

示例3.4(a)为风格良好的对齐,示例3.4(b)为风格不良的对齐。

3.5 长行拆分

☆【规则3.5-1】代码行最大长度宜控制在70至80个字符以内;

☆【规则3.5-2】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符),拆分出的新行要进行适当的缩进,使排版整齐,语句可读。

3.6 修饰符的位置

修饰符* 和&应该靠近数据类型还是该靠近变量名,是个有争议的活题,若将修饰符 * 靠近数据类型,例如:int* x; 从语义上讲此写法比较直观,即x是int 类型的指针,上述写法的弊端是容易引起误解,例如:int* x, y; 此处y容易被误解为指针变量。虽然将x和y分行定义可以避免误解,但并不是人人都愿意这样做。

☆【规则3.6-1】应当将修饰符* 和&紧靠变量名;

3.7 注释

C语言的注释符为“/*…*/”。C++语言中,程序块的注释常采用“/*…*/”,行注释一般采用“//…”。注释通常用于:

(1)版本、版权声明;

(2)函数接口说明;

(3)重要的代码行或段落提示。

虽然注释有助于理解代码,但注意不可过多地使用注释。参见示例3.7。

☆【规则3.7-1】注释是对代码的“提示”,而不是文档,程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱,注释的花样要少;

☆【规则3.7-2】如果代码本来就是清楚的,则不必加注释;例如

i++; // i 加 1,多余的注释

☆【规则3.7-3】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性,不再有用的注释要删除;

☆【规则3.7-4】注释应当准确、易懂,防止注释有二义性,错误的注释不但无益反而有害;

☆【规则3.7-5】尽量避免在注释中使用缩写,特别是不常用缩写;

☆【规则3.7-6】注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方;

☆【规则3.7-8】当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读;

☆【建议3.7-1】对于多行代码的注释,尽量不采用“/*...*/”,而采用多行“//”注释,这样虽然麻烦,但是在做屏蔽调试时不用查找配对的“/*...*/”。

示例3.7 程序的注释

3.7.1 文件头的注释

文件头的注释请参见1.1,文件头的注释是以两行斜杠开始,以两行斜杠结束(以区别于函数的注释)。

3.7.2 函数头的注释

一般说来每个函数都应该做详细的注释,函数头的注释是以一行斜杠开始,以一行斜杠结束,注释的内容包括“功能”,“参数”,“返回值”,“设计思想”,“调用函数”,“日期”,“修改记录”等几个方面,函数头的注释格式如下:

4 函数设计

函数是C++/C 程序的基本功能单元,其重要性不言而喻。函数设计的细微缺点很容易导致该函数被错用,所以光使函数的功能正确是不够的。本章重点论述函数的接口设计和内部实现的一些规则。

函数接口的两个要素是参数和返回值。C 语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value )和指针传递(pass by pointer )。C++ 语言中多了引用传递(pass by reference )。由于引用传递的性质象指针传递,而使用方式却象值传递,初学者常常迷惑不解,容易引起混乱,请先阅读6.6节“引用与指针的比较”。

4.1 参数的规则

☆ 【规则4.1-1】

参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字,如果函数没有参数,则用

void 填充;例如:

void SetValue(int nWidth, int nHeight); // 良好的风格 void SetValue(int, int); // 不良的风格 float GetValue(void); // 良好的风格 float GetValue(); // 不良的风格 ☆ 【规则4.1-2】

参数命名要恰当,顺序要合理;

例如编写字符串拷贝函数StringCopy ,它有两个参数,如果把参数 名字起为str1和str2,例如:

void StringCopy(char *str1, char *str2);

那么我们很难搞清楚究竟是把str1拷贝到str2中,还是刚好倒过来,可以把参数名字起得更有意义,如叫strSource 和strDestination 。这样从名字上就可以看出应该把strSource 拷贝到strDestination 。还有一个问题,这两个参数那一个该在前那一个该在后?参数的顺序要遵循程

序员的习惯。一般地,应将目的参数放在前面,源参数放在后面。如果将函数声明为:

void StringCopy(char *strSource, char *strDestination);

别人在使用时可能会不假思索地写成如下形式:

char str[20];

StringCopy(str, “Hello World”); // 参数顺序颠倒

☆【规则4.1-3】如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。

例如:

void StringCopy(char *strDestination,const char *strSource);

☆【规则4.1-4】如果输入参数以值传递的方式传递对象,则宜改用“const &”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率;

☆【建议4.1-1】避免函数有太多的参数,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型或顺序搞错;

☆【建议4.1-2】尽量不要使用类型和数目不确定的参数;

C标准库函数printf是采用不确定参数的典型代表,其原型为:

int printf(const chat *format[, argument]…);

这种风格的函数在编译时丧失了严格的类型安全检查。

4.2 返回值的规则

☆【规则4.2-1】不要省略返回值的类型;

C语言中,凡不加类型说明的函数,一律自动按整型处理,这样做不会有什么好处,却容易被

误解为void类型;

C++语言有很严格的类型安全检查,不允许上述情况发生。由于C++程序可以调用C函数,为

了避免混乱,规定任何C++/ C函数都必须有类型。如果函数没有返回值,那么应声明为void

类型

☆【规则4.2-2】函数名字与返回值类型在语义上不可冲突;

违反这条规则的典型代表是C标准库函数getchar。

例如:

char c;

c = getchar();

if (c == EOF)

按照getchar名字的意思,将变量c声明为char类型是很自然的事情。但不幸的是getchar的确

不是char类型,而是int类型,其原型如下:

int getchar(void);

由于c是char类型,取值范围是[-128,127],如果宏EOF的值在char的取值范围之外,那么

if语句将总是失败,这种“危险”人们一般哪里料得到!导致本例错误的责任并不在用户,是

函数getchar误导了使用者

☆【规则4.2-3】不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回;

☆【建议4.2-1】有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值;

例如字符串拷贝函数strcpy的原型:

char *strcpy(char *strDest,const char *strSrc);

strcpy函数将strSrc拷贝至输出参数strDest中,同时函数的返回值又是strDest。这样做并非多

此一举,可以获得如下灵活性:

char str[20];

int nLength = strlen( strcpy(str, “Hello World”) );

☆【建议4.2-2】如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出错;

对于建议4.2-2,如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率,而有些场合只能用“值传递”而不能用“引用传递”,否则会出错,例如:

class String

{…

// 赋值函数

String & operate=(const String &other);

// 相加函数,如果没有friend修饰则只许有一个右侧参数

friend String operate+( const String &s1, const String &s2);

private:

char *m_data;

};

String的赋值函数operate = 的实现如下:

String & String::operate=(const String &other)

{

if (this == &other)

return *this;

delete m_data;

m_data = new char[strlen(other.data)+1];

strcpy(m_data, other.data);

return *this; // 返回的是 *this的引用,无需拷贝过程

}

对于赋值函数,应当用“引用传递”的方式返回String对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把 *this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。例如:

String a,b,c;

a = b; // 如果用“值传递”,将产生一次 *this 拷贝

a =

b = c; // 如果用“值传递”,将产生两次 *this 拷贝

String的相加函数operate + 的实现如下:

String operate+(const String &s1, const String &s2)

{

String temp;

delete temp.data; // temp.data是仅含‘\0’的字符串

temp.data = new char[strlen(s1.data) + strlen(s2.data) +1];

strcpy(temp.data, s1.data);

strcat(temp.data, s2.data);

return temp;

}

对于相加函数,应当用“值传递”的方式返回String对象。如果改用“引用传递”,那么函数返回值是一个指向局部对象temp的“引用”。由于temp在函数结束时被自动销毁,将导致返回的“引用”无效。例如:

c = a + b;

此时 a + b 并不返回期望值,c什么也得不到,流下了隐患。

4.3 函数内部实现的规则

不同功能的函数其内部实现各不相同,看起来似乎无法就“内部实现”达成一致的观点。但根据经验,我们可以在函数体的“入口处”和“出口处”从严把关,从而提高函数的质量。

☆【规则4.3-1】在函数体的“入口处”,对参数的有效性进行检查;

很多程序错误是由非法参数引起的,我们应该充分理解并正确使用“断言”(assert)来防止此

类错误。详见4.5节“使用断言”

☆【规则4.3-2】在函数体的“出口处”,对return语句的正确性和效率进行检查;

注意事项如下:

(1)return语句不可返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁,例如:

char * Func(void)

{

char str[] = “hello world”; // str的内存位于栈上

return str; // 将导致错误

}

(2)要搞清楚返回的究竟是“值”、“指针”还是“引用”;

(3)如果函数返回值是一个对象,要考虑return语句的效率,例如:

return String(s1 + s2);

这是临时对象的语法,表示“创建一个临时对象并返回它”,不要以为它与“先创建一个局部对象temp并返回它的结果”是等价的,如

String temp(s1 + s2);

return temp;

实质不然,上述代码将发生三件事。

首先,temp对象被创建,同时完成初始化;

然后拷贝构造函数把temp拷贝到保存返回值的外部存储单元中;

最后,temp在函数结束时被销毁(调用析构函数)。

然而“创建一个临时对象并返回它”的过程是不同的,编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率。

类似地,我们不要将

return int(x + y); // 创建一个临时变量并返回它

写成

int temp = x + y;

return temp;

由于内部数据类型如int,float,double的变量不存在构造函数与析构函数,虽然该“临时变量的语法”不会提高多少效率,但是程序更加简洁易读。

4.4 其它建议

☆【建议4.4-1】函数的功能要单一,不要设计多用途的函数;

☆【建议4.4-2】函数体的规模要小,尽量控制在150行代码之内;

☆【建议4.4-3】尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。这样的函数既不易理解

又不利于测试和维护。在C/C++语言中,函数的static局部变量是函数的“记忆”存储器。建

议尽量少用static局部变量,除非必需。

☆【建议4.4-4】不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内的变量的有效性,例如全局变量、文件句柄等;

☆【建议4.4-5】用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。

4.5 使用断言

程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用。

断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。示例4.5是一个内存复制函数。在运行过程中,如果assert的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。

assert不是一个仓促拼凑起来的宏。为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。所以assert不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。如果程序在assert处终止了,并不是说含有该assert的函数有错误,而是调用者出了差错,assert可以帮助我们找到发生错误的原因。

☆【规则4.5-1】使用断言捕捉不应该发生的非法情况,不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的;

☆【规则4.5-2】在函数的入口处,使用断言检查参数的有效性(合法性);

☆【建议4.5-1】在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查;

☆【建议4.5-2】一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

4.6 引用与指针的比较

引用是C++中的概念,初学者容易把引用和指针混淆一起。一下程序中,n是m的一个引用(reference),m是被引用物(referent)。

int m;

int &n = m;

n相当于m的别名(绰号),对n的任何操作就是对m的操作。所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。

引用的一些规则如下:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化);

(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL);

(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

以下示例程序中,k被初始化为i的引用。语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。由于k是i的引用,所以i的值也变成了6。

int i = 5;

int j = 6;

int &k = i;

k = j; // k和i的值都变成了6;

上面的程序看起来象在玩文字游戏,没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

以下是“值传递”的示例程序。由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n, 所以n的值仍然是0。

void Func1(int x)

{

x = x + 10;

}

int n = 0;

Func1(n);

cout << “n = ” << n << endl; // n = 0

以下是“指针传递”的示例程序。由于Func2函数体内的x是指向外部变量n的指针,改变该指针的内容将导致n 的值改变,所以n的值成为10。

void Func2(int *x)

{

(* x) = (* x) + 10;

}

int n = 0;

Func2(&n);

cout << “n = ” << n << endl; // n = 10

以下是“引用传递”的示例程序。由于Func3函数体内的x是外部变量n的引用,x和n是同一个东西,改变x

等于改变n,所以n的值成为10。

void Func3(int &x)

{

x = x + 10;

}

int n = 0;

Func3(n);

cout << “n = ” << n << endl; // n = 10

对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。

5 附录

5.1 变量类型定义

C#命名规范

大家都知道写程序应该有个好的命名规范,为了工作方便,贴出来。

1 https://www.doczj.com/doc/807062737.html, 命名规范

2 WinForm Control 命名规范

3 WebControl 命名规范

软件开发过程管理规范

软件开发过程管理规范文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]

0 引言 如果要提高软件开发人员的开发质量,必须有相应的考核制度,有了制度后才能推动开发人员想方设法改善自已的开发质量。目前研发对软件开发的过程缺乏细粒度的度量,所以不能依据有效的度量数据来考核开发人员的工作绩效,大部份只是凭考核人主观意志来考核,不能形成对被考核人有效的说服力。此绩效考核办法旨在结合实际情况合理客观地评价开发效率和质量。 1 目的 对软件开发的过程所产生的软件项的质量和过程进行定量的评价,用评价的结果指导软件的开发过程,不断地提高软件开发质量水平,并依据度量记录来考核软件开发人员的工作绩效。 2 软件项包括 1)技术文档:主要包括:可行性分析报告、需求分析报告、软件功能规格说明、开发计划、系统设计报告、测试文档、用户手册、总结报告等; 2)计算机程序。 3 度量数据的来源 1)项目计划; 2)评审报告; 3)测试报告; 4)问题报告; 5)软件维护记录; 4 质量度量

4.1 度量指标 主要根据各类软件项检查表的检查指标来确定,例如,软件需求规格说明书检查表(见附录1),有10个检查指标,则根据具体项目检查侧重点不同,可从中选择相应的检查指标作为度量指标。 4.2 质量等级 1)软件项的质量等级的确定根据度量综合指标进行。 2)度量综合指标计算公式为:Total = ∑QiMi。 3)其中i=1,2,...n代表指标数量; 4)Q代表度量的指标; 5)M代表度量的指标Q在整个指标体系中所占的权重系数,对不同的开发项目可能不同,此系数根据开发的不同着重点给出。 度量指标权重系数表: 序号指标权重 1 指标1 权数1 2 指标2 权数2 3 指标3 权数3 4 指标4 权数4 5 指标5 权数5 加权平均分 1.0 6)质量评价:一般地,根据度量综合指标值,有以下评分标准。 质量评价计分标准表 序号得分质量评价

软件系统命名规则(互联网+)

1、目的 本指导书是为软件配置管理而制定。其目的是使公司软件产品配置标识的命名规范化。 2、适用范围 适用于本公司所有软件产品的配置管理。 3、职责 4、控制内容 4.1、软件配置标识的组成 4.1.1、软件提供给用户的阶段产品和最终产品的配置标识由公司代码QW和以下五 部分组成。 a、产品类别代码 b、产品(项目)标识或子系统标识 c、配置项标识 d、版本号 其一般形式为:QWa-bbbb-cc-dd 4.1.2、软件开发过程中产生仅供公司或项目内部使用的配置项,其配置标识的一 般形 式为:bbcccccc-dd,其中,bb为产品(项目)标识缩写,cccccc为配置项标识,dd为版本号。 4.2、部门代码 部门代码按《体系文件编号规定》4.3条的规定控制。 4.3、产品(项目)标识及其缩写 产品(项目)标识由反映产品或项目名称的4~5位拼音字母组成,前2位字母为其缩写。如DHMIS是杭州大和热磁电子有限公司管理信息系统的项目标识,而DH则为其缩写。 4.4、子系统标识 子系统标识由2位产品(项目)标识缩写和2~3位子系统名拼音字母组成,其中第3、4两位为子系统标识缩写。如DHXS是大和项目销售子系统的标识,而XS是其缩写。 4.5、配置项标识 4.5.1、4.1.1所述配置标识中的配置项标示:识(cc)如下表所 配置项标识(cc) 系统规格说明书FB 项目开发计划DP 软件需求规格说明书RS 概要设计说明书PD

详细设计说明书DD 用户手册UM 操作手册OM 源程序SP 4.5.2、4.1.2所述配置标识中的配置项标识(cccccc)有以下情况: a、配置项为数据项:配置标识由2位全局标识SY或子系统标识缩 写(局部数据)和3位数字码组成。 如SY001为001号全局数据的配置项标识 XS031为销售子系统031号数据的配置项标识。 b、配置项为数据流: 配置项标识由2位子系统标识缩写,2位数据流标识DF和2位数字码组成。 如ZCDF02为资财子系统02号数据流的配置项标识。 c、配置项为数据存储结构: 配置项标识由2位子系统标识缩写,2位数据存储标识DB和2位数字码组成。 如ZZDB01为制造子系统01号数据存储结构的配置项标识。 d、配置项为程序模块: 配置项标识由2位子系统标识缩写,程序模块标识M和2~3位数字码组成。 如XSM101为销售子系统101号程序模块的配置项标识。 e、配置项为存储媒体 配置项标识由2位产品(项目)标识缩写或子系统标识缩写,2位存储媒体标识FD(软盘)、HD(硬盘)、CD(光盘)或TY(磁带)和2 位数字码组成。 如ZZFD03为制造子系统的03号软盘。 f、配置项为测试计划 配置项标识由2位产品(项目)标识缩写或子系统标识缩写,2位测试计划类别标识和2位数字码组成,其中,组装测试计划类别标识为 TP,确认测试计划类别标识为VP。 数字码00表示产品(项目)或子系统的测试计划,其它数字则表示某一号分计划。 如DHVP00为大和项目确认测试计划的配置项标识。 XSTP01为销售子系统01号测试计划的配置项标识。 4.6、版本号 版本号由2位数字码组成。

华为软件开发规范

软件开发规范 1 排版 1-1:程序块要采用缩进风格编写,缩进的空格数为4个。 说明:对于由开发工具自动生成的代码可以有不一致。 1-2:相对独立的程序块之间、变量说明之后必须加空行。 示例:如下例子不符合规范。 if (!valid_ni(ni)) { ... epssn_index; repssn_ni = ssn_data[index].ni; 应如下书写 if (!valid_ni(ni)) { ... epssn_index; repssn_ni = ssn_data[index].ni; 1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。 示例: = NO7_TO_STAT_PERM_COUNT_LEN + STAT_SIZE_PER_FRAM * sizeof( _UL ); act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied = stat_poi[index].occupied; act_task_table[taskno].duration_true_or_false = SYS_get_sccp_statistic_state( stat_item ); report_or_not_flag = ((taskno < MAX_ACT_TASK_NUMBER) && (n7stat_stat_item_valid (stat_item)) && (act_task_table[taskno].result_data != 0));

软件开发过程规范

【最新资料,Word版,可自由编辑!】

目录 1.前言 (3) 1.1 目的 (3) 1.2 对象 (3) 1.3 要求 (3) 1.4 适用范围 (3) 1.5 软件开发过程模型 (3) 1.6 开发过程划分 (4) 2.技术过程规范部分 (4) 2.1 概述 (4) 2.2 业务建模阶段 (4) 2.3 需求阶段 (6) 2.4 分析设计阶段 (8) 2.5 实现阶段 (10) 3.管理过程规范部分 (11) 3.1 概述 (11) 3.2 接受项目 (12) 3.3 重新评估项目范围和风险(对于较大项目) (12) 3.4 制定开发计划 (13) 3.5 迭代开发管理 (13) 3.6 监控项目的实施 (14) 3.7 结束项目 (15)

软件开发过程规范 前言 目的 本规范的目的是使整个软件产品开发及项目工程阶段清晰,要求明确,任务具体,便于规范化、系统化及工程化。有利于提高软件生命周期的控制及管理,提高所开发软件的质量,缩短开发时间,减少开发和维护费用,使软件开发活动更科学、更有成效。 对象 本规范面向产品生命周期的所有相关人员,包括管理人员、开发人员、质管人员。 要求 具有软件开发管理职能的人员要求熟知项目开发的各阶段过程和各阶段过程相应的规范。 适用范围 适用于产品开发生命周期中的除产品提交外的其他全部过程;规范分为两部分:技术过程规范和管理过程规范,分别适用于软件开发过程中的技术性活动和管理性活动。 软件开发过程模型 本规范所采用的软件开发过程模型为简化的RUP开发过程模型;软件开发过程是体系结构为中心,用例驱动和风险驱动相结合的过程迭代。

软件项目版本号的命名规则及格式2016

软件项目版本号的命名规则及格式 版本控制比较普遍的3 种命名格式: 一、GNU 风格的版本号命名格式: 主版本号 . 子版本号[. 修正版本号[. 编译版本号]] Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Nu mber]] 示例: 1.2.1, 2.0, 5.0.0 build-13124 二、Windows 风格的版本号命名格式: 主版本号 . 子版本号[ 修正版本号[. 编译版本号]] Major_Version_Number.Minor_Version_Number[Revision_Number[.Build_Nu mber]] 示例: 1.21, 2.0 三、.Net Framework 风格的版本号命名格式: 主版本号.子版本号[.编译版本号[.修正版本号]] Major_Version_Number.Minor_Version_Number[.Build_Number[.Revision_Nu mber]] 版本号由二至四个部分组成:主版本号、次版本号、内部版本号和修订号。主版本号和次版本号是必选的;内部版本号和修订号是可选的,但是如果定义了修订号部分,则内部版本号就是必选的。所有定义的部分都必须是大于或等于0 的整数。 应根据下面的约定使用这些部分: Major :具有相同名称但不同主版本号的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。 Minor :如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。 Build :内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。 Revision :名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。 程序集的只有内部版本号或修订号不同的后续版本被认为是先前版本的修补程序(Hotfix) 更新。 版本号管理策略 一、GNU 风格的版本号管理策略:

软件开发规范标准整体规范标准

软件开发规范 Software Development Specification Version: V1.0 Date: 2010-06-22 Prepared by

Document Revision History文档修订记录

Table of Contents目录 1Introduction 简介5 1.1Purpose 目标5 1.2Scope 范围6 1.3Definitions, Acronyms, and Abbreviations. 术语,缩略词6 1.4References 引用7 1.5Overview 文档组织7 2The Overall Description 概述8 2.1Software Development Organizing 开发团队组织结构8 2.2Project Base Process 项目基本流程9 2.3CMM Base Process CMM基本过程10 2.3.1SCM软件配置管理10 2.3.2SPP 计划策划12 2.3.3SPTO项目追踪16 2.3.4PR同行评审18 2.3.5SQA质量保证19 2.4SDLC 生命周期选择20 2.5Development Process 开发过程21 2.5.1Development Phase 开发阶段21 2.5.2Phase Product 阶段制品22 2.6Role Duty 角色职责23 2.7Constraints 限制24 3Specific Requirements 详细描述25 3.1Precondition 前提25 3.1.1SCM配置库25 3.1.2Test Environment 测试环境26 3.2Development Control Process 开发控制流程26 3.2.1项目启动和策划阶段27 3.2.2需求分析、设计、编码阶段27 3.2.3提交测试阶段27 3.2.4生产发布、终测28 3.2.5发布后问题反馈修改过程28 3.3TSP 团队软件过程30 3.3.1会议组织30 3.3.2沟通问题30 3.3.3代码走查30

软件开发流程管理制度

软件开发流程管理制度 (讨论稿) 为加强对定制软件开发工作管理,缩短开发周期,提高软件开发质量,降低开发成本,提高定开发效率和效益,特制定软件开发流程管理制度。 第一章、总则 为保证日常工作正常有序的进行,让开发中各个环境更紧凑,更可控,需要尽可能实现项目管理的正规化,工作过程的流程化,以便提高软件质量,按期交付。 1、软件开发总体遵循项目管理和软件工程的基本原则。 2、项目管理涉及项目立项、项目计划和监控、配置管理。 3、软件工程涉及需求分析、系统设计、软件实现、系统测试、用户测试、试运行、系统验收、系统上线和数据迁移、产品维护。 第二章、阶段成果 根据软件工程的过程,制定以下工作流程,并规定了各个重要环节需要提交的交付物。各阶段需提交的文档: 1、立项:项目申请表,软件需求报告或设计方案。 2、需求分析:项目研发主计划、需求规格说明书 3、总体设计:概要设计说明书或功能模块描述 4、详细设计:详细设计说明书,包括软件接口说明、单元测试计

划。 5、软件实现:软件功能说明、源代码说明或者注释 6、产品测试:测试报告 7、产品发布:产品说明书、使用手册 8、产品维护:问题反馈记录 9、项目总结:提交客户方的项目总结和公司项目汇报的PPT。软件过程成果表:

第三章、岗位设置 根据公司目前的开发过程主要分为分析、开发、测试三个阶段。分析阶段完成用户需求文档的编写,系统总体设计的编写;开发阶段完成设计文档的编写,代码的编写、代码的维护。测试阶段完成系统的测试,测试文档及其他材料。通过逐渐的调整岗位,明确工作职责,逐步实现项目经理,软件设计师,程序员,测试工程师的岗位设置。

软件开发命名规范我爱创新的整理

命名规范 目录 第一章文件命名 (3) 1.1 文件命名 (3) 第二章命名规范 (3) 2.1命名概述 (3) 2.2大小写规则 (4) 2.3缩写 (4) 2.4命名空间 (5) 2.5类 (5) 2.6接口 (5) 2.7自定义属性(A TTRIBUTE) (6) 2.8枚举(E NUM) (6) 2.9参数 (7) 2.10方法 (7) 2.11属性(PROPERTY) (7) 2.12事件 (9) 2.13常量(CONST) (10) 2.14字段 (11) 2.16集合 (11) 2.17措词 (12) 第三章控件命名规则 (13) 3.1命名方法 (13) 3.2主要控件名简写对照表 (13) 第四章SQL命名协定 (18) 4.1数据库命名原则及版本控制 (18) 4.4.1数据库命名原则 (18) 4.1.2 数据库版本控制 (19) 4.2S ERVER/命名实例的命名 (19) 4.3数据库命名 (19) 4.4数据库对象—表,视图,列名,约束,规则,默认值 (21) 4.5缩写规范 (22) 4.6列名 (23)

4.7存储过程命名 (25) 4.8游标命名 (25) 4.9触发器命名 (26) 4.10索引命名 (26) 4.11主键和外键命名 (27) 4.12C HECK约束命名 (27) 4.13源文件命名 (28) 4.14J OB的命名 (28) 4.15用户自定义函数命名 (28) 4.16用户自定义数据类型命名 (28) 4.17复制命名 (29)

术语定义 Pascal 大小写 将标识符的首字母和后面连接的每个单词的首字母都大写。例如:BackColor Camel 大小写 标识符的首字母小写,而每个后面连接的单词的首字母都大写。例如:backColor 第一章文件命名 1.1 文件命名 1、文件名遵从Pascal命名法,无特殊情况,扩展名小写。 2、使用统一而又通用的文件扩展名:如C# 文件“.cs” 第二章命名规范 2.1命名概述 名称应该说明“什么”而不是“如何”。通过避免使用公开基础实现(它们会发生改变)的名称,可以保留简化复杂性的抽象层。例如,可以使用GetNextStudent(),而不是GetNextArrayElement()。 命名原则是: 选择正确名称时的困难可能表明需要进一步分析或定义项的目的。使名称足够长以便有一定的意义,并且足够短以避免冗长。唯一名称在编程上仅用于将各项区分开。表现力强的名称是为了帮助人们阅读;因此,提供人们可以理解的名称是有意义的。不过,请确保选择的名称符合适用语言的规则和标准。 以下几点是推荐的命名方法。 1、避免容易被主观解释的难懂的名称,如方面名AnalyzeThis(),或者属性名xxK8。这样的名称会导 致多义性。 2、在类属性的名称中包含类名是多余的,如Book.BookTitle。而是应该使用Book.Title。 3、只要合适,在变量名的末尾或开头加计算限定符(Avg、Sum、Min、Max、Index)。 4、在变量名中使用互补对,如min/max、begin/end 和open/close。 5、布尔变量名应该包含Is,这意味着Yes/No 或True/False 值,如fileIsFound。 6、在命名状态变量时,避免使用诸如Flag的术语。状态变量不同于布尔变量的地方是它可以具有两 个以上的可能值。不是使用documentFlag,而是使用更具描述性的名称,如documentFormatType。 7、即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用有意义的名称。仅对于短循 环索引使用单字母变量名,如i或j。可能的情况下,尽量不要使用原义数字或原义字符串,如

软件项目开发和管理规范V1.0

软件项目开发和管理规范 版本V1.0 2010年1月15日

目录 1.软件项目管理概述 (3) 2.软件项目管理过程 (3) 3.软件项目管理内容 (5) 3.1.需求阶段管理 (5) 3.2.设计阶段管理 (7) 3.3.开发阶段管理 (7) 3.4.测试阶段管理 (8) 3.5.维护阶段管理 (8) 3.6.工具管理 (8) 3.7.软件项目估算与进度管理 (9) 3.7.1.软件项目估算 (9) 3.7.2.进度安排 (10)

1.软件项目管理概述 软件项目管理是软件工程和项目管理的交叉学科,软件项目管理的概念涵盖了管理软件产品开发所必须的知识、技术及工具。根据美国项目管理协会PMI 对项目管理的定义可以将软件项目管理定义为:在软件项目活动中运用一系列知识、技能、工具和技术,以满足软件需求方的整体要求。 软件项目管理是为了使软件项目能够按照预定的成本、进度、质量顺利完成,而对成本、人员、进度、质量、风险等进行分析和管理的活动。实际上,软件项目管理的意义不仅仅如此,进行软件项目管理有利于将开发人员的个人开发能力转化成企业的开发能力,企业的软件开发能力越高,表明这个企业的软件生产越趋向于成熟,企业越能够稳定发展。 软件生存周期包括可行性分析与项目开发计划、需求分析、设计(概要设计和详细设计)、编码、测试、维护等活动,所有这些活动都必须进行管理,在每个阶段都存在着权限角色控制、文档管理、版本控制、管理工具等,软件项目管理贯穿于软件生命的演化过程之中。 2.软件项目管理过程 为保证软件项目获得成功,必须对软件开发项目的工作范围、要完成的任务、需要的资源、需要的工作量、进度的安排、可能遇到的风险等做到心中有数。软件项目的管理工作开始于技术工作开始之前,在软件从概念到实现的过程中持续进行,最后终止于软件开发工作结束。 根据公司的实际情况,结合软件工程及软件过程标准等,特制定我公司软件项目管理流程如下:

软件项目标准开发流程

1、需求分析是怎样做的?(自己理解着说) 需求分析是构建软件系统的一个重要过程。 一般,把需求类型分成三个类型: 1、业务需求(business requirement)反映了组织机构或客户对系统、产品高层次的目的要求,它们在项目视图与范围文档中予以说明。 2、用户需求(user requirement) 文档描述了用户使用产品必须要完成的任务,这在使用实例文档或方案脚本说明中予以说明。 3、功能需求(functional requirement)定义了开发人员必须实现的软件功能,使得用户能完成他们的任务,从而满足了业务需求。 业务需求和用户需求是软件需求分析的基础,也是软件构建的前提。系统分析员通过对业务需求和用户需求的分解,将其转换成克一形式化描述的软件功能需求。开发软件系统最为困难的部分,就是准确说明开发什么。这就需要在开发的过程中不断的与用户进行交流与探讨,使系统更加详尽,准确到位。这就需要确定用户是否需要这样的产品类型以及获取每个用户类的需求。 4、客户也经常是矛盾的。事实上,很少有客户能够明确的知道怎样的一个系统对自己是最有益处的,他们往往在集中方案之间徘徊,于是经常产生需求的变动。生产厂商经常陷入客户自己的矛盾之中。 客户的负面影响可能对于能够在预算内按时完成项目产生很大的影响。尽管客户需要对需求的质量负责任,但是,当一个软件项目因为客户事先没有预料到的情况而导致失败的时候,即使客户不会追究开发方的责任,就软件项目本身而言,也已经是失败的。 总结: 良好的需求分析是软件成功的基础。以上是作者对需求分析工作实践的一次小结以及综合性的思考,是对需求分析本身所做的一次分析。在此基础上,作者提出了逆向沟通的设想,即系统分析员主动进行沟通,提出指导性意见。当软件融合了客户和系统分析员双方智慧,其质量将会进一步得以提高。 2、 6周 (比较合理的代码行数是多少,如果多了,我是怎么切割的)500行,例如:实现数据3、如何将用户登录的信息保存? 用户登陆页面将每个用户的信息使用session保存下来,例如: session.setAttribute("UserID","ytang"); 如果用到用户的登陆信息,再从session根据session.getAttribute("userID")所存储的信息例如在项目1中的应用 4.软件项目开发流程应该是什么样子的? 1。需求分析和获取; 2。界面的设计和修改,直到用户可以接受; 3。后台数据库的建立,做成几张表,写几个存储过程; 4。前台模块的编写和调试; 5。项目的实施和维护;

软件开发编码规范86601

"\n"。 HTML Tab。 作

遵循下面列出的准则有利于编写更加安全的代码。但是总体来说,这些准则不能对安全性做出任何保证。遵循这些准则可能好的实践,但是即使遵循了这些准则,写出的代码仍然可能是不安全的。风险永远存在,不管在编写代码时是如何的警觉。 这些准则的目标,不是为了保证代码的安全性,而是为了消除若干特定类型攻击带来的风险。遵循这些准则,某些特定类型的攻击将无法实现;但是其它类型的攻击仍然可能成功。因此遵循这些准则仅仅是安全的第一步。当书写可能和非守信链接或混用的代码时,应当仔细的考虑如下准则: ?静态字段 ?缩小作用域 ?公共方法和字段 ?保护包 ?尽可能使对象不可变(immutable) ?序列化 ?清除敏感信息 1) 静态字段 避免使用非final的公共静态变量,应尽可能地避免使用非final公共静态变量,因为无法判断代码有无权限改变这些静态变量的值。 一般地,应谨慎使用可变的静态状态,因为这可能导致设想中应该相互独立的子系统之间发生不曾预期的交互。 2) 缩小作用域 作为一个惯例,尽可能缩小成员方法和成员变量的作用域。检查包访问权限成员(package-private)能否改成私有成员(private),保护访问成员(protected)可否改成包访问权限成员(package-private)/私有成员(private)等等。 3) 公共方法/字段 公共变量应当避免使用,访问这些变量时应当通过getter/setter法。在这种方式下,必要时可以增加集中的安全检查。 任何能够访问或修改任何敏感内部状态的公共方法,务必包含安全检查。 参考如下代码段,该代码段中不可信任代码可能修改TimeZone的值: private static TimeZone defaultZone = null; public static synchronized void setDefault(TimeZone zone) { defaultZone = zone;

软件开发流程规范

软 件 开 发 流 程 规 范 德联软件有限责任公司 编制人:侯秀美审核人: 2015 年 8 月 19 日

目录 目录 .........................................................错误!未定义书签。 一、概述......................................................错误!未定义书签。 二、开发流程规范..............................................错误!未定义书签。 系统软硬件开发环境........................................错误!未定义书签。 系统架构(系统组成)......................................错误!未定义书签。 系统功能模块设计..........................................错误!未定义书签。 系统功能开发流程图........................................错误!未定义书签。 开发修改记录..............................................错误!未定义书签。 三、开发代码规范..............................................错误!未定义书签。 文件结构..................................................错误!未定义书签。 文件信息声明..........................................错误!未定义书签。 程序风格..................................................错误!未定义书签。 空行..................................................错误!未定义书签。

标准的软件开发过程

标准的软件开发过程 软件开发的标准过程包括六个阶段,而六个阶段需要编写的各类文件达14种之多,在每个阶段需要编写哪些文件,以及这些文件的主要内容见下: 1.可行性与计划研究阶段 可行性研究报告:在可行性研究与计划阶段内,要确定该软件的开发目标和总的要求,要进行可行性分析、投资一收益分析、制订开发计划,并完成应编制的文件。 项目开发计划:编制项目开发计划的目的是用文件的形式,把对于在开发过程中各项工作的负责人员、开发进度、所需经费预算、所需软、硬件条件等问题作出的安排记载下来,以便根据本计划开展和检查本项目的开发工作。 2.需求分析阶段 软件需求说明书:软件需求说明书的编制是为了使用户和软件开发者双方对该软件的初始规定有一个共同的理解,使之成为整个开发工作的基础。内容包括对功能的规定对性能的规定等。 数据要求说明书:数据要求说明书的编制目的是为了向整个开发时期提供关于被处理数据的描述和数据采集要求的技术信息。 初步的用户手册:用户手册的编制是要使用非专门术语的语言,充分地描述该软件系统所具有的功能及基本的使用方法。使用户(或潜在用户)通过本手册能够了解该软件的用途,并且能够确定在什么情况下,如何使用它。 3.设计阶段 概要设计说明书:概要设计说明书又可称系统设计说明书,这里所说的系统是指程序系统。 编制的目的是说明对程序系统的设计考虑,包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计。运行设计、数据结构设计和出错处理设计等,为程序的详细设计提供基础。

详细设计说明书:详细设计说明书又可称程序设计说明书。编制目的是说明一个软件系统各个层次中的每一个程序(每个模块或子程序)的设计考虑,如果一个软件系统比较简单,层次很少,本文件可以不单独编写,有关内容合并入概要设计说明书。 数据库设计说明书:数据库设计说明书的编制目的是对于设计中的数据库的所有标识、逻辑结构和物理结构作出具体的设计规定。 测试计划初稿:这里所说的测试,主要是指整个程序系统的组装测试和确认测试。本文件的编制是为了提供一个对该软件的测试计划,包括对每项测试活动的内容、进度安排、设计考虑、测试数据的整理方法及评价准则。4.实现阶段 模块开发卷宗(开始编写):模块开发卷宗是在模块开发过程中逐步编写出来的,每完成一个模块或一组密切相关的模块的复审时编写一份,应该把所有的模块开发卷宗汇集在一起。 编写的目的是记录和汇总低层次开发的进度和结果,以便于对整个模块开发工作的管理和复审,并为将来的维护提供非常有用的技术信息。 用户手册完工 操作手册:操作手册的编制是为了向操作人员提供该软件每一个运行的具体过程和有关知识,包括操作方法的细节。 测试计划终稿: 5.测试阶段 模块开发卷宗(此阶段内必须完成) 测试分析报告:测试分析报告的编写是为了把组装测试和确认测试的结果、发现及分析写成文件加以记载。 项目开发总结报告:项目开发总结报告的编制是为了总结本项目开发工作的经验,说明实际取得的开发结果以及对整个开发工作的各个方面的评价。

软件开发流程规范-详细流程

软件开发流程规范 目录 目录 0 一、概述 (2) 二、开发流程规范 (3) 2.1系统软硬件开发环境 (3) 2.2系统架构(系统组成) (5) 2.3系统功能模块设计 (6) 2.4系统功能开发流程图 (7) 2.5开发修改记录 (8) 三、开发代码规范 (9) 3.1文件结构 (9) 3.1.1 文件信息声明 (10) 3.1.2头文件的结构 (12) 3.1.3定义文件的结构 (15) 3.1.4 头文件的作用 (17) 3.1.5 目录结构 (18) 3.2命名规则 (18) 3.2.1 共性原则 (19) 3.2.2 Windows变量命名规则 (21) 3.3程序风格 (24) 3.3.1 空行 (25) 3.3.2代码行 (26) 3.3.3代码行内的空格 (29) 3.3.4 对齐 (31) 3.3.5 长行拆分 (33) 3.3.6修饰符的位置 (35) 3.3.7 注释 (35) 3.4函数设计 (40) 3.4.1 参数的规则 (40) 3.4.2返回值的规则 (42) 3.4.3函数内部实现的规则 (47) 3.4.4其它建议 (50) 3.4.5使用断言 (50) 3.4.6 引用与指针的比较 (52) 3.5变量类型定义 (56)

四、软件测试规范 (56) 4.1单元测试 (57) 4.2 系统测试 (57) 4.6 业务测试 (59) 4.7 验收测试 (59) 4.8 用户现场测试 (59) 五、软件版本管理 (60) 4.1 版本管理的必要性 (60)

、概述 本文制定烟台开发区德联软件有限责任公司计算机软件开发规范文档。本规范的目的是使公司软件开发项目阶段清晰、要求明确、任务具体、编写的代码规范,使之规范化、系统化和工程化,向公司内从事软件开发的工程师和管理人员提出一系列规范和要求,从而有利于开发过程的控制和管理,提高所开发软件系统的质量,缩短开发时间,减少开发和维护费用,以保证项目高质量、顺利进行。 本规范包含:开发流程规范和开发代码规范等,开发流程规范需要技术开发人员编写相关内容,希望每个技术人员形成习惯,如有新的内容更新会及时通知大家,如有好的规范要求也可通知编制人员及时更新。 本规范为烟台开发区德联软件有限责任公司内部材料,严禁其他商业应用。

项目开发命名规则

项目开发命名规划 一.命名规则: 基本规则是按照驼峰式命名方式来对控件命名(控件的缩写加单词,控件的缩写全部为小写,单词的首字母要大写),如果和数据库相关的字段控件,在命名的时候用控件的缩写加字段名来命名。 1.在Web程序中常用控件的缩写: 2.在CS程序中常用控件的缩写:

3.对于数据库的命名规则: 3.1如果该项目是2次开发的项目由负责人定义一个总表头加在每一 个表或视图或存储过程前面) 3.2码表以A_开头 3.3数据表中以业务名,相关业务用一个开头,这样同样的东西就在 一起 3.4临时表以Temp_开头 3.5测试的表或者临时使用的表以及只用一次然后就删的表用Delete开 头 3.6视图以V_开头+业务名+自己起的名 3.7日志表以Log_开头 3.8存储过程以up_开头 3.9自定函数以f_开头 3.10权限表以R_开头 3.11字段命名待定 3.12码表的自增ID用表名加ID;Name 也加表名称 二.代码规则:

1.同一个业务放到同一个目录里 2.传参数以object为主,要是简单,直接传值。主要方便修改 3.中间层的传递以DataTable为主 4.分成3层第一层是Object 第二层是业务逻辑层第三层是表现层(就是 UI) 5.由于都是对SQL Server操作,数据访问层用SQL Helper 6.Object的定义以业务为主 7.现有的功能,把不常用的功能做一些隐藏处理,让使用者看到的机会变 少,以后用的会少。 8.写代码时,正常的业务需求和特殊的业务需求的代码分离。 三.常用代码整理: 1.验证代码js 2.日历控件的js 3. Email的发送 4. Excel的处理 5. Pdf的处理 6. 错误处理 7. 跳转的处理 8. 权限模块的整理 9. 报表工具的整理 10. Web编辑框的统一

软件开发过程文档规范标准

1.1需求规格说明书 需求规格相当于软件开发的图纸,一般说,软件需求规格说明书的格式可以根 据项目的具体情况采用不同的格式,没有统一的标准。下面是一个可以参照的 软件需求规格说明书的模板。 1.导言 1.1目的 [说明编写这份项目需求规格的目的,指出预期的读者] 1.2背景 说明: a)待开发的产品名称; b)本项目的任务提出者、开发者、用户及实现该产品的单位; c)该系统同其他系统的相互来往关系。 1.3缩写说明 [缩写] [缩写说明] 列出本文件中用到的外文首字母组词的原词组。 1.4术语定义 [术语] [术语定义] 列出本文件中用到的专门术语的定义。 1.5参考资料 [编号]《参考资料》[版本号] 列出相关的参考资料。 1.6版本更新信息 具体版本更新记录如表所列。 表版本更新记录 2.任务概述 2.1 系统定义 本节描述内容包括: ●项目来源及背景; ●项目要达到的目标,如市场目标、技术目标等; ●系统整体结构,如系统框架、系统提供的主要功能,涉及的接口等; ●各组成部分结构,如果所定义的产品是一个更大的系统的一个组成部分, 则应说明本产品与该系统中其他各组成部分之间的关系,为此可使用一张 方框图来说明该系统的组成和本产品同其他各部分的联系和接口。 2.2 应用环境 本节应根据用户的要求对系统的运行环境进行定义,描述内容包括: ●设备环境; ●系统运行硬件环境;

●系统运行软件环境; ●系统运行网络环境; ●用户操作模式; ●当前应用环境。 2.3 假定和约束 列出进行本产品开发工作的假定和约束,例如经费限制、开发期限等。列出本产品的最终用户的特点,充分说明操作人员、维护人员的教育水平和技术专长以及本产品的预期使用频度等重要约束。 3.需求规定 1.1对功能的规定 本节依据合同中定义的系统组成部分分别描述其功能,描述应包括: ●功能编号; ●所属产品编号; ●优先级; ●功能定义; ●功能描述。 1.2对性能的规定 本节描述用户对系统的性能需求,可能的系统性能需求有: ●系统响应时间需求; ●系统开放性需求; ●系统可靠性需求; ●系统可移植性和可扩展性需求; ●系统安全性需求; ●现有资源利用性需求。 1.2.1精度 说明对该产品的输入、输出数据精度的要求,可能包括传输过程中的精度。 1.2.2时间特性要求 说明对于该产品的时间特性要求,如对: a)响应时间; b)更新处理时间; c)数据的转换和传送时间; d)计算时间等的要求。 1.2.3灵活性 说明对该产品的灵活性的要求,即当需求发生某些变化时,该产品对这些变化的适应能力,如: a)操作方式上的变化; b)运行环境的变化; c)同其他系统的接口的变化; d)精度和有效时限的变化; e)计划的变化或改进。 对于为了提供这些灵活性而进行的专门设计的部分应该加以标明。 1.3输入输出的要求 解释各输入输出的数据类型,并逐项说明其媒体、格式、数值范围、精度等。 对软件的数据输出及必须标明的控制输出量进行解释并举例,包括对硬拷贝报

软件开发编码规范

精心整理软件安全开发编码规范 1. 代码编写 1) 开发人员应保证工程中不存在无用的资源(如代码、图片文件等)。 2) 3) 4) ● ● ● ● ● 5) 6) 7) 8) 9) 13) 在进行log的获取时开发人员应尽量使用isXXXEnabled。 14) log的生成环境上尽量避免输出文件名和行号。 15) 产品中不要包含后门代码,隔离系统中的后门代码,确保其不能出现在产品中。作为一种 特殊的调试代码,后门访问代码是为了使开发者和测试工程师访问一部分终端用户不能访问的程序代码。但是,如果后门代码被留到产品中,对攻击者来说,它就是一条不需要通过正常安全手段来攻陷系统的通路。

2. JAVA安全 遵循下面列出的准则有利于编写更加安全的代码。但是总体来说,这些准则不能对安全性做出任何保证。遵循这些准则可能好的实践,但是即使遵循了这些准则,写出的代码仍然可能是不安全的。风险永远存在,不管在编写代码时是如何的警觉。 这些准则的目标,不是为了保证代码的安全性,而是为了消除若干特定类型攻击带来的风险。遵循这些准则,某些特定类型的攻击将无法实现;但是其它类型的攻击仍然可能成功。因此遵循这些准则仅仅是安全的第一步。当书写可能和非守信链接或混用的代码时,应当仔细的考虑如下准则: ? ? ? ? ? ? ? 1) 2) ( 3) 以增加集中的安全检查。 任何能够访问或修改任何敏感内部状态的公共方法,务必包含安全检查。 参考如下代码段,该代码段中不可信任代码可能修改TimeZone的值: privatestaticTimeZonedefaultZone=null; publicstaticsynchronizedvoidsetDefault(TimeZonezone) { defaultZone=zone;

软件开发标准化工作流程

目录 1 引言......................................................错误!未定义书签。 编写目的..........................................错误!未定义书签。 适用范围..........................................错误!未定义书签。 定义..............................................错误!未定义书签。 流程图............................................错误!未定义书签。 2 需求调研..................................................错误!未定义书签。 概述..............................................错误!未定义书签。 需求调研..........................................错误!未定义书签。 注意事项..........................................错误!未定义书签。 3 可行性分析................................................错误!未定义书签。 4 需求分析..................................................错误!未定义书签。 概述..............................................错误!未定义书签。 产物/成果.........................................错误!未定义书签。 需求分析任务......................................错误!未定义书签。 需求分析方法......................................错误!未定义书签。 原型化........................................错误!未定义书签。 需求报告..........................................错误!未定义书签。 划分需求的优先级..................................错误!未定义书签。 评审需求文档和原型................................错误!未定义书签。 5 系统设计..................................................错误!未定义书签。 概述..............................................错误!未定义书签。 产物/成果.........................................错误!未定义书签。 产品设计..........................................错误!未定义书签。 概述..........................................错误!未定义书签。 流程图........................................错误!未定义书签。

软件开发过程规范标准

软件开发过程规范 第一部分软件需求分析规范 1、引言 本标准规定了软件需求分析阶段的任务、过程和相关要求,以及需求分析阶段的完成标志。它是软件开发规范的组成部分。 本标准适用于软件需求分析阶段的所有任务和相关人员,包括项目管理人员、软件需求分析人员、文档编制人员和质量审核人员。 2、参考文献 2.1GB8566-88 计算机软件开发规范 2.2ISO/IEC 12207:1995 信息技术——软件生存周期过程 2.3GXB 02-001 软件开发规范:第一部分软件生存周期 2.4GXB 01-001 软件工程术语 2.5GXB 02-007 软件测试规范 3、术语 本标准的术语的定义与GXB 01-001软件工程术语中的定义相一致。 4、需求分析的任务和过程 4.1需求分析任务 确定被开发软件的运行环境、功能、性能和数据需求,建立确认测试准则,编写用户手册,为概要设计提供需求说明书。 4.2需求分析过程 需求分析过程由下列步骤组成: 1)确定需求分析方法和工具; 2)人员培训; 3)确定需求分析输入;

4)需求分析; 5)制定确定测试计划; 6)修改开发计划; 7)编制文档; 8)需求分析审查; 9)需求分析文档存档。 5、总体要求 5.1用户参与 软件需求分析应该有客户指定的人员参加。 5.2用户确认 需求说明必须明确,经过客户同意,并用合同的方式予以确认。 5.3面向用户描述需求 应以用户能够理解的形式和术语描述需求,以利于与用户沟通。 6、需求分析流程 6.1确定需求分析方法和工具 选定合适的需求分析方法,在一个软件项目内所用的分析方法应该保持一致性。候选分析方法: 1)结构分析方法,包括面向数据流的分析方法和面向数据结构的分析方法。 2)面向对象的分析方法。 在需求分析方法选定后,应确定支持该方法的工具。在一个软件项目内,需求建模语言和工具应该保持一致性和规范化。 6.2人员培训 针对所选定的设计方法和工具,以及相关的标准对需求人员进行相应的培训。这是一个可选项,但对于新的方法和工具,或新的分析人员,培训是必需的。

相关主题
文本预览
相关文档 最新文档