首先我不是C++的专家,甚至可以说我是新手。其次我没有看过专门讲程序规范的书,这里所谈到的主要是平时看书时随时记下的或者多年写程序的经验。我工作的地方对程序风格的要求也没有一些公司要求的那么严,所以文中肯定有很多不对的地方,希望大家指正。
说起程序规范,内容实在太多了,这里先浅谈一点变量命名规范吧。
变量的命名十分重要,如果你在一个较大的项目中写程序,或者希望自己现在写好的程序几个月后任何人拿来都能清晰的看懂,命名规范是不可缺少的。
先说的第一点就是名字本身一定要有意义,让人看了这个变量就知道他是干什么的。这大概是几年前我看一本Java的书时提到的,其中重点强调的就是人们写程序循环或者临时用一下的变量总将其命名为int i, j , k之类的,这是个极坏的习惯,改掉这个毛病之后我发现自己的程序易读性增强了很多。一次我们组一个很聪明的同事写一段比较复杂的字符串分析的程序,所有字符指针都用char *i, *j, *k来表示,由于分析比较复杂,当他用到char *n的时候终于受不了了。把每个变量都按照他的意义重写。字串中第一此出现逗号的位置就叫 char *pchrFirstComma, 等等,一下子程序显得清晰了无数。建议大家都这么作。真的是临时用一下就扔掉的临时变量就叫int intTemp, 或者float fTemp之类的。
第二点大概是用VC++用多了的习惯,就是所有的成员变量前面都写一个m_,这样很清楚的区分开个成员变量和临时变量,不会出现以下情况
class A
{
A(int intNumber);
int intNumber;
}
A:A(int intNumber)
{
//这里intNumber到底是成员变量还是;临时变量?当然你可以分析出来,再用this->来区分,但是这完全是无用功,如果变量名起的好,这个问题根本就不会出现。
}
第三点是变量名前面最好用几个字母表示其类型。微软提倡的是他们的一位传奇工程师流下的规范,?quot;Hungarian notation",大概翻译成匈牙利命名法,整数用int,浮点数用flt,字符用chr。我觉得三个字母的限制有时后有些太局限,就自己加了些自己能懂得。显然CString和string都很符合叫str,最好自己规定清楚。有时候数据是个很复杂的class的vector,我会起个超长的名字。
第四是全局变量,这在C++中是最不被推荐的,如果一定有必要,最好用static class之类的包起来。
第五是全局常量,用全局常量无可厚非,但不小心的话也会出现混乱。比如我定义了一个全局变量叫const int intTotalStepNumber = 8;下次我再写程序的时候某个函数大概也需要意思差不多的临时变量,只要还是我来写,就肯定还会命名成intTotalStepNumber,不一定什么时候这两个名字就会混淆。最保险的办法是给全局常量加一个namespace
namespace Programinfo
{
const int intTotalStepNumber = 8;
};
这样用的时候就不会混淆了,临时变量叫intTotalStepNumber,全局变量叫Programinfo::intTotalStepNumber
最后说一下scope。人们都说变量随时用随时定义会节约空间。其实这不是绝对的。没准能省一点点,但同时增加了不少危险。具体performance怎么样还要具体分析。不是个一句话旧能说清的。但由此出现的问题是变量名的混淆。下面是我犯过的一个错误。
AA::funA()
{
int intStepNumber=GetStepNumber();
.... 一大堆程序
....N天后加了这么一段
if ()
{
... 又过了N天,在这加一段,大概早就忘了intStepNumber已经定义过了,虽说函数大小最好别超过一篇纸的长度,你也不能指望我每张纸都读的丝毫不差呀。
int intStepNumber;
....3N天之后。
if (intStepNumber == ???)
// 这就等着crash 吧,因为intStepNumber = -34567
}
}
所以尽量在合理的时候把变量名写在同一个scope下会安全很多,因为要用前缀或后缀区分scope不是很方便的。
先写到这里,以后在随时整理。
[此贴子已经被作者于2006-4-29 10:21:49编辑过]