匈牙利命名法

来源:互联网 发布:金十数据怎么看原油 编辑:程序博客网 时间:2024/06/05 09:31
//匈牙利命名法  

这个方法可能很多人都听说过,包括我在内的一些人也试图去使用它,可是还是觉得自己的好,但是现在看来这种想法是错误的。再解释解释吧。这些符号可以多个同时使用,顺序是先m_,(这上标记指成员变量)再指针,再简单数据类型,再其他。例如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。

a Array //数组
b Boolean //布尔,逻辑
by Byte //字节,位
c Char //有符号型字符
cb Char Byte //无符号型字符(没多大用处)
cr ColorRef //颜色参考值
cx,cy Length of x,y (ShortInt) //坐标差(长度)
dw Double Word
fn Function
h Handle
i Integer //整数,整型
m_ Member of a class
n Short Integer
np Near Pointer
p Pointer
lp Long Pointer
s String
sz String with Zero End //以字符'\0'结尾的字符串
tm Text //文本内容
w Word
x,y Coordinate //坐标

类名一般没有说明字符,例如theApp. 用在其他类中加m_就行。要注意的是:某些类也有类似于匈牙利命名法的缩写。例如:CStatusBar m_wndStatusBar;这里的wnd表示窗口类,但是这种命名法不是标准的匈牙利命名法的一部分。

//匈牙利命名法

匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。  
举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为Switchboard时,变量全称应该为 frmSwitchboard。这样可以很容易从变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成 lblSwitchboard。可以看出,匈牙利命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代码。  

这种命名技术是由一位能干的Microsoft程序员查尔斯·西蒙尼 (Charles Simonyi) 提出的,他出生在匈牙利。在 Microsoft 公司中和他一起工作的人被教会使用这种约定。这对他们来说一切都很正常。但对那些 Simonyi 领导的项目组之外的人来说却感到很奇特,他们认为这是死板的表达方式,甚至说带有这样奇怪的外观是因为它是用匈牙利文写的。从此这种命名方式就被叫做匈牙利命名法。

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

属性部分
全局变量 g_     //global
常量 c_    //constant
c++类成员变量 m_    //member
静态变量 s_    //static

类型部分
指针 p
函数 fn
无效 v
句柄 h
长整型 l
布尔 b
浮点型(有时也指文件) f
双字 dw  
字符串 sz //String with Zero End
短整型 n
双精度浮点 d
计数 c(通常用cnt) //count
字符 ch(通常用c)
整型 i(通常用n)
字节 by   //byte
字 w   //word
实型 r //real type
无符号 u //unsigned

描述部分
最大 Max
最小 Min
初始化 Init // initialise
临时变量 T(或Temp)
源对象 Src //source
目的对象 Dest


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


//比较著名的命名规则当推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.1 共性规则
本节论述的共性规则是被大多数程序员采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则,如3.2节。


l 【规则3-1-1】标识符应当直观且可以拼读,可望文知意,不必进行“解码”。

标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。例如不要把CurrentValue写成NowValue。


l 【规则3-1-2】标识符的长度应当符合“min-length && max-information”原则。

几十年前老ANSI C规定名字不准超过6个字符,现今的C++/C不再有此限制。一般来说,长名字能更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为怪。那么名字是否越长约好?不见得! 例如变量名maxval就比maxValueUntilOverflow好用。单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们通常可用作函数内的局部变量。


l 【规则3-1-3】命名规则尽量与所采用的操作系统或开发工具的风格保持一致。

例如Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。别把这两类风格混在一起用。


l 【规则3-1-4】程序中不要出现仅靠大小写区分的相似的标识符。

例如:

int x, X; // 变量x 与 X 容易混淆

void foo(int x); // 函数foo 与FOO容易混淆

void FOO(float x);


l 【规则3-1-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。


l 【规则3-1-6】变量的名字应当使用“名词”或者“形容词+名词”。

例如:

float value;

float oldValue;

float newValue;


l 【规则3-1-7】全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。

例如:

DrawBox(); // 全局函数

box->Draw(); // 类的成员函数


l 【规则3-1-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。

例如:

int minValue;

int maxValue;


int SetValue(…);

int GetValue(…);


2 【建议3-1-1】尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。

3.2 简单的Windows应用程序命名规则
作者对“匈牙利”命名规则做了合理的简化,下述的命名规则简单易用,比较适合于Windows应用软件的开发。


l 【规则3-2-1】类名和函数名用大写字母开头的单词组合而成。

例如:

class Node; // 类名

class LeafNode; // 类名

void Draw(void); // 函数名

void SetValue(int value); // 函数名


l 【规则3-2-2】变量和参数用小写字母开头的单词组合而成。

例如:

BOOL flag;

int drawMode;


l 【规则3-2-3】常量全用大写的字母,用下划线分割单词。

例如:

const int MAX = 100;

const int MAX_LENGTH = 100;


l 【规则3-2-4】静态变量加前缀s_(表示static)。

例如:

void Init(…)

{

static int s_initValue; // 静态变量



}


l 【规则3-2-5】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。

例如:

int g_howManyPeople; // 全局变量

int g_howMuchMoney; // 全局变量


l 【规则3-2-6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。

