前言

良好的编程标准能使源代码便于阅读,看着舒服,而且还能防范一些逻辑陷阱,是一个良好编程者的必备要素。
编程标准分为代码风格命名规则编程原则三大部分。

一些概念定义

标识符:一般指一些可用编程物件的名称,比如常量名,变量名,宏名,函数名,类型名等等。
语素:指标识符,关键字,操作符,字面常量等等。


代码风格

  1. 语素间的空白
  2. 语句块间的缩进与换行

1. 语素间的空白

空白符:空格
空白方式:每个语素之间用一个空格区分
例外:某些语素序列整体性比较强,故不加空格,例举如下:

I.  函数

II. 参数

III.特殊表达式

特殊表达式有以下几种规则:

IV. 类型强转

V.  模板实例

VI. 某些特殊运算符(关键字)

2. 语句块之间的缩进与换行

空白符:{空格*4},CrLf
空白方式:内层语句每行开头比上层多加一个{空格*4},以表示缩进层次;语句块大括号独占一行。
例如:

if ( condition )
{
    do
    {
        //......
    }
    while ( condition );
}

命名规则

前缀 + 命名方法

前缀

  局部域 结构/类域 文件域 名称空间域 全局域
公开 N/A 变量:一个简写的项目名前缀( 比如 MyPrj_ )
其他:
不公开 _ 类型/名称空间:_
其他:__
类型/名称空间:_
其他:__
类型/名称空间:_
其他:__

 

命名方法

  变量 常量 函数 类型 名称空间 静态修饰
局部域 前缀 + 小驼峰 前缀 + 大驼峰 N/A N/A 前缀 + 大驼峰 N/A 前缀 + 大驼峰
结构/类域 前缀 + 小驼峰 前缀 + 大驼峰 N/A 前缀 + 小驼峰 前缀 + 大驼峰 N/A 前缀 + 大驼峰
文件域 前缀 + 大驼峰 前缀 + 大驼峰 前缀 + 全部大写"_"分词 前缀 + 大驼峰 前缀 + 大驼峰 前缀 + 全部小写"_"分词 前缀 + 大驼峰
名称空间域 前缀 + 小驼峰 前缀 + 大驼峰 N/A 前缀 + 大驼峰 前缀 + 大驼峰 前缀 + 全部小写"_"分词 前缀 + 大驼峰
全局域 前缀 + 小驼峰 前缀 + 大驼峰 前缀 + 全部大写"_"分词 前缀 + 大驼峰 前缀 + 大驼峰 前缀 + 全部小写"_"分词 前缀 + 大驼峰

 

下面介绍些命名示例:

全局域

// 公开 ( 一般来说全局变量已经是程序范围内可见,不用对程序外公开。但是少数程序可能要求对外部程序公开  )
string MyPrj_showTitleName;             // 变量
int const UsageFileCount = 100;         // 常量
#define NUMERIC_ABS(v) (v<0?-v:v)       // 宏
void DoSomeFunc(){}                     // 函数
class MyClass;                          // 类型
namespace ip_addr {}                    // 名称空间
namespace ip {}

// 不公开
string __showTitleName;                   // 变量
int const __UsageFileCount = 100;         // 常量
#define __NUMERIC_ABS(v) (v<0?-v:v)       // 宏
void __DoSomeFunc(){}                     // 函数
class _MyClass;                           // 类型
namespace _ip_addr {}                     // 名称空间
namespace _ip {}

名称空间域

namespace myns
{
    // 公开
    string showTitleName;                   // 变量
    int const UsageFileCount = 100;         // 常量
    void DoSomeFunc(){}                     // 函数
    class MyClass;                          // 类型
    namespace ip_addr {}                    // 名称空间
    namespace ip {}
    
    // 不公开
    string __showTitleName;                   // 变量
    int const __UsageFileCount = 100;         // 常量
    #define __NUMERIC_ABS(v) (v<0?-v:v)       // 宏
    void __DoSomeFunc(){}                     // 函数
    class _MyClass;                           // 类型
    namespace _ip_addr {}                     // 名称空间
    namespace _ip {}
}

文件域

// 不公开
static string __ShowTitleName;                   // 变量
static int const __UsageFileCount = 100;         // 常量
#define __NUMERIC_ABS(v) (v<0?-v:v)       // 宏
static void __DoSomeFunc(){}                     // 函数
class _MyClass;                           // 类型
namespace _ip_addr {}                     // 名称空间
namespace _ip {}

结构/类域

class MyClass
{
public:
    // 公开
    string className;
    int const ClassNumber;
    static int Order;

    string getClassName();
    static void SetOrder( int v );
private:
    // 不公开
    string _className;
    int const _ClassNumber;
    static int _Order;

    string _getClassName();
    static void _SetOrder( int v );
};

局部域

string variable, localVariable;
int const ObjCount = 9;
static string Variable = "123";

 

命名规则的叠加

编程中可能出现多种组合的定义声明,譬如静态类域常量,上述规则可叠加。


编程原则

  1. 凡是管理资源所有权的指针一律不用裸指针,而应用智能指针。
  2. 标识符命名利用上下文尽量精简长度。
  3. 函数超过50行拆分成更小的函数。
  4. 函数不超过5行且无循环应用inline。
  5. 善用try-catch异常机制,专注代码正确流程的逻辑,使得出错流程的逻辑和正确流程的逻辑分离。