小技巧:使用隐藏窗口解除组件间耦合

小技巧:使用隐藏窗口解除组件间耦合

作者:HQ |  时间:2019-06-16 |  浏览:412 |  评论已关闭 条评论

问题
随着项目的规模逐渐变得大了起来,解决方案中的组件的个数和相互之间的关系也慢慢复杂起来。如果一个组件A显式调用另一个组件B,则我们认为这个组件A依赖于组件B。如果被依赖的组件B的接口发生变化,则组件A会受到影响,轻则需要重新编译,重则导致新Bug的引入。

改进方法
显式调用的优点在于使用简单,只需要组件的头文件和库文件即可实现组件代码调用,这样也带来了组件之间的强耦合。今天我们引入一种基于隐藏窗口的方式,来实现组件间解耦,请看下图。

原理解释
1) 组件B提供某种服务,组件A为组件B的客户调用此服务。
2) 组件B在启动时,会创建一个特定窗口标题的隐藏窗口,并拥有自己的消息循环和消息处理机制。
3) 组件A在启动时,通过事先约定好的窗口标题寻找组件B的隐藏窗口,如果找到此窗口,说明组件B功能可用。
4) 组件A发送自定义消息给隐藏窗口,消息被组件B接收后进行消息参数的解码及处理。对于同步调用场景,组件A可以使用SendMessage,如果需要异步调用,则组件A使用PostMessage。

这样做的好处
1) 第一个好处就是如上述所谈到的解除组件间依赖性,在这种方式下,组件A并不需要组件B的接口头文件,只需要两个组件事先约定好窗口的标题即可实现互相通信。
2) 第二个好处,就是所谓的强序列化调用。我们知道,Windows基于消息循环,所以消息是一条一条发送,在接收端,也是一条一条顺序接收并处理的。基于此原理,我们可以确保组件A的调用,传到组件B中,会按照发送消息的时间先后顺序来调用的。配合PostMessage,我们的调用方无需等待接收方的处理结果,从而可以继续做其他事情。

总结
随着工程规模的持续扩大,有必要在早期做好组件间调用关系的设计,非性能攸关的组件可以采用文中的方法来解除组件间耦合,从而留给了组件实现方更大的实现自由度。基于消息循环的机制,也为我们带来了方法序列化调用的效果。
但如果组件间调用可能是性能瓶颈,则不推荐使用这个方法,因为消息的检索及处理依赖Windows底层的消息处理设计,我们无法进行掌控,所以还是以常规导入头文件的方式来调用比较合适。

标签:

评论已关闭。