"事件驱动"和"面向对象"编程之间的关系是什么?



这些天,我几乎到处都能听到关于"事件驱动"编程的消息。

维基百科说:

在计算机编程中,事件驱动编程是一种编程范式,其中程序的流程由用户操作(鼠标点击、按键)、传感器输出或来自其他程序/线程的消息等事件决定。事件驱动编程是图形用户界面和其他应用程序(例如Javascript web应用程序)中使用的主要范式,这些应用程序以响应用户输入执行某些操作为中心。

这不正是我们的老朋友OOP吗?如果这不是OOP,有什么区别?

  1. 面向对象编程(OOP)和事件驱动编程(EDP)是正交的,这意味着它们可以一起使用。

  2. 在具有EDP的OOP中,所有OOP原则(封装、继承和多态性)保持不变。

  3. 在具有EDP的OOP中,对象获取一些发布事件通知和订阅来自其他对象的事件通知的机制。

  4. OOP与EDP的区别在于对象之间的控制流。

    • 在没有EDP控制的OOP中,在方法调用上从一个对象移动到另一个对象。对象主要调用其他对象的方法。

    • 在具有EDP的OOP中,控制在事件通知时从一个对象移动到另一个对象。对象订阅来自其他对象的通知,然后等待来自其订阅对象的通知、基于通知执行一些工作并发布自己的通知。

  5. 结论:OOP+EDP是"我们的老朋友OOP",由于事件驱动设计,控制流程颠倒了。

面向对象编程是通过将数据和操作配对到现实世界对象的模型中来定义的。事件驱动编程是一种编程风格,其中我们有一个服务器,无论它是在通信端口上还是在用户界面上,等待输入命令。然后,它将处理该命令并显示/产生所需的结果。

大多数事件驱动的语言都是面向对象的。对象等待事件。面向对象语言中的程序不一定是事件驱动的,事件驱动的编程也不一定需要面向对象的语言。它们是不相关的。

顺序(非事件驱动)程序的算法就像一个配方:从一开始,一直工作到最后,然后停止。

事件驱动程序更像是汽车的控制:任何事情都可以在任何时间、任何顺序发生。

面向对象原理似乎更适用于事件驱动的模型,因为每个"控制"基本上与其他"控制"无关(关注点分离),事件的顺序大多不重要,时间上的巧合也是如此:你可以同时打开雨刷器、关闭除霜器、转向和加速,而且这些动作不会相互影响。在某些情况下,配方也是可能的,但这取决于厨师(编译器/优化器/cpu)来推导

顺序程序可以是OO:没有人介意搅拌机和烤箱是否断开连接,然后做自己的事情。我希望这是一个有用的比喻。

我的尝试。这里有三个比喻:

事件编程似乎类似于硬件总线的工作方式:总线用于外围设备之间的通信。类似地,手机信号塔是手机相互通话的信息总线。还要考虑好的旧星形网络拓扑模型(https://en.wikipedia.org/wiki/Star_network)。见鬼,看看家庭路由器是如何将计算机和物联网设备连接到家庭网络的。

我们对对象进行编码,而不是外围设备、手机或设备。我们不按照传输协议发送数据包,而是将事件或消息发送到消息代理(例如,消息队列或Kafka)。任何对事件感兴趣的人都可以对该事件采取行动,或者在工作流的情况下,该事件预计将由特定的人处理,发送者将期望找到一个具有与结果相适应的响应的结果事件。

ASIDE:经验教训

因此,我们也有可能解决硬件制造商和电信工程师在事件驱动消息传递方面已经遇到并解决的问题。

最新更新