西西河

主题:随便说说c++的这次吵架 -- 透明

共:💬71 🌺370
全看分页树展 · 主题 跟帖
家园 你说得对

我其实是想说VC++5.0。我是觉得说MFC 5.0的时候有点别扭。

Visual Studio, C++编译器, COM的版本一直不一致。

MFC一开始是想做一Windows下的应用程序框架,所以一开始命名很多Afx的宏和类名。Stephen(就是那个把鲍尔默从Vista拯救出来,领导Win 7, 后来有功高震主被开的那个) 回忆说,他们一开始一直想着是怎么把 C++ 的所有特性功能都用上(那时C++还是很fancy,很酷,也没标准化)。直到项目一再延期,他们才认识到他们是在开发一个产品而不是展现语言功能。

MFC在OOP封装上是很失败的,可以说完全没有封装好,处处漏风,类之间的耦合很紧,到处是内部实现的泄露,导致一不小心就GDI资源或者内存泄漏。基本上徒有OOP的外表而没有实质。我猜C++内存泄漏的名声很大部分是MFC的功劳。估计很大一部分人第一次听说内存泄漏都是写MFC程序的时候。

MFC目标是一个应用程序框架,实际上因为功能不完整,也半途而废,最终基本是一个GUI框架。比如你说的消息传递机制,实际上只在写GUI窗口的时候用上。

而就它的实际作为GUI功能而言, WTL的设计要好的多,封装上有一致性,拥不拥有资源从命名上很清楚,实现简单,十来个header文件。google chrome 的 windows 版,大多数杀毒软件的界面,VMWare这些都是基于WTL。

匈牙利命名法错误在于把变量类型嵌入到变量命名,导致阅读困难,也难扩展(除了POD,类型缩写因人而异),而且重构也不变,把一个变量比如一开始用整型表示一个Id:int iId,后来重构到类ID后:ID iId会显得莫名其妙。

我们现在以穿越的形式,说它一无是处,不是因为吃饱了打厨子,是总结经验教训, MFC的毛病很大程度上是历史局限性,那时C++还没标准化,纯OOP的语言也没有(现在有了C#, .NET API的封装好多了)。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河