变量命名法

http://www.360doc.com/content/13/0828/12/11843090_310450083.shtml

http://baike.baidu.com/link?url=INdIZO73xh4rGaexAOLQUWdDYKCy-NMgzHS4B2Fd_A-AB-hGICIfUVbdZfNpJI3x

1.变量名只能是字母(A-Z,a-z)、数字(0-9)或下划线。 
 2.第一个字母不能是数字,例如2Lerver这不是一个合法的C++变量。  3.不能是c++关键字,例如不能用class这个单词来命名一个变量。  4.区分大小写,例如iA和ia是两个不同的变量。 
理论上,在遵守了上面几条规则的前提下,所声明的变量名称都是合法的。比如下面的命名: 
char  xueshengming[20];    //学生名 
char  a;                   //命名一个字符,但变量名毫无意义 
这样的变量命名尽管是合法的,但可读性非常差。正规的软件公司,对于变量命名往往都有自己的一个推荐规范。不同公司的规范又会有一些差别。当一个程序员从一个公司跳槽到另一个公司,甚至会出现不习惯新公司代码规范的现象。 
 万事万物,要是有一个统一的规范,也许程序员这个行业会少一些烦恼。俗话说得好:没有规矩,不成方圆。以下是笔者多年编码得出的变量命名的心得体会,在此总结如下,并奢望有招一日能成为行业规范。  
变量命名的宗旨: 
一、用最短的字符表示最多的意义。 
int iPosX;     //Pos表示位置,X表示横坐标 //个人比较喜欢用n做前缀 二、使用变量前缀 
在变量前带上小写前缀可以很直观的看出变量的数据类型,而不必到变量的定义处去查看。常用的数据类型推荐变量前缀: 
1.整型的前缀 
short sValue;     //s为short的前缀 int iAge;         //i为int的前缀 
unsigned int uiAge;   //ui为unsigned int的前缀(两个单词的首字母) //也有用u做前缀的 
long lValue;      //l为long的前缀 2.浮点型的前缀 
float fScore;    //f为float的前缀 

http://baike.baidu.com/link?url=INdIZO73xh4rGaexAOLQUWdDYKCy-NMgzHS4B2Fd_A-AB-hGICIfUVbdZfNpJI3x


匈牙利命名法是一种编程时的命名规范。基本原则是: 变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。
中文名
匈牙利命名法
基本原则
变量名=属性+类型+对象描述
命    名
容易记忆容易理解的原则
原    则
保证名字的连贯性

目录

1简介

  例子
  历史

2变量属性

3举例

4总结

5反对声音

  成本
  收益
  实施

1简介编辑

例子

举例来说,表单的名称为form,那么在 匈牙利命名法中可以简写为frm,则当表单 变量名称为Switchboard时,变量全称应该为 frmSwitchboard。这样可以很容易从 变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成 lblSwitchboard。可以看出, 匈牙利命名法非常便于 记忆,而且使 变量名非常清晰易懂,这样,增强了 代码的可读性,方便各程序员之间相互交流代码。
Charles Simonyi Charles Simonyi

历史

据说这种命名法是一位叫 Charles Simonyi 的 匈牙利程序员发明的,后来他在 微软呆了几年,于是这种命名法就通过 微软的各种产品和文档资料向世界传播开了。大部分 程序员不管自己使用什么 软件进行开发,或多或少都使用了这种命名法。这种命名法的出发点是把 变量名按:属性+类型+对象描述的顺序组合起来,以使程序员作变量时对变量的类型和其它属性有直观的了解,下面是HN变量命名规范。

2变量属性编辑

属性部分
c_   常量
m_  c++类 成员变量
s_   静态变量
类型部分:
数组 a
指针 p
函数 fn
无效 v
句柄 h
长整型 l
布尔 b
浮点型(有时也指文件) f
双字  dw
字符串  sz
短整型  n
双精度浮点 d
计数 c(通常用cnt)
字符 ch(通常用c)
整型 i(通常用n)
字节 by
字 w
实型 r
无符号 u
描述部分
最大 Max
最小 Min
初始化 Init
临时变量 T(或Temp)
源对象 Src
目的对象 Dest

3举例编辑

hwnd : h 是类型描述,表示句柄, wnd 是 变量对象描述,表示窗口,所以 hwnd 表示 窗口句柄
pfnEatApple : pfn 是类型描述,表示指向函数的 指针, EatApple 是 变量对象描述,所以它表示指向 EatApple 函数的函数 指针变量
g_cch : g_ 是属性描述,表示 全局变量,c 和 ch 分别是计数类型和 字符类型,一起表示变量类型,这里忽略了对象描述,所以它表示一个对字符进行计数的全局变量。
上面就是HN命名法的一般规则。

