`
阿尔萨斯
  • 浏览: 4168282 次
社区版块
存档分类
最新评论

AOP, Signal/Slot, and Decoupling

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

解耦(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语言。微软是聪明的。呃,我把话题扯得远了。




分享到:
评论

相关推荐

    org/aopalliance/intercept/MethodInterceptor 类 fro Spring3.0

    nested exception is java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor 就是少了这个包

    安普威视aop42系列采集卡驱动 aop4204/4208/4216

    安普威视aop42系列采集卡驱动是安普42系列芯片卡的驱动程序,支持包括aop4204、aop4208、aop4216采集卡驱动安装,同时产品的监控软件和使用说明已将它们一并打包,需要的赶紧下载吧。aop4204产品介绍产品型号 AOP-...

    spring framework4.0 libs +net / aop alliance/aspectj

    绝对的物超所值,我单独下载花了十分哦。绝对的物超所值,我单独下载花了十分哦。

    北京动力节点-Spring4讲义-第3章Spring与AOP

    Aop是Spring的核心技术。通过Aop 实现上层的许多高级功能

    spring Aop/Ioc

    spring Aop/Ioc的简单例子!

    spring-aop-5.2.0.RELEASE-API文档-中文版.zip

    赠送jar包:spring-aop-5.2.0.RELEASE.jar; 赠送原API文档:spring-aop-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.2.0.RELEASE.pom;...

    11spring4_aop3.rar

    http://www.springframework.org/schema/aop/spring-aop.xsd"&gt; &lt;bean id="userService" class="cn.sxt.service.impl.UserServiceImpl"&gt;&lt;/bean&gt; &lt;bean id="log" class="cn.sxt.log.Log"/&gt; &lt;aop:aspectj-...

    spring,hibernate整合实现事务管理(MethodInterceptor)

    NULL 博文链接:https://88548886.iteye.com/blog/1528486

    Spring AOP » 5.0.2.RELEASE

    spring aop最新的正式版 2017年11月27日 maven工程 &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-aop&lt;/artifactId&gt; &lt;version&gt;5.0.2.RELEASE&lt;/version&gt;

    Spring-AOP(前置/后置/环绕)通知的例子

    NULL 博文链接:https://z18022893621.iteye.com/blog/1956146

    spring-framework-4.0.6.RELEASE

    spring4的稳定版本4.0.6 无需maven直接下载jar包 系统只允许上传50M内的文件,所以只包含了jar包

    spring aop spring aop

    spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop

    java AOP实现字段加密/解密

    java AOP实现字段加密/解密 参数加密: @EncryptMethod //添加service实现上面 @EncryptField //添加entity 实现字段上面

    spring-aop-4.3.12.RELEASE.jar

    spring支持aop所需jar包spring-aop-4.3.12.RELEASE.jar

    Spring AOP教程

    Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。

    springAOP demo 带错误解决文档

    spring-aop-4.0.6.RELEASE.jar spring-beans-4.0.6.RELEASE.jar spring-context-4.0.6.RELEASE.jar spring-core-4.0.6.RELEASE.jar spring-expression-4.0.6.RELEASE.jar 在使用spring额外功能时 1 需要在xml文件中...

    AOP.in..NET

    AOP tools for .NET have now reached the level of practical maturity Java developers have relied on for many years, and you'll explore the leading options, PostSharp, and Castle DynamicProxy. ...

    spring aop 实现源代码--xml and annotation(带lib包)

    在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...

    西门子MM4 AOP消息“LCD偏置电压故障”.pdf

    西门子MM4 AOP消息“LCD偏置电压故障”pdf,西门子MM4 AOP消息“LCD偏置电压故障”:问题:什么是引发以下AOP消息的原因:“LCD偏置电压故障损坏的数据集P ----(迷失)”解答:如果看到此故障消息,那么应该检查AOP...

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

Global site tag (gtag.js) - Google Analytics