第2章程序的版式,      版式固然不会影响程序的成效,但会影响可读性。程序的版式追求分明、雅观,是程序作风的次

第2章 程序的版式

       版式固然不会影响程序的成效,但会影响可读性。程序的版式追求分明、雅观,是程序作风的次要组成要素。

可以把程序的版式比喻为“书法”。好的“书法”可让人对程序一目明白,看得兴致勃勃。差的程序“书法”如螃蟹匍匐,让人看得枯燥风趣,更令维护者烦末路有加。请程序员们进修程序的“书法”,赔偿除夜学盘算机教育的坏处,着实很有必要。

2.1 空行

空行起着分隔隔离分散程序段落的作用。空行得体(不过多也不过少)将使程序的组织愈加分明。空行不会华侈内存,固然打印含有空行的程序是会多耗损一些纸张,然则值得。所以不要舍不得用空行。

 


l         【礼貌2-1-1在每个类声明之后、每个函数定义完毕之后都要加空行。拜赐教例2-1(a)

l         【礼貌2-1-2在一个函数体内,逻揖上慎密亲密相关的语句之间不加空行,另外中央应加空行分隔隔离分散。拜赐教例2-1(b )

 


// 空行


void Function1(…)


{


  …


}


// 空行


void Function2(…)


{


  …


}


// 空行


void Function3(…)


{


  …


}


 


// 空行


while (condition)


