消息的本质

    消息到底是什么呢?英文称之为message。根据百度百科的解释,在我国古代把客观世界的变化中的事实称为“消息”,到了近代,“消息”逐渐演变成了“新闻”的含义。在我们研究的计算机科学里,消息往往表示了模块之间的通信交互。我们着重研究的是计算机软件里的消息。

我们从以下几点定义入手来看看消息的本质:

    1.UML里把所有函数的调用都称为消息。

    2.windows gui程序里,存在鼠标消息,键盘消息。这里的消息又称之为“事件”。

    3.回调函数有时也称为发消息。

    4.我们经常会见到同步消息和异步消息的称谓。

    5.消息和命令有什么关系吗?我觉得消息是没有目的性的,也就是不指定消息的接收者,任何对象都可以接收或拒绝接受该消息。而命令,则是指定了接受者的消息。也就是说一条命令包含了一条消息和其接收者(Receiver)。

    6.一条消息究竟需要包含什么必要内容呢?一条消息的表示了一个“事件”的发生,消息只要描述清楚这个事件的本质就可以了。比如一个“鼠标点击事件”只要给出鼠标的“坐标,鼠标哪个键”就够了。

    7.消息又和信号(signal)有什么区别与联系呢?我觉得信号应该是消息的一个子集。系统中通常规定了几种简单的消息,把它们称作信号。

    8.进程间通信有时需要消息队列。

    综上,我们把模块之间的正向依赖叫用“调用”,反向依赖叫做“回调”,正是因为反向依赖具有特殊性,比如A模块依赖B模块,所以A应该知道B的接口,也就是A应该了解B,但是反过来,B不应该了解A,B不能去“调用”A,B不能了解A的接口,因为在构建B时,可能还没有A的存在,所以B也就不可能知道A的接口,但是某些情况下B一定要“通知”A某些事情,这种情况只可能是A和B都实现知道这些事情是什么,这样在设计A的时候会预先想好怎么处理这些事情,B在这些事情发生时,会回过头来调用A,这就是“回调”机制。回调也可以描述成消息机制,或者事件机制。无论怎么描述,这里有个特点就是,事件或消息是事先约定好的,就是在系统设计过程中就已经规定好了所有的消息类型,这样才符合回调的特点。

    调用和回调相似又不同。调用是调用着完全了解被调用者(即了解被调用者的接口),回调是回调者不知道被回调者,唯一知道的是回调接口。通过回调接口发消息给调用者。被回调者必须实现回调接口。c语言中的回调函数就是这样的,c++中利用虚基类也可以实现回调机制。我们众所周知的Observer模式也是回调机制的一种体现。观察家相当与上述的模块A,被观察者相当与模块B,A了解B,但是B并不知道A的存在,B通过Observer接口向A发送消息(回调)。

    从调用到回调我们又引出了直接依赖和间接依赖两个概念,模块A调用模块B,表示A直接依赖B,B回调A表示B间接依赖A。A对B的调用可以用“请求”,“调用”来表示,B对A,则可以用“回调”,“发消息”,“事件通知”来表示。

    我们知道,进程间的通信不能通过函数的直接调用,所以必须依靠发消息和消息接收队列的机制来实现调用。如果没有多任务,那么理论上讲,是可以通过函数直接的直接调用来实现的。但是,模块(对象)间太多的依赖关系,会使得系统复杂到无法理解的地步,所以,人们才会提出分层的概念,高层只依赖它的下层,下层如果和上层的通信通过消息(回调)来传达,这样就可以最大的解耦模块之间的关系。我觉得“消息”的最大贡献就是发消息的人可以不知道消息的接收者是谁,消息等价于信号和事件。调用最大的优点是简单直接,最大的确定是调用者必须知道被调用者的存在(以及其对外接口)。

 

 

 

你可能感兴趣的:(c,百度,语言,任务,Signal)