2分六合

  • 热门专题

再不进行自救的MFC就要OUT了

作者:wy  发布日期:2019-01-13 08:36:00
Tag标签:      
  •   同样都是一起诞生的编制语言,为何MFC沦落到如此的地步,它总是被用来与其他的编程语言进行比较,但就在这种赤裸裸的比较之下它的缺点简直暴露无遗不可直视。小编我在网络上看到很多分析贴觉得实在是面面俱到无可挑剔。

      首先声明,MFC本身缺陷重重,嗯,不要说MFC了,C++的框架或者类库,那个不是缺陷重重,充满争议,众口难调,即便是官方标准库stl,而且还是模板的,也是诸多抱怨,比如allocator,比如string,iostream,比如algorithm里面的find,find_if,copy,copy_if等非正交的算法函数,又比如……,好吧剩下来的问题就和反射有关了,反正stl极力回避动态类型信息,又没有first class的函数类型和垃圾回收,即便是大力搞,也出不来什么大奇迹,基本上用起来也就是这个德行了。只是想说,mfc的各种不足,是有其自身的无奈,也很让人同情,真的,特别是,面对着这个几十岁的c++框架老人,很有些物伤同类。

      回顾MFC诞生的那个时代,C++好像还没有template,即使有,也不像如今装备的各种令人发指的奇葩功能。可以说的是,当时的c++,就是比 c with class 强一些,有多态,对了,还有多继承,幸运的是,MFC坚持了单继承,有意无意地回避了很多C++多继承设计上的很多本质复杂性问题。与此同时,静态强类型面向对象的语言,似乎也就是C++只此一家了,基本上,MFC扮演着先行者的角色。但是,后面的delphi为何就那么成功呢,那是因为object pascal给对象类型加了很多元信息数据,而且,还专门为gui框架开发添加各种语言扩展。有了这些外挂之后,做出来的框架,情况自然就很好多,反射对于静态类型语言gui框架的开发,绝对是不可或缺之物。你看看,现在的面向对象语言,除了c++这个老顽固,那个不是大把大把的反射元数据,即便是c++,也做了妥协,搞了一个极简版的type_info,简到不能用的残次品,真是不知所谓。好了,老朽决定言归正传,长话短说。

      MFC的设计目标就是用C++里面的一个子集封装windows Api函数,以简化windows应用程序开发的工作量。此外,MFC也不可能搞消息发送这种与静态强类型语言格格不入的旁门左道,当然,MFC真要强硬以消息发送的模型来封装win32的api,也未尝不可,只是感觉很太那个,不如另起炉灶,直接用动态语言来做框架,好像object c那样。而最终,MFC也确实完成任务了,就只是这个框架用起来,没啥灵气,笨重,束手缚脚,麻烦,各种不方便。更难能可贵的是,MFC通过内嵌类,还把COM,ActiveX这种大怪物整合进来,只是付出一点点代价,仔细追究,也就是一点点违和感而已,效果如此显著,也确实让人赞叹不已。君不见用MFC开发的成功的商业软件不知几多,这可见MFC的成功有多大。并且,即便是MFC如斯之呆板,也没有阻止高人在其上各种打洞,配套产品有bcg control bar(vs2008的补丁后,就开始集成在MFC里面了,其代码烂得罄竹难书),xtreme等第三方库可以做出来很炫效果的界面。不像java,说你不行就真的不行,从根源上就杜绝了种种奇技淫巧,从一开始就不让你做文章

    mfc

      MFC在那个年代独创的几大关键技术:运行时类型、动态创建、序列化、消息映射等,也算是脑洞大开的非凡产物,时至今时今日,还不是在各种框架设计上发光发热。这些关键技术,基本上只靠虚函数和宏,而且这个时候的宏,还没有用到boost preprocessor那样的伪图灵完备特性,能做成这样,实在不容易,的确难能可贵,搞得笔者写到这里都有小小的感动。像是c++这种半残language,没有原生的函数类型,没有丰富动态类型信息,没有垃圾回收。然后还没有伪图灵完备的预处理,没有真图灵完备的template,霸王硬上弓做gui框架,又要享受静态强类型的好处,一路推演,顶多就只能做成MFC这个样子,不能更好的了。qt是因为加了动态类型信息,所以情况有所改善,但是,也不见得就多厉害了。如果由笔者用mfc的当时的c++那点破面向对象特性来做gui框架,多半会走上消息发送的邪路,否则,简直难以下手做出来MFC这样的珠玉,因为实在太恶心太无趣了。

      随着世界的进步时间的推移,我认为淘汰一些不好的东西是值得赞赏的,毛泽东曾经说过“落后就要挨打”这句名言简直是中国的精神食粮,很多老一辈的人总是把这句话挂在耳边,就连我们这一辈也吸取同样的经验。

延伸阅读:

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规

    <dir id='12fbf'><del id='12fbf'><del id='12fbf'></del><pre id='12fbf'><pre id='12fbf'><option id='12fbf'><address id='12fbf'></address><bdo id='12fbf'><tr id='12fbf'><acronym id='12fbf'><pre id='12fbf'></pre></acronym><div id='12fbf'></div></tr></bdo></option></pre><small id='12fbf'><address id='12fbf'><u id='12fbf'><legend id='12fbf'><option id='12fbf'><abbr id='12fbf'></abbr><li id='12fbf'><pre id='12fbf'></pre></li></option></legend><select id='12fbf'></select></u></address></small></pre></del><sup id='12fbf'></sup><blockquote id='12fbf'><dt id='12fbf'></dt></blockquote><blockquote id='12fbf'></blockquote></dir><tt id='12fbf'></tt><u id='12fbf'><tt id='12fbf'><form id='12fbf'></form></tt><td id='12fbf'><dt id='12fbf'></dt></td></u>
  1. <code id='12fbf'><i id='12fbf'><q id='12fbf'><legend id='12fbf'><pre id='12fbf'><style id='12fbf'><acronym id='12fbf'><i id='12fbf'><form id='12fbf'><option id='12fbf'><center id='12fbf'></center></option></form></i></acronym></style><tt id='12fbf'></tt></pre></legend></q></i></code><center id='12fbf'></center>

      <dd id='12fbf'></dd>

        <style id='12fbf'></style><sub id='12fbf'><dfn id='12fbf'><abbr id='12fbf'><big id='12fbf'><bdo id='12fbf'></bdo></big></abbr></dfn></sub>
        <dir id='12fbf'></dir>