我看MFC的过去、现在和未来

时间:2022-10-14 06:22:24

首先说句题外话,虽然我现在的“主业”是Qt,但自己扪心自问,对MFC的熟悉程度要超过Qt。正是由于有了对MFC的熟悉,才能在使用Qt时,比较清醒的认清两者的优劣之处,在此暂且不提。

 

这个话题也可以说是由来已久,众说纷纭,今时我也谈谈自己的感悟。

 

一、对MFC的总体看法

 

首先看看云风在其《游戏之旅-我的编程感悟》一书中对MFC的看法:

 

“我所见到的程序员中,很多把C++/VC/MFC一锅端,这或许造成了MFC在某一类高手群体中的坏名声。而另一方面,在许多初学编程的人群中,又把MFC看得过于神圣,“会用”MFC,“会用”VC的人变成了高人。还有一些程序员,耐心的学完了C甚至C++,但是却一直不屑于使用MFC写程序,认为微软的那些东西都是垃圾。MFC的结构复杂度让他们不肯像学习C++语言那样细心的学习。

 

MFC既不是天使,也不是恶魔。MFC是一个框架类库,它所做的不仅仅是封装了Windows API而已,而是引导程序员去使用一些设计模式来编写Windows程序。MFC由于历史原因,携带了许多不那么现代感的C++代码,但是它依旧是一个成功的、完全基于C++语言的框架类库。其设计总的来说是合理的,规模也在容易让程序员接受的范围内,没有仔细研究过MFC的程序员没有资格评论MFC的好坏。

 

我也同样相信,绝大多数指责MFC的程序员没有能力完成和MFC相当能力的类库。无论MFC的优劣,在Windows下用标准C++写带有Windows GUI的软件,除了MFC还真没有太多的选择(或许WTL算一个)。”

 

我认为云风的评价是比较客观和中肯的,其基本观点都是建立在深入的实践了解之上的。

 

但是,有几处我略有一些补充,主要是在最后一段。

 

一是:“绝大多数指责MFC的程序员没有能力完成和MFC相当能力的类库”,这句话本身是正确的,但是用于支撑观点就有些牵强,没有能力完成和MFC能力相当的类库,并不能作为程序员能否评价一款工具或是产品的理由,我们虽然做不到自己开发出来,但在使用过程中能够深刻的体验出其优缺点,并且提出讨论和建议,这是可以的;

 

二是:“在Windows下用标准C++写带有Windows GUI的软件,除了MFC还真没有太多的选择(或许WTL算一个)”,这句话本身也是正确的,只是我认为不甚全面-符合这个要求的软件有很多,除了MFC和WTL(中国的程序员中使用很少,世界上也未大面积流行)外,还有Qt,这是一个重量级的产品,开源并且是是KDE的核心和基础平台,以前只是作为一个类库提供,现在的Qt则是向全面的平台化工具进军了,被Nokia收购后,其发展速度一日千里,大有向Visual Studio、Java挑战之势;还有gtk+,这同样是重量级的选手,开源并且是GNOME的核心和基础平台,在Qt 4.5发布(改变授权方式,可以选择LGPL协议)以前,它是当之无愧的跨平台开发的首选工具之一。相比Qt,只是这两年步伐有些缓慢;还有wxWidget,这是一个风格与MFC很接近的跨平台开发类库,由于与MFC很类似,所以吸引了一部分有跨平台开发需求的用户;还有FLTK,这是使用C++编写的一个跨平台库,它支持目前主流的操作系统,它的目的是要达到非常轻,所以将它链接到应用程序只会对应用程序的内存空间产生很小的影响,这对比Qt是很有优势的;当然还有VCL,这个无需多言,VCL是Visual Component Library的缩写,即可视组件库,它是Delphi、C++Builder等编程工具的核心基本类库。它拥有封装纯粹,可扩展性强,操作方便等特点。如果是一个非常繁杂的Win32API,在经过VCL封装后,使用也是非常简便的。

 

如上述种种,其实还有好多的优秀跨平台GUI类库,这里就不一一列举了。总之,编写在跨平台程序中带有GUI的软件有非常多的选择,何况MFC还不能跨平台。

 

二、MFC的优势

 

我总结起来有几点:

 

1.微软官方出品

 

