AOP, Signal/Slot, and Decoupling

解耦(Decoupling)是一个永恒的话题。本来没有打算这么早开始涉及“大型程序解耦”这一块内容,但是smithfox在winxcn论坛上提及相关的话题,所以决定还是在这里聊聊我对“解耦”的一些看法。

面向方面编程(AOP,Aspect Oriented Programming)思想的精粹,在于提倡人们尽量对功能进行切片,形成一个个独立的服务。而后,通过组合的方式,把这些服务组装成为所需要的组件。AOP的关注点在于复杂对象(或系统)的解耦(Decoupling)问题

信号-槽(Signal-Slot)机制,是希望提供一个统一的、可伸缩的方式,来规范组件之间的通讯机制。Signal-Slot的关注点在于组件间的解耦(Decoupling)问题。Delphi、C#、QT、SmartWin(Boost)均提供了Signal-Slot机制。另外,COM的ConnectPoint规范亦属于Signal-Slot范畴。

对于在SmartWin的中将消息(或称为“事件”)归类为一个个Aspect,并且采用Singal-Slot方式提供,你怎么看?WINX的消息机制为什么不采用类似SmartWin的Signal-Slot机制?这个问题可以从以下四个角度来回答。

其一:兼容。我已经说过,WINX的一个基调,是要让现有的MFC用户感到熟悉、感到Happy。所以,我不能够采取MFC用户比较陌生的Signal-Slot来进行消息处理。

其二:效率。SmartWin的消息机制无疑使得窗口对象的尺寸迅速膨胀,并且消息分派的效率大幅降低。

其三:Signal-Slot最主要的关注点是组件间的解耦(Decoupling)。一般情况下,我们主要将其用于两种对象(或多种对象)之间的消息通讯。Delphi、C#、QT在这一点上的度把握的相当好。而SmartWin将Signal-Slot机制应用于窗口自身内部的消息分派,让人有点“杀鸡用牛刀”之感。

其四:从AOP角度看。AOP的关注点是提供服务(功能切片),SmartWin只是将消息归为Aspect,并未提供服务,看起来这一个个Aspect主要是出于实现上重用的考虑,个人认为意义不大。真正AOP思想的贯彻者是ATL/WTL(当然,SmartWin既然支持了所有消息的Signal-Slot,自然也可以实现一个个的“功能切片”,尽管我还没有看到,但这可能是因为我不熟悉SmartWin的缘故)。ATL/WTL的消息分派中的MessageMap Chain机制,使得消息处理可以按功能切片进行分割,并最后可以完美的组装在一起。ATL/WTL中这样的“功能切片”太多了(有点吹牛了,其实不多:-),我们可以随意举几个例子:
  - WTL::CDialogResize (窗口布局,不只用于Dialog的Layout)
  - WTL::CDoubleBufferImpl (支持双缓冲Paint机制)
  - WTL::CThemeImpl (支持XP Theme)
  - ...

接下来我们谈谈WINX中大型程序的解耦(Decoupling)。我曾经在C++程序员的困惑一文中提到这个问题(不过这个问题不是C++程序员所特有的),并且把它作为WINX的一个要解决的目标。我在这方面做过尝试,并获得了一定的成果。但是很抱歉,它离我的期望还有一定的差距,关于这一部分的代码目前并未开放。

最后,我要附带对比一下各种的Signal-Slot实现。

Delphi、C#都是从语法角度来支持Signal-Slot机制,其性能、便利、友好程度,显然都到了最佳(Delphi为了效率,每个Signal只支持一个Slot)。QT虽然基于C++,但是其Signal-Slot机制也是从“半语法的角度”来提供(所以就有了moc预处理)。

根据我的猜想,SmartWin的作者正是觉得QT的做法不太纯洁,而试图提供一个标准C++的解决方案。但是,有两个原因让我觉得SmartWin(或者Boost)的Signal-Slot机制不好:

其一:Singal-Slot是一个通用的解耦机制。它将应用到各种层次的组件,而不会只是用于窗口消息处理。因此,Singal-Slot机制的简洁、易用是很重要的。这让我倾向于QT的Singal-Slot实现(只是相比SmartWin、Boost而言)。

其二:Signal-Slot既然关注于组件间的解耦(Decoupling),我个人倾向于它是一个二进制的规范,而不是C++ 模版定义的规范。原因很简单:我不想假设所有的组件实现者均喜欢C++。

.NET平台和Java平台最大区别在哪里?把你的焦点从C#与Java的比较上脱离开来吧。其实两者最大的区别在于,.NET平台推的是其二进制规范CLR(从COM二进制规范延伸),而Java平台推的是Java语言。微软是聪明的。呃,我把话题扯得远了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值