清理Ruby中多个决策的实现

时间:2016-10-24 13:38:19

标签: ruby-on-rails ruby

背景

我正在编写一个处理外部应用程序数据的API。我的应用程序处理来自外部应用程序的JSON响应,并向我的服务的消费者提供相关信息。 (这些消费者是我组织的内部人员)

外部应用程序有一个API,允许我检查更新。更新由事件触发。 API提供12种不同类型的活动。事件类型以字符串格式提供。 (例如'MoveEvent','DeleteEvent','CreateEvent')

我需要为每个事件编写一个特定的处理算法。

问题

我正在寻找一种干净的DRY和SOLID方式来实现事件处理系统。该应用程序的重点是代码质量和可靠的架构。

我的解决方案和想法

有很多方法可以解决这个问题,但到目前为止我最好的猜测是:

  • 创建一个哈希,其中包含事件类型的字符串名称,并将它们映射到处理类。
  • 使用策略模式为要遵守的所有处理类定义公共接口,以便任何中介类只需要知道处理类可以响应的消息。
  • 使用某种工厂(方法)来实例化具体实现。

我明确地希望忽略一个长期的if-elsif-else解决方案,除非有人能说服我这样做。

总是欢迎建议和批评,谢谢!

2 个答案:

答案 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的回答是关于我的期望。