背景
我正在编写一个处理外部应用程序数据的API。我的应用程序处理来自外部应用程序的JSON响应,并向我的服务的消费者提供相关信息。 (这些消费者是我组织的内部人员)
外部应用程序有一个API,允许我检查更新。更新由事件触发。 API提供12种不同类型的活动。事件类型以字符串格式提供。 (例如'MoveEvent','DeleteEvent','CreateEvent')
我需要为每个事件编写一个特定的处理算法。
问题
我正在寻找一种干净的DRY和SOLID方式来实现事件处理系统。该应用程序的重点是代码质量和可靠的架构。
我的解决方案和想法
有很多方法可以解决这个问题,但到目前为止我最好的猜测是:
我明确地希望忽略一个长期的if-elsif-else解决方案,除非有人能说服我这样做。
总是欢迎建议和批评,谢谢!
答案 0 :(得分:2)
在这种情况下,我喜欢使用这种模式:
class Processor
class << self
def for(name, data)
processors[name].new(data)
end
def processors
{
'MoveEvent' => MoveEventProcessor,
'DeleteEvent' => DeleteEventProcessor,
'CreateEvent' => CreateEventProcessor
}
end
end
attr_reader :data
def initialize(data)
@data = data
end
class MoveEventProcessor < Processor
#... code to handle this event
end
class DeleteEventProcessor < Processor
#... code to handle this event
end
class CreateEventProcessor < Processor
#... code to handle this event
end
end
p Processor.for 'MoveEvent', {some: :data}
答案 1 :(得分:1)
所以我的建议是不要过度设计这个机会,当你意识到事情时,你必须反复重构或重新实现你的解决方案。我认为你提出的第一个想法可能是最直接的方式。即使你想把一个哈希放在一个类中,然后处理并且需要处理所选的事件类,这似乎仍然合理(所以基本上是数字2)。 ReggieB的回答是关于我的期望。