匈牙利命名法对程序员有百弊而无一利。
初学MFC的人,好像都有种感觉,被长长的变量名称弄得昏头转向,但两年后回过头一看,不就是那100多个类吗?
QT类库比它大得多,但学QT如行云流水,感觉很清爽。java类库比MFC大何止百倍,也不感觉有多少障碍。
到底是什么造成了学MFC如此费力、蹩脚,经过反思比较,偶以为这个糟糕的匈牙利命名法起到了极为恶劣的破坏性作用。
1. 匈法给变量名附加上类型名前缀,例如:nFoo,szFoo,pFoo,cpFoo分别表示整型变量,字符串型变量,指针型变量和常指针型变量。可以看出,匈法将变量的类型信息从单一地点(声明变量处)复制到了多个地点(使用变量处),这是冗余法。冗余法的成本之一是要维护副本的一致性。这个成本在编写和维护代码的过程中需要改变变量的类型时付出。冗余法的成本之二是占用了额外的空间,影响了程序员的视觉,导致理解变量含义需要拐个弯。
例如 strcpy(pstrSource,pcstrDest)
程序员要从变量名称中剔除“pstr”之类的前缀找到Source、Dest才能理解变量含义。
相比 strcpy(source,dest) 到底哪个优越?不要说匈法能“提示变量类型、避免的程序员出错”的所谓优点,如果连参数类型都搞不清楚,还算什么程序员?有疑问直接查文档好了,再说如果你不知道参数含义的话,即使你知道参数类型,你敢随便用吗?还不是一样要查文档?变量的命名,首要就是简洁,含义明确,把多方面的类型信息掺杂进变量名称有百害而无一利。