编程规范

来源:互联网 发布:js两个对象数组合并 编辑:程序博客网 时间:2024/05/29 19:45
1 /13
一、命名规范
1、一般规范
在所有命名中,都应使用标准的英文单词或缩写,避免使用汉语拼音
所有命名都应遵循达意原则,即名称应含义清晰、明确。
所有命名都不易过长,在可表达清晰的前提下越简洁越好。
所有命名都应尽量使用全称。
在类型名称特别复杂的时候,应使用 typedef 来定义别名。
2、文件命名规范
文件名必须由前缀和后缀组成,最好采用长文件命名格式。
文件名必须用英文字母表达,禁止使用中文。
对于几个单词组合表达的文件名,每个单词第一个字母必须大写。
源文件后缀格式可以为.cpp 或.cxx,头文件后缀格式可以为: .h, .hxx。
例: ScreenCapturer.h, H263Encoder.cpp
每一个类最好都有一个头文件和源文件,头文件和源文件的前缀必须与类名相对应。
例:类 CBufferControl 对应 BufferControl.h, BufferControl.cpp
类 CVideoFrame 对应 VideoFrame.h, VideoFrame.cpp

3、变量命名规范
变量命名格式必须是:
变量名=<scope_> + <prefix_> + <qualifier>。
范围前缀 类型前缀 含义标识

范围前缀的取名必须遵照下表:

指针必须要前面m_p<类型前缀>+含义标识

前缀 类型 例子g_全局作用域g_Serversm_成员变量m_pDoc,l_ 局部作用域 l_strNames_ 静态变量作用域 s_strName
注:局部作用域前缀可以省略不用
类型前缀的取名必须遵照下表:
2 /13
序号 原始 前缀 说明1. sbyte sb 有符号 8 位整数,取值范围在 128~127 之间2. byte byte 无符号 16 位整数,取值范围在 0~255 之间3. short s 有符号 16 位整数,取值范围在-32,768~32,767 之间4. ushort us 为无符号 16 位整数,取值范围在 0~65,535 之间5. int n 有符号 32 位整数,取值范围在-2,147,483,648~ 2,147,483,647 之间6. uint un 无符号 32 位整数,取值范围在 0 ~ 4,294,967,295 之间7. long l 64 位有符号整数,取值范围在
9,223,372,036,854,775,808~9,223,372,036,854,775,807
8. ulong ul 64 位无符号整数,取值范围在 0 ~ 18,446,744,073,709,551,615 之间9. bool b 布尔型10. char c 单 Unicode 字符,16 位长度11. float f 取值范围在 1.5x10^-45~ 3.4x10^38 之间, 精度为 7 位数12. double d 取值范围在 5.0x10^-324 ~ 1.7x10^308 之间, 精度为 15~16 位数13. decimal dm 128 位数据类型, 范围从大约 1.0x10^-28 到 7.9x10^2814. struct stu 结构15. enum enum 枚举16. object o 对象
4、窗体及控件命名规范
前缀的取名必须遵照下表:。
序号 原始 前缀 说明1 QMainWindow mwin 主窗体2 QWidget wgt 窗体3 QMenuBar mbar 菜单4 QToolBar tbar 工具栏5 QStatusBar sbar 状态栏6 QDialog dlg 对话框7 QPushButton pbtn8 QToolButton tbtn

3 /13
9 QRadioButton rbtn10 QCheckBox chk11 QComboBox cmb12 QDoubleSpinBox dsb13 QLabel lbl14 QLineEdit lie15 QToolBox tbx16 QTabWidget twt17 QDockWidget dwt18 QGroupBox gbx19 QListView lvw20 QTreeView trvw21 QTableView tavw22 QVBoxLayout vbl23 QHBoxLayout hbl24 QGridLayout grl25 QFormLayout fol
5、函数命名规范
类成员函数命名规则最好是:

函数名=函数的含义标识

