• VJGUI消息设计-兼谈MFC、QT和信号/槽机制


    星期六下午4点,还在公司加班。终于写完了下周要交工的一个程序。

    郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷。

    作为一个有10年经验的MFC程序员,郁闷啊......

    当初上大学的时候,就是冲着MFC这3个字去学的。

    Microsoft Foundation Classes

    多么的NB。仿佛这些C打头的类就是构建微软大厦的一根根螺钉。

    记不清有多少个日日夜夜守在电脑旁,用VC6的ClassWizard不知疲倦的添加一个又一个的类。

    也记不清翻看了多少本VC与MFC的书,并一次又一次的迷失在MFC中几个小时解不了一个Bug...

    正如某个外国的程序员所说的“The Microsoft Foundation Classes (MFC) are a nightmarish mess. I'll say it again - the MFC is a programmer's nightmare.”

    MFC确实成了很多程序员的噩梦。当我坚持把这个噩梦做醒时,大学已经上完了。。。

    再做了3、4个项目以后,我终于可以较熟练的用MFC解决大部分问题了。我曾经(现在也有)这种想法,在MFC里只有想不到的,没有做不到的。也确实是这样,MFC只是WinAPI的一个thin wrapper,灵活度是没问题的。

    这种满足感一直持续到我接触了QT,看到了它最经典的消息设计(Signal & Slot)。

    卖糕的,这是蒸的馍?

    原来消息响应可以如此的优雅,如此的直接,如此的简单。回过头来看看MFC中的Message Map,那感觉,就像刚吃完一份多汁的牛扒后被强迫吃了一块臭豆腐。

    我想,作为吃了10年的臭豆腐的人,突然吃到了多汁的牛扒,是有理由狂喜的,同时他又不得不继续吃臭豆腐,是有理由郁闷的。

    言归正传,VJGUI是我为开源2D引擎IndieLib写的一个GUI类库。在设计阶段时,我就一直在想各个Widget的消息应该怎样响应。第一个想法自然是callback function,会不会too simple?作为一个吃了10年臭豆腐的人,有理由多想一下。其实我一直在避免使用Callback function,它的耦合性太强了,使得代码很难复用。同时,callback function is not type safe,难道我们喜欢在代码中埋雷?还有一个问题,这些函数使得代码很难看......。下一个想法,实现一个简单的类Windows消息机制,细节还没太想清楚。但要为每种widget加上message pump会不会显得太蠢苯了?另外,使用起来估计可用性不高。最后,利用了一个周末的休息时间,我决定了,为什么不实现QT的信号/槽机制呢?

    QT的实现是需要moc的,有没有更清爽的解决方案?回答是肯定的,我找到了sigslot和slotsig这哥俩。

    内部它们使用N多的模板(template)来实现信号/槽(本质还是callback function,只不过耦合度降低了,编译时会做有效性检查,更加安全)。C++中那么不起眼的模板,原来还可以这样用。看来学习C++真是永无止境啊。

    这样的实现比QT会快一些。slotsig甚至还做了各种信号/槽实现的benchmark。有兴趣的人可以去这里看看。

    ---------------------------------------------------------------------------------------------------------------

    3楼 彩阳 2012-02-28 10:42发表 [回复] [引用] [举报]
    Boost里面也有signal2类,我正在学习,这的确是一个好的经历。
    2楼 superjoel 2009-07-15 16:30发表 [回复]
    还是通过STL知道GP的,是个让人充满期待的技术。
    我一直觉得VC2008的STL效率有些问题,最近听说VC2010中STL的效率将会大幅提升(看测试vector push back操作只需要原来30%的时间)。还真想尽快试试VC2010正式版,看看能否像MS的目标那样成为新的VC6。
    1楼 lynx090 2009-07-13 17:03发表 [回复]
    1:敬仰博主的经验 2:Signals和function在BOOST里都有实现,用来解耦是非常方便的。 3;在C 设计前沿领域,用的最多其实是GP而不是OO,STL、BOOST就是GP的代表作。Matt Austern、Andrei Alexandrescu等大师都是GP领域的神人。C 的模板要比其他语言的模板要强大多了。

    http://blog.csdn.net/superjoel/article/details/3990219

  • 相关阅读:
    SQL Server ->> 生成代码把表字段从NULL改为NOT NULL
    Hadoop ->> MapReduce编程模型
    SQL Server ->> 建立linked server到Azure SQL Server
    SQL Server ->> 存储过程sp_rename重命名数据对象
    SQL Server ->> CLR存储过程枚举目录文件并返回结果集
    SQL Server ->> 查看SQL Server备份历史
    SQL Server ->> 生成时间类型的Partition Function和Partition Scheme代码
    SQL Server ->> CLR编程问题汇总
    Hadoop ->> Name node/Data node和Job tracker/Task tracker的区别
    Hadoop ->> Hadoop是什么?
  • 原文地址:https://www.cnblogs.com/findumars/p/5089807.html
Copyright © 2020-2023  润新知