{


  statement1;


  // 空行


  if (condition)


  {


     statement2;


  }


  else


  {


     statement3;


  }


// 空行


  statement4;




示例2-1(a) 函数之间的空行                   示例2-1(b) 函数内部的空行

 


2.2 代码行

l         【礼貌2-2-1一行代码只做一件事变,如只定义一个变量,或只写一条语句。这样的代码苟且阅读,而且利便于写注释。


l         【礼貌2-2-2if、for、while、do等语句自占一行,执行语句不得紧跟后来。不论执行语句有多少都要加{}。如答应以防止誊写丢失误。


 


示例2-2(a)为作风优秀的代码行,示例2-2(b)为作风不良的代码行。

 


 


int width;    // 宽度


int height;   // 高度


int depth;    // 深度


 


int width, height, depth; // 宽度高度深度


 



x = a b;


y = c d;


z = e f;


X = a b;   y = c d;  z = e f;


 



if (width < height)


{


dosomething();


}


if (width < height) dosomething();



for (initialization; condition; update)


{


dosomething();


}


// 空行


other();


 


for (initialization; condition; update)


     dosomething();


other();


 


 



示例2-2(a) 作风优秀的代码行                 示例2-2(b) 作风不良的代码行

 


²        【发起2-2-1尽可以在定义变量的同时初始化该变量(就近绳尺)

要是变量的引用处和其定义处相隔比较远,变量的初始化很苟且被健忘。要是引用了未被初始化的变量,可以会招致程序错误。本发起可以扩充隐患。例如


int width = 10;     // 定义并初绐化width


int height = 10; // 定义并初绐化height


int depth = 10;     // 定义并初绐化depth


 


2.3 代码行内的空格

l         【礼貌2-3-1环节字之后要留空格。象const、virtual、inline、case 等环节字之后至少要留一个空格,不然无法辨析环节字。象if、for、while等环节字之后应留一个空格再跟左括号‘(’,以凸起环节字。

l         【礼貌2-3-2函数名之后不要留空格,紧跟左括号‘(’,以与环节字区别。

l         【礼貌2-3-3‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。

l         【礼貌2-3-4‘,’之后要留空格,如Function(x, y, z)。要是‘;’不是一行的完毕符号,后来要留空格,如for (initialization; condition; update)。

l         【礼貌2-3-5赋值哄骗符、比较哄骗符、算术哄骗符、逻辑哄骗符、位域哄骗符,如“=”、“ =” “>=”、“<=”、“ ”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元哄骗符的前后该当加空格。

l         【礼貌2-3-6一元哄骗符如“!”、“~”、“ ”、“--”、“&”(地点运算符)等前后不加空格。

l         【礼貌2-3-7象“[]”、“.”、“->”这类哄骗符前后不加空格。

²        【发起2-3-1关于表达式比较长的for语句和if语句,为了紧凑起见可以合适地去丢失一些空格,如for (i=0; i<10; i )和if ((a<=b) && (c<=d))

 


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;                            // 不良的作风 



array[5] = 0;                             // 不要写成 array [ 5 ] = 0;


a.Function();                             // 不要写成 a . Function();


b->Function();                            // 不要写成 b -> Function();


 



示例2-3 代码行内的空格

 


2.4 对齐

l         【礼貌2-4-1程序的分界符‘{’和‘}’应独有一行而且位于同等列,同时与引用它们的语句左对齐。


l         【礼貌2-4-2{ }之内的代码块在‘{’左边数格处左对齐。


 


示例2-4(a)为作风优秀的对齐,示例2-4(b)为作风不良的对齐。

 


 


void Function(int x)


{


… // program code


}


 


void Function(int x){


… // program code


}


 



if (condition)


{


… // program code


}


else


{


… // program code


}


if (condition){


… // program code


}


else {


… // program code


}



for (initialization; condition; update)


{


… // program code


}


for (initialization; condition; update){


… // program code


}



While (condition)


{


… // program code


}


while (condition){


… // program code


}



要是泛起嵌套的{},则运用缩进对齐,如:


     {


        …


          {


            …


          }


       …


}


 



示例2-4(a) 作风优秀的对齐                       示例2-4(b) 作风不良的对齐

 


2.5 长行拆分

l         【礼貌2-5-1代码行最除夜长度宜节制在70至80个字符以内。代码行不要过长,不然眼睛看不过去,也利便于打印。

l         【礼貌2-5-2长表达式要在低优先级哄骗符处拆分红新行,哄骗符放在新行之首(以便凸起哄骗符)。拆分出的新行要遏制合适的缩进,使排版整洁,语句可读。

 


if ((very_longer_variable1 >= very_longer_variable12)


&& (very_longer_variable3 <= very_longer_variable14)


&& (very_longer_variable5 <= very_longer_variable16))


{


    dosomething();


}



virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix,


                                 CMatrix rightMatrix);


 



for (very_longer_initialization;


     very_longer_condition;


     very_longer_update)


{


    dosomething();


}



示例2-5 长行的拆分

2.6 修饰符的地位

修饰符 * 和 & 应该接近数据典范模范照旧该接近变量名,是个有争议的活题。

若将修饰符 * 接近数据典范模范,例如:int*  x; 从语义上讲此写法比较直观,即x是int 典范模范的指针。


上述写法的短处是苟且惹起误解,例如:int*  x, y; 此处y苟且被误解为指针变量。固然将x和y分行定义可以遏制误解,但并不是除夜家都快乐愿意这样做。

 


l         【礼貌2-6-1该当将修饰符 * 和 & 紧靠变量名


例如:


char  *name;


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


2.7 注释

C言语的注释符为“/*…*/”。C 言语中,程序块的注释常授与“/*…*/”,行注释一样寻常授与“//…”。注释反复用于:

(1)版本、版权声明;

(2)函数接口声名;

(3)次要的代码行或段落提示。

固然注释有助于清晰代码,但注意不可过多地运用注释。拜赐教例2-6。

 


l         【礼貌2-7-1注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,注释太多了会让人目眩混乱。注释的魔术要少。

l         【礼貌2-7-2要是代码原本便是分明的,则不必加注释。不然多此一举,令人厌烦。例如

i ;     // i 加 1,多余的注释


l         【礼貌2-7-3边写代码边注释,修正代码同时修正相应的注释,以包管注释与代码的分比喻性。不再有效的注释要删除。


l         【礼貌2-7-4注释该当正确、易懂,防止注释有二义性。错误的注释不只无益反而无害。


l         【礼貌2-7-5尽节遏制在注释中运用缩写,新鲜是不常用缩写。


l         【礼貌2-7-6注释的地位应与被描绘的代码相邻,可以放在代码的上方或右方,不可放在下方。


l         【礼貌2-7-8现代码比较长,新鲜是有多重嵌套时,该当在一些段落的完毕处加注释,便于阅读。


 


 


/*

* 函数先容:

* 输入参数:

* 输入参数:

* 前去值  :

*/

void Function(float x, float y, float z)

{

  …

}

 


if (…)

{

  …

  while (…)

  {


} // end of while


} // end of if

示例2-6 程序的注释

 


2.8 类的版式

类可以将数据和函数封装在一同,其中函数透露表现了类的举动(或称办事)。类供应环节字public、protected和private,判袂用于声明哪些数据和函数是私有的、受维护的梗概是私有的。如答应以达到信息淹没的目的,即让类仅仅地下必必要让外界知道的内容,而淹没另外通通内容。我们不可以滥用类的封装成效,不要把它当成暖锅,什么器械都往里扔。

类的版式次要有两种编制:

(1)将private典范模范的数据写在背面,而将public典范模范的函数写在背面,如示例8-3(a)。授与这种版式的程序员主张类的企图“以数据为中央”,重点关注类的内部组织。

(2)将public典范模范的函数写在背面,而将private典范模范的数据写在背面,如示例8.3(b)授与这种版式的程序员主张类的企图“以举动为中央”,重点关注的是类应该供应什么样的接口(或办事)。

许多C 教课书遭到Biarne Stroustrup第一本著作的影响,不知不觉地授与了“以数据为中央”的誊写编制,并不见得有多少事理。

我发起读者授与“以举动为中央”的誊写编制,即起首思考类应该供应什么样的函数。这是许多人的阅历——“这样做不但让自己在企图类时思路分明,而且利便他人阅读。由于用户最体恤的是接口,谁快乐愿意先看到一堆私罕有据成员!”

 


>

{


  private:


int    i, j;


float  x, y;


    …


  public:


void Func1(void);


void Func2(void);



}

>

{


  public:


void Func1(void);


void Func2(void);



  private:


int    i, j;


float  x, y;


    …


}

示例8.3(a) 以数据为中央版式                 示例8.3(b) 以举动为中央的版式





版权声明: 原创作品,答应转载,转载时请务必以超链接体式花式标明文章 原始出处 、作者信息和本声明。不然将追究司法责任。