4总结编辑

MFC、句柄、控件及结构的命名规范:
Windows类型 样本变量;MFC类 样本变量
HWND hWnd; CWnd* pWnd;
HDLG hDlg; CDialog* pDlg;
HDC hDC; CDC* pDC;
HGDIOBJ hGdiObj; CGdiObject* pGdiObj;
HPEN hPen; CPen* pPen;
HBRUSH hBrush; CBrush* pBrush;
HFONT hFont; CFont* pFont;
HBITMAP hBitmap; CBitmap* pBitmap;
HPALETTE hPaltte; CPalette* pPalette;
HRGN hRgn; CRgn* pRgn;
HMENU hMenu; CMenu* pMenu;
HWND hCtl; CState* pState;
HWND hCtl; CButton* pButton;
HWND hCtl; CEdit* pEdit;
HWND hCtl; CListBox* pListBox;
HWND hCtl; CComboBox* pComboBox;
HWND hCtl; CScrollBar* pScrollBar;
HSZ hszStr; CString pStr;
POINT pt; CPoint pt;
SIZE size; CSize size;
RECT rect; CRect rect;
一般前缀命名规范:
前缀&类型&实例
C 类或结构 CDocument, CPrintInfo
m_  成员变量 m_pDoc,m_nCustomers
变量命名规范:
前缀&类型&描述&实例
ch char 8位字符 chGrade
ch TCHAR 如果_UNICODE定义,则为16位 字符 chName
b BOOL  布尔值 bEnable
n int  整型(其大小依赖于 操作系统) nLength
u UINT 无符号值(其大小依赖于 操作系统) uHeight
w WORD 16位无符号值 wPos
l LONG 32位有符号整型 lOffset
dw DWORD 32位无符号整型 dwRange
p *  指针 pDoc
lp FAR* 远 指针 lpszName
lpsz LPSTR 32位字符串指针 lpszName
lpsz LPCSTR 32位 常量字符串指针 lpszName
lpsz LPCTSTR 如果_UNICODE定义,则为32位 常量字符串指针 lpszName
h handle Windows对象句柄 hWnd
lpfn callback 指向CALLBACK函数的 远指针
前缀_符号类型:
前缀_符号类型实例&范围
IDR_ 不同类型的多个资源共享标识 IDR_MAIINFRAME 1~0x6FFF
IDD_ 对话框资源 IDD_SPELL_CHECK 1~0x6FFF
HIDD_ 对话框资源的Help上下文 HIDD_SPELL_CHECK 0x20001~0x26FF
IDB_ 位图资源 IDB_COMPANY_LOGO 1~0x6FFF
IDC_ 光标资源 IDC_PENCIL 1~0x6FFF
IDI_ 图标资源 IDI_NOTEPAD 1~0x6FFF
ID_ 来自菜单项或 工具栏的命令 ID_TOOLS_SPELLING 0x8000~0xDFFF
HID_ 命令Help上下文 HID_TOOLS_SPELLING 0x18000~0x1DFFF
IDP_  消息框提示 IDP_INVALID_PARTNO 8~0xDEEF
HIDP_  消息框Help上下文 HIDP_INVALID_PARTNO 0x30008~0x3DEFF
IDS_ 串资源 IDS_COPYRIGHT 1~0x7EEF
IDC_ 对话框内的控件 IDC_RECALC 8~0xDEEF
Microsoft MFC宏命名规范:
名称&类型
_AFXDLL 唯一的 动态连接库(Dynamic Link Library,DLL)版本
_ALPHA 仅编译DEC Alpha处理器
_DEBUG 包括诊断的调试版本
_MBCS 编译多字节 字符集
_UNICODE 在一个 应用程序中打开Unicode
AFXAPI MFC提供的函数
CALLBACK 通过指针回调的函数
标识符 命名法:
标识符&值和含义
u ANSI(N)或Unicode(U)
d 调试或发行:D = 调试;忽略 标识符为发行。
静态库版本命名规范:
库&描述
NAFXCWD.LIB 调试版本:MFC静态连接库
NAFXCW.LIB 发行版本:MFC静态连接库
UAFXCWD.LIB 调试版本:具有Unicode支持的MFC 静态连接库
UAFXCW.LIB 发行版本:具有Unicode支持的MFC 静态连接库
动态连接库命名规范:
名称&类型
_AFXDLL 唯一的 动态连接库(DLL)版本
WINAPI Windows所提供的函数
Windows.h中新的命名规范:
类型&定义描述
WINAPI 使用在API声明中的FAR PASCAL位置,如果正在编写一个具有导出API人口点的DLL,则可以在自己的API中使用该类型
CALLBACK 使用在 应用程序回叫例程,如窗口和对话框过程中的FAR PASCAL的位置
LPCSTR 与LPSTR相同,只是LPCSTR用于只读串 指针,其定义类似(const char FAR*)
UINT 可移植的无符号整型类型,其大小由主机环境决定(对于Windows NT和Windows 9x为32位);它是unsigned int的同义词
LRESULT 窗口程序返回值的类型
LPARAM 声明lParam所使用的类型,lParam是窗口程序的第四个参数
WPARAM 声明wParam所使用的类型,wParam是窗口程序的第三个参数
LPVOID 一般 指针类型,与(void *)相同,可以用来代替LPSTR

