diegodfsd
7/15/2011 - 10:47 PM

Bad Single Responsibility Principle Example

Bad Single Responsibility Principle Example

#params = Parameter.new "registration", "0000000000000000"
#transaction = Transaction.create! params, connection

module Integration
   class Transaction
      attr_reader :data

      def initialize(data)
        @data = data
      end

    def self.create!(params, connection)
      response = connection.make_request! params.to_s
      Transaction.new response
    end
   end

   class Parameter
      def initialize(registration, card)
         @registration = registration
         @card = card
      end

     def to_s
        serialize
     end

     private
      def serialize
        xml_builder("requisicao-transacao") do |xml|
          xml.numero @registration.id
          xml.valor @registration.training_class.price.to_i * 100
          xml.moeda "986"
          # ... MONTA UM XML COMPLEXO ...
        end
      end
   end

  class WrapperConnection
    def initialize(connection = Integration::Connection.new, xml_parser = XmlParser.new)
      @connection = connection
    end

    def make_request!(message)
      params = { mensagem : message.target! }

      response = @connection.request! params
      raise_exception response

      xml_parser.parse response
    end

    def raise_exception(response)
       unless response == Net::HTTPSuccess
         raise "Impossível contactar o servidor"
       end
    end
  end

  class XmlParser
    def parse(response)
      document = REXML::Document.new(response.body)
      parse_elements document.elements
    end

    private
      def parse_elements(elements)
        map={}
        elements.each do |element|
          element_map = {}
          # ... FAZ ALGO COM OS ELEMENTOS DO XML ...
          map.merge!(element.name => element_map)
        end
        map.symbolize_keys
      end
  end
end