2.性能优良、稳定可靠

 

3.功能齐全,可以“包打天下”

 

4.产品支持完善

 

5.累积用户群数量庞大,市场接受程度高

 

6.第3方软件支持程度高,组件丰富

 

......

 

其实在市场上,MFC给人的感觉有点像大众汽车,它通常在某一个方面不是最强的,但都可以挤进前3甲,综合起来看整体,就是“无敌”了。

 

虽然有的朋友认为学习MFC有些难度,学习曲线也不是很平坦,甚至某些地方还有些陡峭,但这都不能成为阻挡其受欢迎的理由。就像云风所说,在业界,也包括游戏界,很多大公司开发高质量的桌面带有GUI的程序时,使用Visual Studio,使用MFC是首选。使用MFC开发出来的程序,性能好,稳定可靠,用户界面亲切,并且有大量的第3方组件可供选用,开源的和商业的都有,并且很成熟。换句话说,单单使用MFC开发出来的界面,也许不够那么现代,但是结合使用第3方组件库开发出来的程序界面,丝毫不逊于Delphi、Visual Basic、C#、Java等,甚至有过之而无不及。MFC发展到现在,已经形成了庞大的用户群和产业链,有的公司的产品就是“靠”在这条链上的,比如著名的BCG库和CodeJock的XT系列库,都是如此,它们给MFC的用户带来了美轮美奂的用户界面效果的同时,自己的业务也在不断精进。

 

三、MFC的不足

 

我总结出来有几点:

 

1.不能跨平台使用

 

2.由于设计年代较为久远,许多代码和程序结构不是那么“现代”和面向对象

 

3.学习起来有难度,要花一定的时间不断积累

 

4.语法结构不完全符合ANSI C/C++

 

5.做GUI开发时,周期较长,耗时耗力

 

6.做非GUI开发时,周期也较长,需要程序员考虑很多东西,手动的控制和调整很多

 

四、MFC的现在

 

从我了解到的情况,目前MFC的用户群比较稳定,没有出现大的增长和衰减。在传统优势领域更是比较牢固的占据着阵地。

 

目前业界里面,使用Visual Studio 6.0的还是不少,毕竟比较成熟,用起来不落后,也还得心应手;但是转向升级使用VS 2005的趋势也比较明显了;使用VS 2008的还不是太多,毕竟使用MFC的,用这几个版本,功能上区别不大,何不选择一个轻量一点的。

 

从培训教育市场上来看,VS 6.0是绝对的主力,大多数的书籍和培训都是基于6.0版的,这也反映出了其强大的生命力。

 

从竞争对手上来看,其他几个GUI库要向撼动MFC的地位,还有一段路要走,但是现在Qt的势头很猛,Nokia对其采取的策略无疑是成功的,Qt 4.5的推出,是Qt历史上一个不可磨灭的里程碑,采用LGPL协议,进一步扫清了其全面进军商业应用的障碍,用户群体得到巨大的增长。从长远来看,它最有可能与MFC分庭抗礼。

 

五、MFC的未来

 

最近的几个VS版本,并没有对MFC的版本有调整,还是MFC4.2。所以说,使用VS 6.0的人仍然很多。如果微软不准备大幅改进MFC的类库的话,这几个版本的VS都会被继续使用,6.0还是会笑傲江湖。就我个人观点,微软的重点是推广.net中C#和Visual Basic,MFC并不是主要关注点。但是竞争对手的步伐并没有因此而放缓,Qt的步步紧逼已经收获不菲。

 

在今后的一段时间内,我很看好Qt的市场前景,我手头的项目,也在尝试着使用Qt来做,并且在评估其性能差距和整体的周期长短等等方面。一旦验证了两者的性能差距不大,开发周期类似,培训成本也没有差距的话,Qt强大的跨平台优势和清爽的开发感觉,很可能会促使我们全面转向。

 

总之,如果没有Qt的话,我开发程序的首选是MFC;我喜欢那种在其中随心所欲的控制感,这是VB、Delphi、C++Builder等所不能带给我的快乐,它们使用起来就像是小孩子的玩具,用过一阵之后,毫无快感和成就感可言。但是,由于有了Qt,在选择开发工具时,我真的是很犹豫。有时候,也不犹豫,当有跨平台需求时,Qt是首选。