匈牙利命名法对软件工程师有百弊而无一利
匈牙利命名法对程序员有百弊而无一利。
初学MFC的人,好像都有种感觉,被长长的变量名称弄得昏头转向,但两年后回过头一看,不就是那100多个类吗?
QT类库比它大得多,但学QT如行云流水,感觉很清爽。java类库比MFC大何止百倍,也不感觉有多少障碍。
到底是什么造成了学MFC如此费力、蹩脚,经过反思比较,偶以为这个糟糕的匈牙利命名法起到了极为恶劣的破坏性作用。
1. 匈法给变量名附加上类型名前缀,例如:nFoo,szFoo,pFoo,cpFoo分别表示整型变量,字符串型变量,指针型变量和常指针型变量。可以看出,匈法将变量的类型信息从单一地点(声明变量处)复制到了多个地点(使用变量处),这是冗余法。冗余法的成本之一是要维护副本的一致性。这个成本在编写和维护代码的过程中需要改变变量的类型时付出。冗余法的成本之二是占用了额外的空间,影响了程序员的视觉,导致理解变量含义需要拐个弯。
例如 strcpy(pstrSource,pcstrDest)
程序员要从变量名称中剔除“pstr”之类的前缀找到Source、Dest才能理解变量含义。
相比 strcpy(source,dest) 到底哪个优越?不要说匈法能“提示变量类型、避免的程序员出错”的所谓优点,如果连参数类型都搞不清楚,还算什么程序员?有疑问直接查文档好了,再说如果你不知道参数含义的话,即使你知道参数类型,你敢随便用吗?还不是一样要查文档?变量的命名,首要就是简洁,含义明确,把多方面的类型信息掺杂进变量名称有百害而无一利。
------最佳解决方案--------------------
传说中的月经贴.
------其他解决方案--------------------
只接分不发言
------其他解决方案--------------------
匈牙利命名法把不到200个类的MFC基础类库,搞得比上万个类的java基本类库还看着繁琐、碍眼,这到底算一大贡献还是一大搅屎棍子。
------其他解决方案--------------------
仁者见仁,智者见智啦
------其他解决方案--------------------
接分。。。
------其他解决方案--------------------
回头看就那么不到200个类,但QT类库学起来就那么清爽呢?
不信大家可以试验一下,把QT类库用匈牙利命名法重新进行命名,马上QT就变得面目狰狞、让人望而生畏,好像一堆刺猬蹲在你面前。
------其他解决方案--------------------
有道理。没办法已经习惯了。
------其他解决方案--------------------
MFC类看着繁琐、碍眼,那是一些其他机制导致的,宏、消息映射等等,关变量啥事?
strcpy(pstrSource,pcstrDest) 如果这个你都看不懂,只能说你差
你觉得QT看着清爽,我觉得MFC看着清爽,只能说你平时看QT多一些,我平时看MFC多一些,何必厚此薄彼?
照你这么说,变量定义也不用区分类型了,如果编译器连类型都识别不了,那还叫啥编译器,是不?
------其他解决方案--------------------
本质是“高手崇拜问题”,某个高手(还未必是所有高手,很多高手也很烦这个匈牙利,更不用说广大中低手)习惯某种命名规范,又利用自己的影响力将其变成自己所在公司的命名规范,又由于这个公司不断强大成为全球霸主,该命名规范成为全球命名规范。
------其他解决方案--------------------
strcpy(pstrSource,pcstrDest)显然比strcpy(source,dest)的信息量要大,尤其在多个重载函数的情况下,这种信息至关重要,相信你也遇到过
------其他解决方案--------------------
也没有楼主说得那么夸张吧,MFC类库说实话也谈不上有多复杂啊,各人的习惯吧
------其他解决方案--------------------
不要厚此薄彼,每种技术都有自己的特点,百弊而无一利,你说的太夸张了
------其他解决方案--------------------
“不要说匈法能“提示变量类型、避免的程序员出错”的所谓优点,如果连参数类型都搞不清楚,还算什么程序员?有疑问直接查文档好了”
对于这句话我很不赞同~~
比如一个方法只有一个参数
但是通过重载,这个参数可以是很多种类型
此时调用这个方法,LZ又怎么知道参数的类型?
当然,现在的编辑器已经很智能,
鼠标一移上去就知道它的定义,
但是如果每次都移动鼠标,这总不好吧~~
------其他解决方案--------------------
不明真相的群众,手拿酱油瓶,紧张的围观着
------其他解决方案--------------------
呵呵,我的代码变量类型要么不写,要么写在后面。
比如
int yearint;
CString yearstr;
------其他解决方案--------------------
初学MFC的人,好像都有种感觉,被长长的变量名称弄得昏头转向,但两年后回过头一看,不就是那100多个类吗?
QT类库比它大得多,但学QT如行云流水,感觉很清爽。java类库比MFC大何止百倍,也不感觉有多少障碍。
到底是什么造成了学MFC如此费力、蹩脚,经过反思比较,偶以为这个糟糕的匈牙利命名法起到了极为恶劣的破坏性作用。
1. 匈法给变量名附加上类型名前缀,例如:nFoo,szFoo,pFoo,cpFoo分别表示整型变量,字符串型变量,指针型变量和常指针型变量。可以看出,匈法将变量的类型信息从单一地点(声明变量处)复制到了多个地点(使用变量处),这是冗余法。冗余法的成本之一是要维护副本的一致性。这个成本在编写和维护代码的过程中需要改变变量的类型时付出。冗余法的成本之二是占用了额外的空间,影响了程序员的视觉,导致理解变量含义需要拐个弯。
例如 strcpy(pstrSource,pcstrDest)
程序员要从变量名称中剔除“pstr”之类的前缀找到Source、Dest才能理解变量含义。
相比 strcpy(source,dest) 到底哪个优越?不要说匈法能“提示变量类型、避免的程序员出错”的所谓优点,如果连参数类型都搞不清楚,还算什么程序员?有疑问直接查文档好了,再说如果你不知道参数含义的话,即使你知道参数类型,你敢随便用吗?还不是一样要查文档?变量的命名,首要就是简洁,含义明确,把多方面的类型信息掺杂进变量名称有百害而无一利。
------最佳解决方案--------------------
传说中的月经贴.
------其他解决方案--------------------
只接分不发言
------其他解决方案--------------------
匈牙利命名法把不到200个类的MFC基础类库,搞得比上万个类的java基本类库还看着繁琐、碍眼,这到底算一大贡献还是一大搅屎棍子。
------其他解决方案--------------------
仁者见仁,智者见智啦
------其他解决方案--------------------
接分。。。
------其他解决方案--------------------
回头看就那么不到200个类,但QT类库学起来就那么清爽呢?
不信大家可以试验一下,把QT类库用匈牙利命名法重新进行命名,马上QT就变得面目狰狞、让人望而生畏,好像一堆刺猬蹲在你面前。
------其他解决方案--------------------
有道理。没办法已经习惯了。
------其他解决方案--------------------
MFC类看着繁琐、碍眼,那是一些其他机制导致的,宏、消息映射等等,关变量啥事?
strcpy(pstrSource,pcstrDest) 如果这个你都看不懂,只能说你差
你觉得QT看着清爽,我觉得MFC看着清爽,只能说你平时看QT多一些,我平时看MFC多一些,何必厚此薄彼?
照你这么说,变量定义也不用区分类型了,如果编译器连类型都识别不了,那还叫啥编译器,是不?
------其他解决方案--------------------
本质是“高手崇拜问题”,某个高手(还未必是所有高手,很多高手也很烦这个匈牙利,更不用说广大中低手)习惯某种命名规范,又利用自己的影响力将其变成自己所在公司的命名规范,又由于这个公司不断强大成为全球霸主,该命名规范成为全球命名规范。
------其他解决方案--------------------
strcpy(pstrSource,pcstrDest)显然比strcpy(source,dest)的信息量要大,尤其在多个重载函数的情况下,这种信息至关重要,相信你也遇到过
------其他解决方案--------------------
也没有楼主说得那么夸张吧,MFC类库说实话也谈不上有多复杂啊,各人的习惯吧
------其他解决方案--------------------
不要厚此薄彼,每种技术都有自己的特点,百弊而无一利,你说的太夸张了
------其他解决方案--------------------
“不要说匈法能“提示变量类型、避免的程序员出错”的所谓优点,如果连参数类型都搞不清楚,还算什么程序员?有疑问直接查文档好了”
对于这句话我很不赞同~~
比如一个方法只有一个参数
但是通过重载,这个参数可以是很多种类型
此时调用这个方法,LZ又怎么知道参数的类型?
当然,现在的编辑器已经很智能,
鼠标一移上去就知道它的定义,
但是如果每次都移动鼠标,这总不好吧~~
------其他解决方案--------------------
不明真相的群众,手拿酱油瓶,紧张的围观着
------其他解决方案--------------------
呵呵,我的代码变量类型要么不写,要么写在后面。
比如
int yearint;
CString yearstr;
------其他解决方案--------------------