代码之家  ›  专栏  ›  技术社区  ›  userMod2

Ruby类设计-我应该在一个单独的文件中创建常量吗?

  •  1
  • userMod2  · 技术社区  · 6 年前

    所以我的课现在大致上是这样的:

    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 ?

    如有任何意见/建议,将不胜感激。

    试着去理解好的设计?

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   lacostenycoder    6 年前

    在这里,你可以重构更多的东西,但基本上是的,你可以将提升移到一个模块,多亏了@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 style guide 建议用户使用 snake_case CamelCase 类和模块定义,但我没有这样做,因为这不是你的问题。也建议使用 Rubocop 帮助你记住正确的风格。

    推荐文章