初学MFC的人,好像都有种感觉,被长长的变量名称弄得昏头转向,但两年后回过头一看,不就是那100多个类吗?
QT类库比它大得多,但学QT如行云流水,感觉很清爽。java类库比MFC大何止百倍,也不感觉有多少障碍。
到底是什么造成了学MFC如此费力、蹩脚,经过反思比较,偶以为这个糟糕的匈牙利命名法起到了极为恶劣的破坏性作用。
1. 匈法给变量名附加上类型名前缀,例如:nFoo,szFoo,pFoo,cpFoo分别表示整型变量,字符串型变量,指针型变量和常指针型变量。可以看出,匈法将变量的类型信息从单一地点(声明变量处)复制到了多个地点(使用变量处),这是冗余法。冗余法的成本之一是要维护副本的一致性。这个成本在编写和维护代码的过程中需要改变变量的类型时付出。冗余法的成本之二是占用了额外的空间,影响了程序员的视觉,导致理解变量含义需要拐个弯。
例如 strcpy(pstrSource,pcstrDest)
程序员要从变量名称中剔除“pstr”之类的前缀找到Source、Dest才能理解变量含义。
相比 strcpy(source,dest) 到底哪个优越?不要说匈法能“提示变量类型、避免的程序员出错”的所谓优点,如果连参数类型都搞不清楚,还算什么程序员?有疑问直接查文档好了,再说如果你不知道参数含义的话,即使你知道参数类型,你敢随便用吗?还不是一样要查文档?变量的命名,首要就是简洁,含义明确,把多方面的类型信息掺杂进变量名称有百害而无一利。
QT类库比它大得多,但学QT如行云流水,感觉很清爽。java类库比MFC大何止百倍,也不感觉有多少障碍。
到底是什么造成了学MFC如此费力、蹩脚,经过反思比较,偶以为这个糟糕的匈牙利命名法起到了极为恶劣的破坏性作用。
1. 匈法给变量名附加上类型名前缀,例如:nFoo,szFoo,pFoo,cpFoo分别表示整型变量,字符串型变量,指针型变量和常指针型变量。可以看出,匈法将变量的类型信息从单一地点(声明变量处)复制到了多个地点(使用变量处),这是冗余法。冗余法的成本之一是要维护副本的一致性。这个成本在编写和维护代码的过程中需要改变变量的类型时付出。冗余法的成本之二是占用了额外的空间,影响了程序员的视觉,导致理解变量含义需要拐个弯。
例如 strcpy(pstrSource,pcstrDest)
程序员要从变量名称中剔除“pstr”之类的前缀找到Source、Dest才能理解变量含义。
相比 strcpy(source,dest) 到底哪个优越?不要说匈法能“提示变量类型、避免的程序员出错”的所谓优点,如果连参数类型都搞不清楚,还算什么程序员?有疑问直接查文档好了,再说如果你不知道参数含义的话,即使你知道参数类型,你敢随便用吗?还不是一样要查文档?变量的命名,首要就是简洁,含义明确,把多方面的类型信息掺杂进变量名称有百害而无一利。
回头看就那么不到200个类,但QT类库学起来就那么清爽呢?
不信大家可以试验一下,把QT类库用匈牙利命名法重新进行命名,马上QT就变得面目狰狞、让人望而生畏,好像一堆刺猬蹲在你面前。
的确是不够清爽,但是楼主你晓得Windows刚刚起步的时候,编辑器还不够智能,没有Eclipse,Vs,Borland系列中的智能提示.
在一大堆函数中凭借匈牙利命名法的确可以降低阅读代码的难度.这是历史遗留问题,以及向后兼容问题,传说中的高手崇拜问题等等.楼主,哈?
strcpy(pstrSource,pcstrDest) 如果这个你都看不懂,只能说你差
你觉得QT看着清爽,我觉得MFC看着清爽,只能说你平时看QT多一些,我平时看MFC多一些,何必厚此薄彼?照你这么说,变量定义也不用区分类型了,如果编译器连类型都识别不了,那还叫啥编译器,是不?
strcpy(pstrSource,pcstrDest)比strcpy(source,dest)清爽?
比如
int yearint;
CString yearstr;
一般习惯都是
int year;
CString year;除非在一个块中需要区分一下。含义写在前面比写在后面强,至少人们看变量的时候,首先关注的是含义,含义明白了,类型也猜个八九不离十了。
sc(s,d) 超级清爽?
LZ 突然提个 匈牙利 是被 谁 要求了??
百弊无一利 这个词 你用的 也太 那个撒了? 专业砸场子的??MFC我觉得很清爽, 你站我面前,我能顺口给你念上 20~30个,没问题,顺手给你画个继承图 没问题。。
:)
你老糊涂了,看看Windows方面的经典著作,哪本不是用的匈牙利命名法,哪个作者不是高手,哪个高手烦他了,哪个高手跑到CSDN扔月经带了.
膜拜一下,同时求一个继承图
[email protected]
还是编程习惯问题,除了极其局部的几个严格统一的保留变量外(i,j,n,x,b,e...),没有说明前缀的变量绝对禁止
有本事你整个命名法出来?
楼主只见其表,未见其里。
C#是强类型语言,下面这样的语言是无法通过编译的。
int a = 1;
if ( a )
Console.WriteLine("Hello World.");而c++不同,类似的代码在mfc代码中可以编译通过。
既然程序员可能并不清楚if后面的括号里面是什么样的值,也许最好的办法就是在变量前加前缀。
这样可以避免不同类型混用所带来的潜在错误。
跨平台和/或通用库我用 the_int_variant
脚本语言我用 theIntVariant任何命名法都可以接受,没觉得哪个好哪个不好。
记得曾经在一个帖子里跟楼主争过数学在软件开发中的作用,你当时也是说,数学在软件开发中不但没有促进的作用,相反却是一种阻碍。真不知道你为什么会有这样的想法?
顶17楼!
楼主你错了,正确的写法应该是strcpy(pszSource, pszDest)!这才是正确的匈牙利写法!
我用了十多年MFC我觉得匈牙利表示法能够帮人快速了解参数信息,反倒是LZ的strcpy(source, dest)令人觉得难以理解!想象一下:如果source或dest是个对象而且它有个operator LPCTSTR()操作符重载呢?例如CString它有个LPCTSTR操作符重载,因此你可以这样
char src[100]
CString dest;
strcpy(src, dest);
这样写没有错,但是楼主,如果你习惯这样写的话你会中招的!例如
class CMyClass
{
LPVOID p;
CString s;
public:
CMyClass() { p = 0x01000; s = _T("test string"); }
operator LPCTSTR() { return (LPCTSTR)s; }
}CMyClass s;
sprintf("out string message %s", (LPCTSTR)s); // 正确!
sprintf("out string message %s", s); // 你中招了!所以有时候不要去怀疑前辈的做法,可能会暴露你自己的肤浅!他们可能会结合当时的实际情况才会使用这种方法的,而这种方法流行这么多年那肯定会有它的优点。
还是喜欢linux下面那种简介的命名