5反对声音编辑

匈牙利命名法是一种编程时的命名规范。命名规范是程序书写规范中最重要也是最富争议的地方,自古乃 兵家必争之地。命名规范有何用?四个字:名正言顺。用二分法,命名规范分为好的命名规范和坏的命名规范,也就是说名正言顺的命名规范和 名不正言不顺的命名规范。好的舞鞋是让舞者感觉不到其存在的舞鞋,坏的舞鞋是让舞者带着镣铐起舞。一个坏的命名规范具有的破坏力比一个好的命名规范具有的创造力要大得多。
有人认为, 匈牙利命名法是一个坏的命名规范。举例说明。以 静态强类型编程语言为例,分析范本为C语言和C++语言。下文中的匈法为 匈牙利命名法的简称。

成本

匈法的表现形式为给 变量名附加上 类型名前缀,例如:nFoo,szFoo,pFoo,cpFoo分别表示 整型变量,字符串型变量, 指针型变量和常指针型变量。可以看出,匈法将 变量的类型信息从单一地点(声明变量处)复制到了多个地点(使用变量处),这是冗余法。冗余法的成本之一是要维护副本的一致性。这个成本在编写和维护代码的过程中需要改变 变量的类型时付出。冗余法的成本之二是占用了额外的空间。一个优秀的书写者会自觉地遵从一个法则:代码最小组织单位的长度以30个自然行以下为宜,如果超过50行就应该重新组织。一个 变量的书写空间会给这一法则添加不必要的难度。

收益

匈牙利命名法的收益是含糊的,无法预期的。
范本1:strcpy(pstrFoo,pcstrFoo2) Vs strcpy(foo,foo2)
没有一个程序员会承认自己不知道strcpy函数的参数类型,所以收益为零。
范本2:unknown_function(nFoo) Vs unknown_function(foo)
收益仍是没有的。对于一个不知道确定类型的函数, 程序员应该去查看该函数的文档,这是一种成本。使用匈法的唯一好处是看代码的人知道这个函数要求一个整型参数,这没有任何用处。函数是一种接口,参数的类型仅仅是接口中的一小部分。诸如函数的功能、出口信息、 线程安全性、异常安全性、参数合法性等重要信息还是必须查阅文档。
范本3:nFoo=nBar Vs foo=bar
使用匈法的唯一好处是看代码的人知道这里发生了一个 整型变量的复制动作,听起来没什么问题,可以安心了。如果他看到的是nFoo=szBar,就没办法放心下来了。但是事情并非如此。首先出现问题的应该是 编译器。另一方面,nFoo=nBar只是在语法上合法而已,看代码的人真正关心的是语义的合法性,匈法对此毫无帮助。另一方面,一个优秀的书写者会自觉地遵从一个法则:代码最小组织单位中的临时 变量以一两个为宜,如果超过三个就应该重新组织。结合前述第一个法则,可以得出这样的结论:易于理解的代码本身就应该是易于理解的,这是代码的内建高质量。好的命名规范对内建高质量的助益相当有限,而坏的命名规范对内建高质量的损害比人们想象的要大。

实施

匈牙利命名法在C语言是难以实施的,在C++语言中是无法实施的。
匈法是类型系统的冗余,所以实施匈法的关键是我们是否能够精确地对类型系统进行复制。这取决于类型系统的复杂性。
C语言:
1.内置类型:int,char,float,double 复制为 n,ch,f,d?好像没有什么问题。但是void应该怎么表示,匈法做不到。
2.组合类型:array,union,enum,struct 复制为 a,u,e,s?并不方便。
这里的难点不是为主类型取名,而是为副类型取名。an表示整型 数组?sfoo,sbar表示结构foo,结构bar?ausfoo表示联合结构foo数组?非常冗繁。
3.特殊类型:pointer。pointer在理论上应该是组合类型,但是在C语言中可以认为是内置类型,因为C语言并没有非常严格地区分不同的 指针类型。
C++语言:
1.class:如果说C语言中的struct还可以用stru搪塞过去的话,不要梦想用cls来搪塞C++中的class。严格地讲,class根本就并不是一个类型,而是创造类型的工具,在C++中,语言内置类型的数量和class创造的用户自定义类型的数量相比完全可以忽略不计。stdvectorFoo表示标准库向量类型变量Foo,是不合乎逻辑的。
2.命名空间:boostfilesystemiteratorFoo,表示boost空间filesystem子空间遍历目录类型 变量Foo,依旧不可行。
3.模板:std::map<std::string,std::string>类型的确切名字是什么,已经超过了255个字符。
4.模板参数:template <class T, class BinaryPredicate>const T& max(const T& a, const T& b, BinaryPredicate comp) 这一条来用 匈牙利命名法命名,难度极大。
5.类型修饰:static,extern,mutable,register,volatile,const,short,long,unsigned 加上类型修饰,更是难上加难。
匈牙利命名法有其优点但也有缺点,这就需要在使用中扬长避短,合理应用它。




