例如:

void Object::SetValue(int width, int height)

{

m_width = width;

m_height = height;

}


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

变量的命名:  

    应用匈牙利表示法,变量可用上表中的前缀代码来表示。另外,当一个变量是由一个或几个子名构成时,每一个子名都要以大写字母开头。下面是几个例子:
 
    char *szfileName; //a nulla terminated string:以0终止的字符串
 
    int *lpidate;         //a 32-bit pointer to an int:指向一个整型变量的32位的长指针  

    Bool bSemaphore;  //a boolean value  

    WORD dwMaxCount;  //a 32-bit unsigned WORD  

    尽管我们了解一个函数的局部变量没有说明,但是也有个别表示全局变量必须要以 g_ 开头:  

    int g_iXPos;          //a global x-position
 
    int g_iTimer;         //a global y-position  

    char *g_szString;     //a global NULL terminated string

函数的命名:  

    函数和变量的命名方式相同,但是没有前缀,换句话说,子名的第一个字母要大写。下面是几个例子:  

    int PlotPixel(int ix,int iy,int ic);  

    void *MemScan(char *szString);  

    而且,下划线是非法的。例如,下面的函数名表示是无效的匈牙利表示法:
 
    int Get_Pixel(int ix,int iy);
 
类型和常量的命名:  

    所有的类型和常量都是大写字母,但名字中可以允许有下划线。如:
 
    const LONG NUM_SECTORS=100;      // a C++ style constant  

    #define MAX_CELLS ;            // a C style constant  

    #define POWERUNIT 100;           // a C style constant  

    typedef unsigned char UCHAR;     // a user defined type  

类的命名:  

    类命名的约定可能要麻烦一点。但我也看到有很多人在使用这个约定,并独立地进行补充。不管怎么说,所有C++的类必须以大写C为前缀,类名字的每一个子名的第一个字母都必须大写:
 
class CVector   // the chinese mean of vector is 矢量  
{  
public:  
    CVector();  
    {
        ix=iy=iz=imagnitude=0; //the chinese mean of magnitude is 大小
    }  
    CVector(int x, int y, int z)   
    {
        ix=x;
        iy=y;
        iz=z;
    }  
......  
private:  
    int ix,iy,iz;    //the position of the vector  
    int imagnitude; //the magnitude of the vector  
......  
}  

参数的命名:  

    函数的参数命名和标准变量命名的约定相同。但也不总是如此。如:
 
    UCHAR GetPixel(int x,int y);
 
    这种情况下,更准确的匈牙利的函数原型是:  

    UCHAR GetPixel(int ix,int iy);

小结:匈牙利命名法

匈牙利命名法

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
n  UINT  无符号值(其大小依赖于操作系统) nHeight
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  


a       Array                                 数组

  b       BOOL (int)                            布尔(整数)

  by      Unsigned Char (Byte)                  无符号字符(字节)

  c       Char                                  字符(字节)

  cb      Count of bytes                        字节数

  cr      Color reference value                 颜色(参考)值

  cx      Count of x (Short)                    x的集合(短整数)

  dw      DWORD   (unsigned long)                 双字(无符号长整数)

  f       Flags   (usually multiple bit values)   标志(一般是有多位的数值)

  fn      Function                              函数

  g_      global                                全局的

  h       Handle                                句柄

  i       Integer                               整数

  l       Long                                  长整数

  lp      Long pointer                          长指针

  m_      Data member of a class                一个类的数据成员

  n       Short int                             短整数

  p       Pointer                               指针

  s       String                                字符串

  sz      Zero terminated String                以0结尾的字符串

  tm      Text metric                           文本规则

  u       Unsigned int                          无符号整数

  ul      Unsigned long (ULONG)                 无符号长整数

  w       WORD (unsigned short)                 无符号短整数

  x,y     x, y coordinates (short)              坐标值/短整数

  v       void                                  空


有关项目的全局变量用g_开始,类成员变量用m_,局部变量若函数较大则可考虑用l_用以显示说明其是局部变量。

 前缀       类型       例子

g_    全局变量       g_Servers

C     类或者结构体       CDocument,CPrintInfo

m_   成员变量       m_pDoc,m_nCustomers

 
VC常用前缀列表:

前缀       类型       描述       例子

ch    char 8位字符    chGrade

ch    TCHAR       16位UNICODE类型字符       chName

b     BOOL       布尔变量       bEnabled

n     int    整型(其大小由操作系统决定)       nLength

n     UINT       无符号整型(其大小由操作系统决定)       nLength

w    WORD       16位无符号整型    wPos

l      LONG       32位有符号整型    lOffset

dw   DWORD       32位无符号整型       dwRange

p     *       Ambient memory model pointer 内存模块指针,指针变量    pDoc

lp     FAR*       长指针       lpDoc

lpsz  LPSTR       32位字符串指针       lpszName

lpsz  LPCSTR       32位常量字符串指针       lpszName

lpsz  LPCTSTR       32位UNICODE类型常量指针       lpszName

h     handle       Windows对象句柄       hWnd

lpfn  (*fn)()       回调函数指针 Callback Far pointer to CALLBACK function       lpfnAbort


原创粉丝点击