函数名 = 函数的标示符 刚开始小写后面每个单词大写

其他函数命名规则最好是:
函数名=范围前缀_+函数返回值类型+函数的含义标识
函数名的范围前缀可以用来表明函数所属的模块类别。
例: ui_nShowErrorMsg(), ui 表明该函数属于界面模块。
函数的含义标识必须能反映函数实现的功能。
函数的含义标识中第一个字母必须大写。
对于几个单词组合表达的函数的含义标识,每个单词第一个字母必须大
写。
例 1: CheckForErrors()优于 ErrorCheck(),
DumpDataToFile()优于 DataFile().

4 /13
例 2: IsHitRetryLimit(),
RetryMax(),

RetryCnt()等函数名切实反映了其实现的功能

Signal 函数和slot函数都要和普通函数区分开来,前面加slot和signal来区分, 

clicked()不是click()

6、类命名规范

类的头文件尽可能少,尽量放在类的定义内!

类名中第一个字母必须为大写“C”。
对于几个单词组合表达的类名,每个单词第一个字母必须大写。
例:用 CTransmitter 而不用 Transmitter。
在类名中最好通过使用前缀来防止类名冲突,前缀可以由 2 个或 2 个以
上的唯一字符组成,前缀必须放在大写字母“C”后。
例: class CICDLinkList{ };
class CAPNLinkList{ };
7、其他命名规范
7.1、常量
常量名中所有字母必须大写,单词间必须用“_” 相隔。
例: const int A_GLOBAL_CONSTANT= 5;
7.2、联合体
联合体类型命名的规则必须是:
联合体名=UN_+含义标识。
联合体含义标识中所有字母必须大写,单词间必须用“_” 相隔
7.3、结构体
结构体类型命名的规则必须是:
结构体名=ST_+含义标识。
对于几个单词组合表达的结构体名,每个单词第一个字母必须大写。
7.4、宏
所有字母必须大写,单词间必须用“_” 相隔。
例: define ENCODING_TIME_TESTING
7.5、枚举
枚举名必须加前缀 EN_且枚举名中所有字母必须大写,单词间必须用“_”
相隔。
枚举的成员变量所有字母必须大写,单词间必须用“_” 相隔
5 /13
例:
enum EN_PIN_STATE{PIN_OFF, PIN_ON};
enum { STATE_ERR, STATE_OPEN,
STATE_RUNNING, STATE_DYING};

二、注释规范
1、一般规范
注释的目的必须是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代
码,禁止没必要的重复注释信息。
注释必须语言简炼、易懂而又准确。
单行注释必须用双斜杠进行注释,多行注释必须用/* */进行注释,注释
内容最好放在对应代码的上方。
注释与前面的执行语句之间必须空一行。
必须边写代码边注释,修改代码同时修改相应的注释,以保证注释与代
码的一致性。
注释行数(不包括程序头和函数头说明部分)必须占总行数的 1/5 到
1/3 。
2、文件头部注释
在文件头部必须加注释表明该文件的一些信息,其格式如下:
/*************************************************
Copyright©,2014,True Reality Geospatial Solutions, LLC
File Name:
Date:
Author:
Description:
Version:
Change Log:(Author ,Date,Version,Description)
*************************************************/

注:
•必须在版本栏中保留以前的信息,格式如: 1.0/0.8/0.7。
•在修改记录栏必须按时间先后顺序自下往上排列。
•修改记录中必须特别注明修改了哪些函数。
•注释文本每行的跨度禁止超过上下条纹框的范围,换行时必须以冒号所在位置为准进行左对齐。
例:

