05/08/2020
C++代码风格
前言
每一个程序员都有会有自己的代码风格,有些风格利于自己或者他人阅读,但有些不利于理解。每一家公司都有不同的代码风格,他们约束程序员统一风格,以便于互相阅读和理解。
优势
- 分享代码
- 可读性高
- 维护方便
- 利于Debug
目的
写出更高效的,可复用的,更稳定的代码,一切有利于阅读的代码都是可以书写的。
命名规范
驼峰写法
短语中每一个单词首字母大写。
类型名第一个单词首字母大写
除了内置类型,STL模板类型等,只要是自己声明的类型需要首字母大写。比如Class,typedef/using,Structure。
变量名第一个单词首字母小写
Object obj; // class Object;
Point p1; //class Point;
SavingAccount savingsAccout; //class SavingAccount;
常量名字全部大写
被const,#define等修饰的内置类型的变量名全部大写,包括枚举中的值,并且每一个单词用下划线分割。
内置类型:char,short,int,long,double,float等
const int MAX_ITERATOR = 10;
static const double PI = 3.14;
#define DEBUG 1
#define SQUARE(X) (X)*(X)
#define READ_FILE_H
enum Color //Color 是类型名字
{
COLOR_RED,
COLOR_GREEN,
COLOR_YELLOW
};
//Color p = COLOR_RED;
特殊情况不需要大写:
- 数据成员
- 类的实例
class Object
{
const int mVariable; //数据成员不需要大写
static const int MAX_COUNT = 10; //静态常量的数据成员可以大写
};
void test(const Object&);
const Object object;
命名空间的名字建议首字母大写
namespace ObjectiveC
{
};
模板类型名建议首字母大写,最好只有一个字母
template<class C, class D>
函数名字首字母小写,并且以动词作为第一个单词
函数名第一个单词的首字母小写,后面的单词的首字母大写
动词有:get,add,compute等
void getName();
void computeTotalMoney();
函数和成员函数参量的名字最好表达意思
静态函数和成员函数需要以s作为开头
静态的用s开头来与普通的进行区分
void sGetName();
void sComputeTotalMoney();
变量名
变量名最好不要有二义性
静态变量名以s为开头,并减少使用它们
static int sFood;
全局变量名以g为开头,并减少使用全局变量
int gCount = 10;
// main
数据成员以m为开头
class Food
{
private:
std::string mName;
double mPrice;
};
类名和类类型尽量保持一致
- 但有时候无法保持一致,需要强调内容,后缀最好一致
Database database;
Topic topic;
Point startingPoint;
Point centerPoint;
Name loginName;
get/set用来读写数据成员
文件
头文件宏定义全部大写,并加上后缀H
include的排列方式最好从底层文件到高层文件,并区分开来
#include <iomanip>
#include <vector>
#include <XBOX/XBOX.h>
#include <PS/PS4.h>
#include "ui/HouseScene.h"
#include "ui/MainWindow.h"
迭代语句和条件语句
无限循环建议使用while(true)
for-loop中最好是简单的初始化
int sum;
for(int i = 0, sum = 0;i < 10; i++)
for(int i = 0; i < 10; i++)
最好不要使用do-while语句,难以理解
减少使用break和continue语句
bool类型修饰,建议开头有前缀is
- is
- has
- should
- 其他修辞
bool isFound = false;
bool hasOne = false;
bool shouldSort();
条件语句中的表达式最好提出来写
if(size>=0 && size <= 10) //bad
bool isInRange = size>=0 && size <= 10;
if(isInRange)
不要再条件语句中执行语句
if(!(file = open(fileName,"w"))) //bad
file = open(fileName,"w"); //Ok
if(!file)
其他/歧义
类型转换建议使用显式的,不要用隐式的转换
intValue = floatValue; //Bad
intValue = (int)floatValue;
public, protected and private 限定访问符
主要public是可以被用户使用的,后面的protected,private并不需要去阅读它们。
class Object
{
public:
...
protected:
...
private:
...
};
List作为后缀名表示数组或者容器
Vertex vertex //一个点
std::vector<Vertex> vertexList //一组顶点
数据成员最好不要是public的
指针赋值或使用不要使用0,0.0,或NULL。
用到浮点数时,建议突出小数的性质
float x = 0.0;
double sum;
sum = (a + b) * 10.0;
double sum = .5 // Bad 0.5
专业术语方便理解函数
- compute
- find
- initialize
缩写词汇作为前缀
- num:表示物体的数量
- i : 与后缀No一个意思,表示下标
缩写词汇作为后缀
- No : 表示下标index,或者一个数字
tableNo;
employeeNo;
一对相反的词汇
- get/set
- add/remove
- create/destory
- start/stop
- insert/delete
- increment/decrement
- old/new
- begin/end
- first/last
- up/down
- min/max
- next/previous