1

我是 Ruby 新手,使用 Bunny 来使用来自 RabbitMQ 的消息。

所以我的班级目前看起来大致是这样的:

class Consumer

  include Validator

  def initialize
    #Start a RabbitMQ session
    @rdSession = Session.new

    @queueMain = rdSession.joinQueue('QueueMain')
    @queueLittle = rdSession.joinQueue('QueueLittle')
    ...
    @queueTen = rdSession.joinQueue('QueueTen')

    goWork
  end

  def goWork
     @queueMain.subscribe(:manual_ack => true) do |delivery_info, properties, payload|
        goDoSomethingElse(payload)
      end
     ....
     @queueTen.subscribe(:manual_ack => true) do |delivery_info, properties, payload|
        goDoAnotherPiece(payload)
      end
  end

我的问题是文件变得很长,所以我想以某种方式减少它。所以我想到的一件事是那些将加入队列的长列表移动initialize到另一个文件中的人,因为它们是恒定的。

但是,正确的方法是什么,我应该创建一个模块,复制所有这些joinQueue行,然后将它们goWork作为常量引用,例如:QUEUEMAIN

任何想法/建议将不胜感激。

试图理解为此的良好设计?

谢谢。

4

1 回答 1

1

您可以在这里重构更多内容,但基本上是的,您将提升转移到一个模块,感谢@Amadan,您可以

module GoWork
  def goWork
    @queues[:QueMain].subscribe(:manual_ack => true) do |delivery_info, properties, payload|
      goDoSomethingElse(payload)
    end
    @queues[:QueTen].subscribe(:manual_ack => true) do |delivery_info, properties, payload|
      goDoAnotherPiece(payload)
    end
  end
end

class Consumer

  include Validator
  include GoWork

  QUEUE_NAMES = %w(QueueMain QueueLittle QueueTen) 

  def initialize
    #Start a RabbitMQ session
    @rdSession = Session.new
    @queues = QUEUE_NAMES.map { |name| [name.to_sym, rdSession.joinQueue(name)] }.to_h

    goWork
  end
end

另请参阅ruby​​ 样式指南,建议用户snake_case使用所有方法和变量名称以及CamelCase用于类和模块定义,但我没有这样做,因为这不是你的问题。还建议使用Rubocop来帮助记住正确的风格。

于 2018-10-29T01:04:38.177 回答