6 /13
3、函数的注释
对于比较重要的函数或方法必须在其声明处作适当注释, 说明该函数的
功能及各参数的含义,注释模版如下:
// Get data pointer of sub image
short* GetSubImageData (int i_nLeft,
// Left position of sub image .int i_nTop, // Top position of sub image .WORD i_wWidth, // Width of sub image .
WORD i_wHeight); // Height of sub image .
对于自行编写的函数,若是系统关键函数,必须在函数实现部分的上方
标明该函数的信息,格式如下:
//(将函数的简单描述放在这里)
/*************************************************
Function Name:
Description:
Return Value :
Parameters:
Name,Description,Value
Author:
Date:
Version:
Change log:
Author ,Date,Version,Description
*************************************************/
注: 1、在修改记录栏必须按时间先后顺序自下往上排列。
2、注释文本每行的跨度禁止超过上下条纹框的范围,换行时必须以冒号
所在位置为准进行左对齐。
4、常量、变量和宏的注释
在常量、变量(临时变量除外)和宏的声明前必须对其作适当注释, 注
释说明的要点是:
•被保存值的含义(必须)
•合法取值的范围(可选)
•与其它数据,函数或模块的关系(可选)
例:
// default quantilizer level,from 1 to 31.
const int DEFAULT_QL=8
// number of gob,12 for CIF and 3 for QCIF .
int nGob;

7 /13
5、结构体和联合体的注释
对结构体或联合体的注释要点必须是:
•它描述的对象是什么(必须)
•对其分量应按变量注释要求加以注释(必须)
•与其它数据, 函数或模块的关系(可选)
例:
//3D Point(nPosX , nPosY , nPosZ )
typedef struct ST_ THREED_ PT_TAG{
int nPosX; //x Position
int nPosY; //y Position
int nPosZ; //z Position
} ST_THREED_ PT;
6、语句注释
对语句的注释必须放在其上方相邻位置,不要放在下面。
在程序块的结束行右方最好加注释标记,以表明某程序块的结束。
过长的函数实现,最好将其语句按实现的功能分段加以概括性说明.
必须对不易理解的分枝条件表达式加注释.
三、文件编写规范
头文件的构成:
1、头文件的头部注释
2、防止重复包含的宏:
#ifndef _文件名_扩展名
#define _文件名_扩展名
3、包含文件部分(系统头文件、项目头文件、本地头文件)(可选)
4、宏定义部分(可选)
5、类型定义部分(可选)
6、结构体定义部分(可选)
7、函数或类的声明部分
8、防止重复包含的宏: #endif
源文件的构成:
1、源文件的头部注释
2、包含文件部分(系统头文件、项目头文件、本地头文件)(可选)