double dValue;   //d为double的前缀 3.字符型的前缀 
char cChar;      //c为char的前缀 //个人喜欢用a做前缀 
TCHAR tcChar      //多字节字符和Unicode字符兼容类型的前缀tc wchar_t  wcChar   //宽字符前缀wc 4.字符串的前缀 
char szName[30];  //sz为C语言字符串的前缀 string strName;   //str为C++字符串变量的前缀 CString strInfo;  //str为MFC字符串变量的前缀 5.布尔型的前缀 
bool bPass;      //b为bool的前缀 6.指针型的前缀  
 int *pValue;    //p为指针的前缀 
说明:由于指针是指向一定数据类型的变量,因此p后面要不要再加一个前缀一直让我举棋不定。如果再加上前缀比如:      int * piKey;   
char * pszInfo; 
这样似乎意义更完整,但势必会增加变量的字符长度。因此,这里就不硬性规定了。但是,指针变量以p开头应该是雷也打不动的。 
7.数组的前缀   int arrNum[10];  //arr为数组的前缀 
 
说明:和指针变量一样,arr后是否再加数组元素的数据类型前缀取决于你自己。 string arrstrName[3];  //C++字符串数组,加上去似乎很别扭 8.枚举变量的前缀  
 enum  emWeek;    //em为枚举变量的前缀 
9.结构变量的前缀:t 
T_NODE  tNode;    //结构名称以T_开头 10.字节变量的前缀:by BYTE  byInfo; 


















11.字变量的前缀 
DWORD  dwInfo;    //双字 WORD    wInfo;    //单字 12.字符指针的前缀 
LPCTSTR  ptszInfo;     //ptsz表示前缀,t表示TCHAR类型 LPCSTR  pszInfo; LPSTR  pszInfo; 13.STL容器类型前缀 vector<int>  vecValue;   
说明:vec表示vector容器的前缀,为了简化变量,变量体后面不再使用前缀 list<double>  lstInfo; 14.MFC绑定控件变量的前缀 
CEdit  m_ctlName;      //对象变量,变量体前统一用ctl表示 //个人喜欢用m_ctrl 
int    m_iAge;    //值变量,变量体有表示值数据类型的前缀 
说明:由于长短指针在32位操作系统后已无区别,所以不再区分,一律以p开头,这也与指针变量以p开头的原则贴得更近。 
15.矩形结构的前缀:rc RECT  rcClient;    CRect  rcWin; 
16.句柄对象一律以h开头 HWND hWndName; HBRUSH  hBr; HPEN  hPen; HBITMAP  hBmpBack; 
17.windows颜色类型的前缀:cr COLORREF crFront;    
18.windows中DC(设备上下文)类型的前缀 CClientDC  dcClient; 
三、类的成员变量以m_开头,后面为变量体,变量体依然要有前缀。 


















int  m_iDepth; 
四、定义一个变量,为了简化,在不影响变量意义的情况下,可以仅仅使用前缀。 RECT  rc; 
五、全局变量一律以g_开头,后面为变量体,变量体依然要有前缀。 int  g_iNums; 
六、定义结构体为了保证和C语言和C++的写法兼容性,一律采用typedef语句。 typedef   struct  tagINFO_NODE { 
int  iData; 
tagINFO_NODE *pNext; }T_INFO_NODE, *PT_INFO_NODE; 
七、变量体如果是多个单词,每个单词的首字母大写。 int iStudentAge; 
八、在意义明确的情况下可以仅仅使用首字母命名变量可以缩短变量名。 int iID; 
说明:仅使用首字母表示变量体的前提是保证变量的意义,比如变量iStudentAge如果声明成: 
int  iSA;         //这样将失去意义,不可取 九、定义一个类使用C作为类名的前缀。 class CStudent {     … };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值