C++中匈牙利命名法是否该淘汰
在C++中经常使用匈牙利命名法,这在早期是可理解的,那时开发环境(IDE)没有语法亮显和自动显示变量定义的功能,所以使用匈牙利命名法就能一眼看出变量是什么类型的。
说起匈牙利命名法,必须区分匈牙利应用命名法和匈牙利系统命名法,后者在前者基础上发展而来并盖过前者。
原始的匈牙利命名法,现在被称为匈牙利应用命名法,由1972年至1981年在施乐帕洛阿尔托研究中心工作的程序员查尔斯·西蒙尼发明。西蒙尼建议的大多数前缀都是自然语义的,其前缀是为了说明变量的应用属性或业务属性,例如“String dogName, manName;”;
而匈牙利系统命名法的前缀是为了说明变量的系统属性,比如类型,例如“String strName;”,系统命名法在从某种程度上来说是冗余的。
很多人讨厌匈牙利命名法,认为多此一举,看起来令人厌恶,其实应该归罪于微软,是微软Windows误导和糟蹋了匈牙利命名法。在第一个Windows API包推出时,微软在示例代码和API中大量使用由变量类型作前缀的命名法,由于微软强大的影响力,以至于非常多的软件都以此为标准。虽然西蒙尼在很早时就意识到这个问题,但他也无法阻挡这种趋势,只好和微软这种命名法划定界限,分出匈牙利应用命名法和匈牙利系统命名法。在微软内部,除了Word和Excel开发团队还在使用最原始的匈牙利应用命名法,其他团队和其他公司都在使用微软推出的匈牙利系统命名法。随时不断发展,基本上很少有人知道最初的匈牙利命名法了。后来很多人发现匈牙利系统命名法的缺点,大量攻击其缺陷,推荐大家不要再用匈牙利命名法,连同匈牙利应用命名法也一同受到否定。
我支持下列观点:
1. 一般不使用匈牙利系统命名法,不用前缀也能明白含义的就不用,其次是优先使用匈牙利应用命名法
a. int nCount --> count; (小写字母开头)
b. CString strPluginName --> pluginName; (其余单词首字母大写)
c. std::wstring wstrFileName --> filename or fileName; (如果变量名较短,可全部小写,只要不影响阅读)
d. int cxWin, cyWin; (使用表示应用属性或业务属性的小写字母做前缀)
e. char* tmpName; (匈牙利应用命名法)
2. 在使用MFC或Windows API时,可以使用匈牙利系统命名法,对于指针变量可使用p前缀
a. CListBox wndItems;
b. CPoint ptCursor; CRect rcBtn;
c. LPCTSTR pszName; or pName;
d. Cx_Interface<Ix_MyObj> pIFObj; Cx_Ptr objItem;
3. 遵循遗留系统及所在模块的已有习惯
如果是在遗留系统中做维护,应遵循已有代码所使用的标准,避免显得格格不入。如果所在开发小组已经习惯于某种命名法,则遵循,避免交流不一致,毕竟怎么命名与开发成败无关。