8 /13
3、宏定义部分(可选)
4、类型定义部分(可选)
5、结构体定义部分(可选)
6、函数或类的定义部分
注:包含文件时禁止使用绝对路径。
四、函数编写规范
1、函数划分
良好的函数划分,必须能够自顶向下逐级抽象地展现设计思想, 提高程
序的易读性和自说明性。
函数必须是按功能划分的, 每个函数必须只做一件事情(高内聚准则)。
相关的一组函数之间的关联必须尽可能少(低耦合准则)。
在不破坏高内聚准则和低耦合准则前提下, 一个函数代码长度最好不超
过 100 行。
2、函数缩进
必须以 4 个空格键来表示一个缩进单位。
在不影响展示程序结构的前提下最好尽可能地减少缩进的层次.
可以使用如下两种缩进风格: (以 if 为例)
1
if ( expression )
{
statements //
缩进四格
} else
{statements //缩进四格}
2
if ( expression ){
statements
//缩进四格}
else{
statements //缩进四格
}
在出现缩进限制时,最好遵循如下表示规范:
(1) 过长的条件表达式(以 if 举例):
if (expression1
&& (expression2 //
缩进四格
|| expression3) //缩进八格
9 /13
&& expression4 ) //缩进四格{statements //缩进四格
}
(2) 过长的函数原型说明:
OBcObject * OB_DLLPASFUNC FunctionName
( //
缩进四格
Type1 Parameter1, // the paramter means is written here //缩进八格
Type2 Parameter2, // ... //缩进八格
......
); //
缩进四格
(3) 过长的函数调用:
OBcObject *pObject
= FunctionName
//缩进四格( //缩进八格parameter1,
parameter2,
...
);
if ( FunctionName
(
//缩进八格parameter1,
parameter2,
...
) == 0
&& expression... )
//缩进四格
{ }
3、其他
函数的输入参数和输出参数必须少于 5 个,当参数过多时,可以考虑将
参数定义为一个结构体,并且将结构体指针作为参数。
禁止将函数的参数作为工作变量。(将函数的参数作为工作变量,有可
能错误地改变参数内容。对必须改变的参数,最好先用局部变量代替之,
最后再将该局部变量的内容赋给该参数。)
对于超过 3 句以上的语句反复调用,最好封装为函数调用。
提供给外部使用的函数,禁止使用全局变量交换数据。
五、变量和常量使用规范
不要将全部变量的声明放在函数开始处,变量必须在离其第一次使用的
10 /13
位置最近的地方声明。
最好不使用全局变量。
定义变量时要注意区分其有无符号,无符号的变量必须加上 unsigned。
必须尽量使用整型变量代替浮点型变量。
禁止对浮点型变量进行相等比较。
所有变量必须在使用前进行初始化。
最好不使用 malloc(), calloc()和 realloc()而使用 new 来为变量分配空间。
定义常量必须用 const 或 enum,禁止使用#define。
最好用声明的常量代替代码中的经常出现的数字。
必须将常量定义在尽可能小的范围内。
例:
const unsigned int MAX_FOOS = 1000;
const unsigned int MAX_FOO_BUFFERS = 40;
class foo
{
public:
enum { MAX_INSTANCES = 1000; }
...
private:
enum { MAX_FOO_BUFFERS = 40; }
...
};
六、其他类型的使用规范
禁止在结构体和联合体中定义成员函数。
禁止使用预定义宏来实现函数的功能,如果想提高函数调用的速度,可
以将其定义为内联函数(inline 关键字)

七、类的编写规范
在类中最好避免定义 public 和 protected 型成员变量,可以用 public 或
protected 型的成员函数 GetXXX()和 SetXXX()来代替。
最好将类中的一些简单函数(如取成员变量值的函数,激活其他函数的
函数)定义成内联函数。
最好不要将函数的定义放在类中。
11 /13
必须将类中不影响该类成员变量值的成员函数定义为常函数类型(使用
const 关键字)。
禁止在类的构造函数和析构函数中使用全局的对象或变量。
八、可移植性规范
最好将平台相关的代码统一放在一个文件里。
最好利用 typedef 声明预定义的数据类型,避免直接使用预定义的数据
类型。
必须注意数据类型长度的平台相关性,如 int 类型在不同的环境下有 16
位和 32 位之分。但是size_t移植很好

必须注意 int, long, short, float, double 等数据类型在不同的环境下字节
的排列顺序不同。
最好使用预编译头:
如果您的代码可以在多个操作系统及多个编译程序中共享, 一个预编译头文件是必不可少的,
该 文 件 用 来 标 识 当 前 所 用 的 操 作 系 统 、 编 译 程 序 、 CPU 类 型 下 的 本 地 特 征 , 如 下 以
MS-DOS,WIN16,WIN32,Solaris2.x,HPUX,IRIS 操作系统、 Borland C++ 2.0 以上,Microsoft C/C++
7.0 以上, AT&T C++2.0 以上 UNIX 编译器和 INTEL,HP,SGI,SPARC 机为平台的源码级共享所需的
预编译头.
#ifndef __compmacr_h
#define __compmacr_h
// begin the file COMPMACR.H 94.12.11
#ifndef __cplusplus
#error This is not a C++ compiler
#endif
#ifdef hpux
#define ENVIRONMENT 1 // indicate the environment has been defined
#define CPPATT 200 // AT&T C++ above version 2.0
#define BYTEREVERT 1 // the numeric byte order is revert with ISO
#define OS_HPUX // this is hp machine & OS
#ifndef UNIX // it is unix OS
#define UNIX
#endif
#endif
#ifdef _SGI_SOURCE
#define ENVIRONMENT 1 // indicate the environment has been defined
#define CPPATT 200 // AT&T C++ above version 2.0
#define BYTEREVERT 0 // the numeric byte order is same as ISO
#define OS_SGI // this is SGI machine & OS

