1变量的命名规则
作用域 + 匈牙利命名规则 + 驼峰命名规则 + 设计意图
1.1作用域
全局变量: g_
类成员变量: m_
局部变量: 无
1.2匈牙利命名前缀(常用)
arr 数组
b 布尔型(bool)
c 字符(char)
n 带符号短整形(short)
i 带符号整形(int)
u 无符号整形(unsinged int)
l 带符号长整形(long)
ul 无符号长整形(unsinged long)
s 字符串(string)
h 句柄(HANDLE)
p 指针(pointer)
fn 函数变量(function)
w 无符号整形(字 WORD)
dw 无符号长整形(双字 DWORD)
by 字节(byte)
vec vector<>
map Map<>
lst list<>
1.3变量含义
设计命名应该尽量体现变量、函数的设计意图(作用、功能)。有歧义、让人揣测的都是不好的命名。
1.4数据库字段变量
数据结构表示数据库表格字段值的变量,应与数据库字段名称相同。
2.1指针的使用
初始化:
全局变量指针:声明处 初始化。(尽量避免使用全局变量)
类成员指针: 类初始化列表 初始化。(c++ 要求,先于构造函数)
函数局部变量指针:声明处 初始化。
使用:
全局变量指针:声明处 空值判断。(if (NULL == pPointer))
类成员指针:使用前进行 空值判断。(if (NULL == pPointer))
函数传入指针:函数入口处进行 空值判断。(if (NULL == pPointer))
函数内部指针:使用前进行 空值判断。
2.2参数传递
C++ 参数传递为按值传递,传递过程有赋值过程
常用类型: 直接传递(有赋值过程)
自定义类型:引用传递(无赋值过程)
自定义类型的赋值过程调用构造函数,资源消耗大。
注:非引用传值的函数体对参数的操作不会对函数外目标产生效果。
void func(int iValu)
{
iValu = 3;
}
int iValu = 4;
Func(iValu);
执行期,Func()函数体内iValu 是另一IValue 对象,互不影响。
2.3一行代码的定义
避免以下风格
void func(void){
}
If (bStatus)
{
}bStatus = true;
{ }均独立占一行,一行只有一个执行语句
void func(void)
{
}
If (bstatus)
{
}
Bstatus = false;
2.4宏定义
避免在程序中使用神秘数字作常量, 常量均需大写
避免 数字 + //注释,不依赖这样的注释,会增加后续的维护成本
注意: const /enum 的使用
const int PATH_MAX_LENGTH = 256;
enum
{
PATH_MAX_LENGTH = 256,
}
2.5用函数体替代代码段
避免函数体内代码函数过长。理想的长度:屏幕一页可覆盖
将创建视图代码放到函数体内
将数据结构的初始化放到函数体内
将添加过程放到函数体内
用函数名将代码段的含义总结出来,更易于阅读,执行步骤更清晰
函数体的设计应:功能单一,粒度合理。
2.6if ...else /switch ..case
关键字的成对出现,考虑无效情况,默认情况。
结合日志打印、调试手段 assert(),可以帮助定位程序跑飞位置
2.7文件单独可编译原则
单独的头文件*.h和 定义*.cpp 文件可以单独编译
头文件包含的文件越多,编译所依赖的文件也越多。
引入类型的前置声明/前向声明可以降低这种编译依赖。
2.8通常情况下应禁止使用GOTO语句
Goto 语句对破坏了代码逻辑
Goto 语句后续代码逻辑的维护成本比较高