我正在处理一个复杂的大型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建议,将不胜感激!
答案 0 :(得分:2)
听起来像您正在谈论的通用模式是事件分发。您可以在CPAN上找到许多不同的模式,例如:Event::Distributor,Beam::Emitter,Mixin::Event::Dispatch,Mojo::EventEmitter(我已将其提取为{{3} }。您有一个对象,该对象可以是事件分发程序,也可以应用事件分发角色,并且所有对象都可以订阅事件,并且当某些事件发出事件时,所有订阅者都将调用其回调。