寻求避免的模式 "action at a distance"

Pattern(s) sought for avoiding "action at a distance"

我正在开发一个复杂且非常大的 Web 应用程序。所述应用程序中的一些 classes 需要在遥远的对象中执行各种方法,我很快意识到并陷入与 "action at a distance" 反模式相关的错误。

示例 1:某些 classes 需要执行每日 "cleanup" 方法,例如 reaper()cleanup()send_daily_status_messages() 等。

示例 2:某些 class 会改变应用程序的状态,并需要远处的对象执行其自身状态的 refresh()

示例 3:回到示例 1,分布在整个应用程序中的一些对象为 send_daily_status_messages() 提供了各种内容。

为了解决这个问题,我们的团队创建了一个集中所有这些调用的事件 class。然而,我们发现事件 class 本身有点太 "distant",从某种意义上说,有时我们在分布式对象中进行更改,而忘记在事件 [=36] 中更改调用=],然后查看错误。

我想知道是否有更好的模式?

一个想法:对于对象 "register" 自身到某种动态事件 class 在初始化时。这将使调用代码保持在每个对象附近。对象甚至可以创建不同的事件?

最后,这是针对使用 Moose 的基于 Perl 的 Web 应用程序。因此,我们将不胜感激任何特定于 Perl 的 Moose 友好建议,包括 CPAN 建议!

听起来像您所说的常见模式是事件分派。您可以在 CPAN 上找到许多对这种模式的不同看法,例如:Event::Distributor, Beam::Emitter, Mixin::Event::Dispatch, Mojo::EventEmitter (which I've extracted to a role)。您有一些对象,它要么是事件调度程序,要么具有应用于它的事件调度角色,并且所有事物都可以订阅事件,并且当某些东西发出事件时,所有订阅者都会调用他们的回调。