寻求避免“远距离行动”的模式

时间:2018-10-02 17:57:55

标签: perl design-patterns cpan moose dancer

我正在处理一个复杂的大型Web应用程序。所述应用程序中的某些类需要在遥远的对象中执行各种方法,而我很快意识到并绊倒了与“远距离动作”反模式有关的错误。

示例1:一些类需要执行日常的“清理”方法,例如reaper()cleanup()send_daily_status_messages()等。

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

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

为解决这个问题,我们的团队创建了一个Events类,用于集中所有这些调用。但是,从某种意义上说,有时我们在分布式对象中进行更改,而忘记对Events类中的调用进行更改,然后发现错误,因此我们发现Events类本身有点“遥不可及”。 >

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

一个想法:让对象在初始化时将自己“注册”到某种动态Events类。这将使调用代码保持在每个对象附近。对象甚至可能还会创建不同的事件?

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

1 个答案:

答案 0 :(得分:2)

听起来像您正在谈论的通用模式是事件分发。您可以在CPAN上找到许多不同的模式,例如:Event::DistributorBeam::EmitterMixin::Event::DispatchMojo::EventEmitter(我已将其提取为{{3} }。您有一个对象,该对象可以是事件分发程序,也可以应用事件分发角色,并且所有对象都可以订阅事件,并且当某些事件发出事件时,所有订阅者都将调用其回调。