关于代码风格的小知识

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

下面介绍一下C/C++代码的好风格。

1.空行

规则1.1:在每个类声明之后、每个函数定义结束之后都要加空行。

规则1.2:在一个函数体内,逻辑上密切相关的语句之间不加空行,其他地方加空行分隔。
1.函数之间的空行

//空行
void Function1(...)
{
  ...
}
//空行
void Function2(...)
{
  ...
}
//空行
void Function3(...)
{
  ...
}

2.函数内部的空行

//空行
while(condition)
{
  statement1;
  //空行
  if(condition)
  {
    statement2;
  }
  else
  {
    statement3;
  }
  //空行
  statement4;
}

2.代码行

规则2.1:一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。

规则2.2:if 、for while 、do 等语句自站一行,执行语句不得紧跟其后。不论执行语句有多少都要加{ }。这样可以防止书写错误。

下面有一些内容进行对比:



x = a + b; y = c + d; z = e + f;


if (width < height) {   dosomething(); }

for(i = 1;i <= b; i++) {   dosomething(); } //空行 other();

坏的代码风格 
int width,height,depth;//宽度高度深度

x = a + b; y = c + d; z = e + f;

if (width < height) dosomething();

for(i = 1; i<=b; i++) dosomething(); other; 

尽可能的在定义变量的同时初始化变量。如果变量引用和定义相聚甚远,可能导致出错,本建议可以减少隐患。如: int width=10; //宽度 int height=10; //高度 int depth=10; //深度

3.代码行内的空格

规则3.1:关键字之后要留空格。像 const 、virtual
、inline、case等关键字之后至少留一个空格,否则无法辨析关键字。if、for、while等关键字之后要留一个空格,再跟左括号 ‘ (
’ ,以突出关键字。
如果表达式过长可适当紧凑
如if((a<=b)&&(c<=d))

规则3.2: 函数名之后不要留空格,紧跟左括号 ‘ ( ’ , 以与关键字区别。

规则3.3:
‘ ( ’ 向后紧跟
’ ) ’ ’ , ’ ’ ; ’ 向前紧跟,紧跟处不留空格。

规则3.4: ’ , ’ 之后要留空格,如Function (x, y, z )。如果‘;’不是一行的结束符号,其后要留空格,如for(i = 0; i<=a; i++) 。

规则3.5:赋值操作符、比较操作符、算数操作符、逻辑操作符、位域操作符,如 “=”, “+=”,“<=”, “+”,“&&”,“<<”,
"^"等二元操作符的前后应当加空格。

规则3.6:一元操作符“~”, “ ! ”,“++”,“–”,“&”等前后不加空格

规则3.7:像 “[ ]”,“.”,“->”这类操作符前后不加空格。

void Func1(int x,int y, int z);  //良好风格
void Func1 (int x,int y, int z); //不良风格
if (year >= 2000)                //良好风格
if(year>=2000)                   //不良风格
if ((a>=b)&&(c<=d))              //良好风格
if(a>=b&&c<=d)                   //不良风格
for (i=0; i<10; i++)             //良好风格
for(i=0;i<10;i++)                //不良风格
for(i = 0; i<10; i ++)           //过多风格  
x = a < b ? a : b;               //良好风格
x=a<b?a:b;                       //不良风格
int *x =&y;                      //良好风格 
int * x =& y;                    //不良风格
arr[5] = 0;           //不要写成arry[ 5 ] = 0;
a.Function();         //不要写成a . Function();
b->Function();        //不要写成b -> Function();       

4对齐

" { " 与 对应的" } ",不必多讲。

5长行拆分

规则5.1:代码行最大长度控制在70~80之内,否则看不过来,也不便打印。
规则5.2:长表达式要在最低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。

if ((very_long_varablel>=very_longer_variable12)
   &&(very_long_varable3>=very_longer_variable14)
   &&(very_long_varablel>=very_longer_variable16))
{
    dosomething();
}

1.6修饰符的位置

修饰符 * 和 & 应该靠近数据类型还是该靠近变量名,是个有争议的话题。
规则1:应当将修饰符 * 和 & 紧靠变量名
例如:

char   *name;
int    *x, y;  //此处y不会被误解为指针

1.7类的版式

  类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。类提供了关键字 public 、protected 和private ,分别用于声明哪些数据和函数是公有的、受保护的或是私有的。这样可以信息隐藏的目的,即让类紧紧公开必须要让外界知道的内容,而隐藏其他一切内容。我们不可以滥用类的封装功能,不要把啥都往里面封装。
  
  类的版式有两种方式:
(1)将 private 类型的数据写在前面,而将public类型的函数写在后面,这种方式是以 “ 数据为中心",重点关注类的内部结构。
(2)将public 类型的数据写在前面,而将private类型的函数写在后面,这种方式是以 “ 行为为中心",重点关注类应该提供什么样的接口(或者服务)。
建议 "以行为为中心"书写。
class A
{
 private:
   int i, j;
   float x, j;
 ...
 public:
   void Func1(void);
   void Func2(void);
   ...
}//以数据为中心
class A
{
 public:
   void Func1(void);
   void Func2(void);
   ...
 private:
   int i, j;
   float x, j;
   ...
}//以行为为中心

2命名规则

规则2.1.1:标识符最好用英语单词及其组合完成,便以记忆阅读,如NowValue.

规则2.1.2:标识符的长度应当符合 "min-length&&max-information"原则。能更好的表达意思即可。

规则2.1.3:命名规则尽量与所采用的操作系统或者开发工具的风格保持一致。 如Windows 采用大小写混排,
如AddChild,
Unix采用小写加下划线的方式,如add_child。 别把这两类风格混在一起用。

规则2.1.4:不要出现仅靠大小写区分的标识符。 如 int x,X;
void foo(int x)
void FOO(float x)

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

规则2.1.6: 变量的名字应当使用 (名词) 或者( 形容词+名词) 如 float value;
float oldValue;
float newValue;

  规则2.1.7:全局函数的名字应当使用  “ 动词 ”或者 “动词+名词”(动宾词组) 类的成员函数应当使用“动词”,忽略的名词就是对象本身。 如: DrawBox();  全局函数 box->Draw();  

//类的成员函数

规则2.2.8: 用正确的反义词命名具有互斥含义的变量或相反动作的函数等。 如 int minValue;
int maxValue;
int SetValue(…);
int GetValue(…);

2.2简单的Windows应用中的命名规则

规则2.2.1:类名和函数名用大写字母开头的单词组合而成。 如:

       class Node;    //类名
       class LeafNode; //类名
       void  Draw(void); //函数名
       void  SetValue(int value);//函数名

规则2.2.2:变量名和参数用小写字母开头的单词组合而成。 如:

        BOOL flag;
        int drawMode;

规则2.2.3:常量全用大写的字母,用下划线分割单词。 如:

const int MAX =100;
const int MAX_LENGTH = 100;

规则2.2.4:静态变量加前缀s_(表示static)。 如:

void Init(...)
{
 static int s_initValue; //静态变量
 ...
 
}

规则2.2.5:如果不得已需要全局变量,则使全局变量加前缀g_(global)。
例如:
int g_howManyPeople; //全局变量
int g_howMuchPeople; //全局变量
规则2.2.6:类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。
如:

void Object::SetValue(int width, int height)
{
  m_width=width;
  m_height=height;
}

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

以上就是一些代码的小知识,借鉴于《高质量C++/C编程指南》,有问题多指教,大家点点关🐖,希望大家多多支持!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值