12 /13
#define OS_IRIS // this is SGI machine & OS
#ifndef UNIX // it is unix OS
#define UNIX
#endif
#endif
#ifdef sun
#define ENVIRONMENT 1 // indicate the environment has been defined
#define CPPATT 200 // AT&T C++ above version 2.0
#ifdef sparc // if is SPARC CPU
#define BYTEREVERT 0 // the numeric byte order is same as ISO
#else // if is other type CPU
#define BYTEREVERT 1 // the numeric byte order is revert with ISO
#endif
#include <sys/errno.h> // use errno.h to find OS version
#if !defined(ENOSYS) || ENOSYS==90
#define OS_Solaris1x // this is SunOS 4.x or Solaris 1.x OS
#endif
#if ENOSYS==89
#define OS_Solaris2x // this is SunOS 5.x or Solaris 2.x OS
#endif
#ifndef UNIX // it is unix OS
#define UNIX
#endif
#endif
#ifdef __TURBOC__
#define ENVIRONMENT 1 // indicate the environment has been defined
#define CPPTURBO 200 // Turbo or Borland C++ above version 2.0
#define BYTEREVERT 1 // the numeric byte order is revert with ISO
#ifdef __MSDOS__
#define OS_DOS // this is MS-DOS OS
#endif
#ifdef _Windows
#define OS_WIN16 // this is MS-Windows 3.x 16bit OS
#endif
#endif
#ifdef _MSC_VER
#define ENVIRONMENT 1 // indicate the environment has been defined
#define CPPMSC 700 // Microsoft C/C++ above version 7.0
#ifdef MSDOS
#define OS_DOS // this is MS-DOS OS
#define BYTEREVERT 1 // the numeric byte order is revert with ISO
#endif
#ifdef _WINDOWS

13 /13
#define OS_WIN16 // this is MS-Windows 3.x 16bit OS
#endif
#endif
#if !defined(ENVIRONMENT)|| !defined(BYTEREVERT)
#error the header file does not support the compiler
#endif
// end the COMPMACR.H
#endif
九、其他规范
程序提交以后对其进行修改时必须将旧语句用/* */或//注释掉,不能自
行删除或修改,对修改情况必须在文件修改记录中加以记载。

禁止在程序中使用 GOTO 语句。

所有的变量使用前必须要初始化,如果指针不初始化,他就会随意随便指,那么就会紊乱,如果变量不初始化,会随便赋值,那么就会造成麻烦,类的构造函数随意搞。

struct要搞构造函数,copy构造函数必须的

多看代码,看完以后 和代码对照一下

如果代码写完以后的函数返回值的判断问题,这个函数是否影响下面的函数,返回的bool类型,尽量让用户进行操作和判断,还是返回一个结果让下面进行用到,不能随意写!都要做一个判断,没有意义的话返回什么值!

测试的话,反工程师式思维测试,测试数据的极大 极小,参数夸张一般 数据各种数据等跨越函数的测试。 

输入输出问题,这个问题一般是看调用的函数的

逻辑问题这个很难看出来,但是刚开始就把逻辑关系调好

指针越界 大部分都是这个问题,这个需要自己调。

看空间复杂度时间复杂度通过任务管理器

边界数组的内存越界检查

遇到问题:

1. 自己百度查询

2 google查询

3 帮助文档

4 看别人代码

5 问别人

易犯错误:

 公式书写错误,括号,乘号 除号(得到结果的是整除的结果没有余数), %的

以及拼写错误


原创粉丝点击