使用事件驱动方法与过程编程相比有什么优势?

What is the advantage to using an event-driven approach vs procedural programming?

使用事件驱动方法与非事件驱动(过程)方法的优缺点是什么?


没有 EDP:

对象 A 响应某些用户输入。对象 A 调用对象 B 中的方法和对象 C 中的方法,它们执行各自的任务。

使用 EDP:

对象 A 响应某些用户输入。对象 A 发布一个事件,其中订阅了对象 B 和 C。相关数据被打包成一个 EventArgs 并被 B & C 接收并执行各自的任务。


使用一个或另一个有优势吗?我站在十字路口,我需要做出选择。但是,我没有任何 objective 信息可以说明哪一个更好,以及哪一个可能比另一个有优势。

谢谢!

编辑:我理解的差异与此处描述的方式类似:

可扩展性和维护性。每次您想在没有 EDP 的示例中添加新的 'subscriber' 时,您不必返回到该方法并向其添加,您只需将要调用的方法添加到其订阅者列表中。

OOP 就是封装代码中发生变化的部分,以便尽可能减少更改它们的后果。您不希望每次在项目的其他地方需要新功能时都必须修改模糊相关的 class。

所以我想说给定两个选项,总是选择事件驱动模型。

Is there an advantage to using one or the other?

是 - 使用事件 解耦 ABC。例如,如果没有事件,您不能通过让 另一个 类型响应 As 事件而不修改 As 代码来扩展功能。

缺点是它更难编码(虽然不是很糟糕)并且您必须编码更多 "plumbing" 才能添加所有相关事件。这也使得跟踪逻辑变得更加困难,因为您在任何时候都不知道什么可能正在监听 As 事件。

我认为你在谈论观察者模式。

当你在实现对象A时没有对象B和对象C时,你使用观察者模式;或者,如果您稍后知道,其他 类 将需要了解该事件,但您不希望他们不得不修改对象 A 的代码。

事件驱动编程是一种用于处理 IO 绑定过程(如示例中的用户输入)的并发模型。所以,实际上,您描述的两个过程都是事件驱动的。

这两个示例之间的区别在于,通过在 "observer" 对象和 "responder" 对象之间引入发布/订阅抽象,正如 D Stanley 所提到的,通过添加来解耦这两层一层间接。

这种方法的优点是更抽象(代价是稍微复杂一点)。所以你可以做一些事情,比如在 "observers" 和 "responders" 之间放一个队列,这样你就可以控制和观察你的过程,并扩展你的系统。

因此,例如,您的 "observer" 可能是一个前端应用程序,它将作业排队到队列服务器上,该队列服务器由 "responders" 查询,而 运行 在其他服务器上。这将是构建多层应用程序的一种方法。