写C++代码应该养成的好习惯

上一篇 / 下一篇  2010-01-10 10:12:55

  其实那些琳琅满目的规则,最终的目前都是为了给我们带来更多的方便,如果觉得学习和记忆这些规则所花费的代价要比规则所带来的方便要大得多,那么用这些时间去打CS好了。

  当然在源文件变成了二进制交给计算机之后,那种规则所形成的格式是完全没有任何体现的,那么我们为什么还要用这么多的精力和时间来做这些“没有无谓的事情”呢?最后执行这些命令的是机器,但是这些命令是要在写程序的人理解之后才放心交给机器,胡乱的敲些字符那个不叫程序。

  总之,这些规则是为了我们可以用更少的时间来理解程序和查找里面的错误,这就是要养成这些习惯的目的!如果仅仅是为了挑战自己的记忆极限的话,在这个地方不会让你觉得有任何的快感,因为没有人会因为你记住了这些规则而羡慕你!

  而且本人及其鄙视那些为了记忆而记忆的人,因为他们通常都把活人总结出来的经验用死人的方式来对待。而且考试是的试卷上也不会出现下面的任何一个规则。

  不多废话!(这些规则是别人整理出来,我又再整理出来我觉得我会去记住的!)


【规则 1 】 在每个类声明之后、每个函数定义结束之后都要加空行。
【规则 2 】 在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
【规则 3 】 一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
【规则 4 】 if 、 for 、 while 、 do 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 {} 。这样可以防止书写失误。
【建议 5 】 尽可能在定义变量的同时初始化该变量(就近原则)l 【规则 2-3-1 】 关键字之后要留空格。象 const 、 virtual 、 inline 、 case 等关键字之后至少要留一个空格,否则无法辨析关键字。象 if 、 for 、 while 等关键字之后应留一个空格再跟左括号‘(',以突出关键字。
【规则 6 】 函数名之后不要留空格,紧跟左括号‘(',以与关键字区别。
【规则 7 】 ‘('向后紧跟,‘)'、‘,'、‘ ; '向前紧跟,紧跟处不留空格。
【规则 8 】 ‘,'之后要留空格,如 Function(x, y, z) 。如果‘ ; '不是一行的结束符号,其后要留空格,如 for (initialization; condition; update) 。
【规则 9 】 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“ = ”、“ += ” “ >= ”、“ <= ”、“ + ”、“ * ”、“ % ”、“ && ”、“ || ”、“ << ” , “ ^ ”等二元操作符的前后应当加空格。
【规则 10 】 一元操作符如“ ! ”、“ ~ ”、“ ++ ”、“ -- ”、“ & ”(地址运算符)等前后不加空格。
【规则 11 】 象“ []”、“ .”、“->” 这类操作符前后不加空格。
【建议 12 】 对于表达式比较长的 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.4 对齐
【 规则 13 】 程序的分界符‘ { '和‘ } '应独占一行并且位于同一列,同时与引用它们的语句左对齐。
【 规则 14 】 { } 之内的代码块在‘ { '右边数格处左对齐。
示例 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) 风格不良 的对齐
【 规则 15 】 代码行最大长度宜控制在 70 至 80 个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。
【 规则 16 】 长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
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();

}

命名规则
比较著名的命名规则当推Microsoft公司的“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p。如果一个变量由ppch开头,则表明它是指向字符指针的指针。
“匈牙利”法最大的缺点是烦琐,例如
int i, j, k;
float x, y, z;
倘若采用“匈牙利”命名规则,则应当写成
int iI, iJ, ik; // 前缀 i表示int类型
float fX, fY, fZ; // 前缀 f表示float类型
如此烦琐的程序会让绝大多数程序员无法忍受。
据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。命名规则对软件产品而言并不是“成败悠关”的事,我们不要化太多精力试图发明世界上最好的命名规则,而应当制定一种令大多数项目成员满意的命名规则,并在项目中贯彻实施。
共性规则
本节论述的共性规则是被大多数程序员采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则,如3.2节。
【 规则 17 】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。
标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。
【 规则 18 】标识符的长度应当符合“min-length && max-information”原则。
几十年前老ANSI C规定名字不准超过6个字符,现今的C++/C不再有此限制。一般来说,长名字能更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为怪。那么名字是否越长约好?不见得! 例如变量名maxval就比maxValueUntilOverflow好用。单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们通常可用作函数内的局部变量。
【 规则 19 】命名规则尽量与所采用的操作系统或开发工具的风格保持一致。
例如Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。别把这两类风格混在一起用。
【 规则 20 】程序中不要出现仅靠大小写区分的相似的标识符。
例如:
int x, X; // 变量x 与 X 容易混淆
void foo(int x); // 函数foo 与FOO容易混淆
void FOO(float x);
【 规则 21 】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。
【 规则 22 】变量的名字应当使用“名词”或者“形容词+名词”。
例如:
float value;
float oldValue;
float newValue;
【 规则 23 】全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。
例如:
DrawBox(); // 全局函数
box->Draw(); // 类的成员函数
【 规则 24 】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
例如:
int minValue;
int maxValue;
int SetValue(…);
int GetValue(…);
【 建议 25 】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。
3.2 简单的Windows应用程序命名规则
作者对“匈牙利”命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发。
【 规则 26 】类名和函数名用大写字母开头的单词组合而成。
例如:
class Node; // 类名
class LeafNode; // 类名
void Draw(void); // 函数名
void SetValue(int value); // 函数名
【 规则 27 】变量和参数用小写字母开头的单词组合而成。
例如:
BOOL flag;
int drawMode;
【 规则 28 】常量全用大写的字母,用下划线分割单词。
例如:
const int MAX = 100;
const int MAX_LENGTH = 100;
【 规则 29 】静态变量加前缀s_(表示static)。
例如:
void Init(…)
{

static int s_initValue; // 静态变量

}
【 规则 30 】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。

例如:
int g_howManyPeople; // 全局变量
int g_howMuchMoney; // 全局变量
【 规则 31 】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。
例如:
void Object::SetValue(int width, int height)
{

m_width = width;

m_height = height;

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


TAG: 习惯

 

评分:0

我来说两句

显示全部

:loveliness::handshake:victory::funk::time::kiss::call::hug::lol:'(:Q:L;P:$:P:o:@:D:(:)

Open Toolbar