| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1680 人关注过本帖
标题:[原创]谈谈C++的程序规范--变量命名
只看楼主 加入收藏
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
 问题点数:0 回复次数:10 
[原创]谈谈C++的程序规范--变量命名

首先我不是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编辑过]

搜索更多相关主题的帖子: 变量 规范 
2006-04-29 10:19
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 

我没写过长的程序,所以虽知道这个很重要,但还没感到很迫切。
不过确实要注意,不好的习惯养成了,就不好改了。


2006-04-29 13:33
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
大家来顶一下吧

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-29 13:37
gototheworld
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2006-3-24
收藏
得分:0 
以下是引用everajax在2006-4-29 10:19:00的发言:

第五是全局常量,用全局常量无可厚非,但不小心的话也会出现混乱。比如我定义了一个全局变量叫const int intTotalStepNumber = 8;下次我再写程序的时候某个函数大概也需要意思差不多的临时变量,只要还是我来写,就肯定还会命名成intTotalStepNumber,不一定什么时候这两个名字就会混淆。最保险的办法是给全局常量加一个namespace
namespace Programinfo
{
const int intTotalStepNumber = 8;
};

这样用的时候就不会混淆了,临时变量叫intTotalStepNumber,全局变量叫Programinfo::intTotalStepNumber

my love
难得原创
看完你这篇文章,我想起了个你提的问题,如下:
需要定义一个structure,问下面哪个比较好,为什么。
struct A
{
char char1[5];
float fData;
long lData;
char char2[1];
};

struct B
{
long lData;
float fData;
char char1[5];
char char2[1];
};
B除了,看上去美观一点,我就说不出为什么了,请您指点,
谢谢。

[此贴子已经被作者于2006-5-2 16:57:43编辑过]


路漫漫其修远兮 吾将上下而求索
2006-04-29 14:35
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
回答楼上的问题,把这两个结构sizeof()一下比较,发现第一个比第二个大。为什么呢?大部份的操作系统存储的时候都是按字(2 byte)或双字(4 byte)存储。struct A存储的时候char1[5]占了五个byte,第六个放int不够,于是就费了。最后的char2[1]也浪费的1个。而struct B存了char1[5]之后正好剩下一个byte把char2[1]存进去,避免了存储的不连续性。

[此贴子已经被作者于2006-4-30 16:22:28编辑过]



http://myajax95./
2006-04-29 15:15
gototheworld
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2006-3-24
收藏
得分:0 

谢谢您,还有问题的
用VC6.0和DEV-C++得到sizeof(A) == 20,sizeof(B) == 16.
根据您楼上所说:
struct B
{
long lData;//4
float fData;//4
char char1[5];//
char char2[1];//char1,char2存储刚好用了6个byte.
};4++4+6==14 !=sizeof(B).
struct A
{
char char1[5];//如您所说这里费了1个字节。所以char1存储时应占6个字节
float fData;//4
long lData;//4
char char2[1];//同上,这里char2存储时也应该占2 bytes
};可是6+4+4+2 ==16 !=sizeof(A)
这是什么原因呢?自己真的太菜了,麻烦您再看一下,

[此贴子已经被作者于2006-4-29 15:54:36编辑过]


路漫漫其修远兮 吾将上下而求索
2006-04-29 15:48
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 

struct B
{
long lData;//4
float fData;//4
char char1[5];// 两个加一起 8 个
char char2[1];//
};

struct A
{
char char1[5];//8
float fData;//4
long lData;//4
char char2[1];//4
};

好象


2006-04-29 16:00
gototheworld
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2006-3-24
收藏
得分:0 
以下是引用woodhead在2006-4-29 16:00:00的发言:

struct B
{
long lData;//4
float fData;//4
char char1[5];// 两个加一起 8 个
char char2[1];//
};

struct A
{
char char1[5];//8这里怎么会是8,今天智商为0
float fData;//4
long lData;//4
char char2[1];//4
};

好象

请woodhead明示


路漫漫其修远兮 吾将上下而求索
2006-04-29 16:11
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
window 下4byte一存。

http://myajax95./
2006-04-29 16:25
gototheworld
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2006-3-24
收藏
得分:0 
醒过来了。
think you

[此贴子已经被作者于2006-4-29 16:44:43编辑过]


路漫漫其修远兮 吾将上下而求索
2006-04-29 16:29
快速回复:[原创]谈谈C++的程序规范--变量命名
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.047456 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved