使用事件修改域对象

时间:2010-01-27 08:57:52

标签: events

我正在尝试了解何时适合使用事件。在我看来,一个事件可以被认为是一个SQL触发器。 那么,使用由一个域对象触发的事件来修改另一个域事件是否正确,或者如果我们使用事件修改其他对象的状态,它是否意味着缺乏深思熟虑的设计? 或者是否应该有一个中介类,这些对象应该通过它们相互修改?我该如何决定?

在这里我是否应该关注任何权衡,例如事件的使用将如何影响可测试性?

1 个答案:

答案 0 :(得分:2)

事件旨在将一个区域与另一个区域分离

这有时涉及一些异步行为,这可能是一项附加功能,但不是强制性的。例如,如果要在GUI中向用户提供快速反馈,并且代码的一部分运行速度太慢(除非需要在提供反馈之前完成),那么常规调用可以执行快速代码,并创建其他人的事件,然后提供GUI反馈,而无需等待事件实际处理。此事件存储在队列中,并且一个或多个线程按照自己的节奏处理该队列。

对于同步事件,它对于模块间通信非常有用,其中两个模块彼此之间没有编译时依赖性。两者都可以了解事件类和“事件路由器”:

  • 一个模块创建一个事件并调用路由器,
  • 路由器知道(从以前的配置)其他模块应该接收它,并将其发送到接收模块。
  

两个模块都不知道另一个,因此解耦概念。如果两者都必须单独维护,那就非常好: - )


对于某些主题,存在许多变体:

  • 广播到多个接收器
  • 故障转移(如果接收器暂时关闭,它会再次启动;当接收器启动并再次注册时,将发送事件)
  • 审核:技术模块可以接收针对其他模块的事件并进行记录
  • ...

通过事件修改域对象似乎有点奇怪。提到的脱钩是否真的合理?

但是,在更准确地理解你的想法之前,我不会给出明确的意见。