Gente,
  Estaba tirando código para un proyecto personal (una implementación
en Ruby de
  un server del protocolo OpenDMTP) y me encontre con la necesidad de
que una clase
  interprete si los datos que recibe desde un socket estan en un
formato binario o texto
  y genere una instancia que actue sobre esa codificación.

  Leyendo varios articulos encontrados en google respecto a la
implementación del patron
  factory en ruby y jugando un poco con metaprogramación, me quedó el
siguiente codigo:

  class Packet

    class << self
      alias :nuevo :new

      def inherited(subclass)
        class << subclass
          alias :new :nuevo
        end
      end

      def new(*args)
        msg = *args
        encoding = get_packet_encoding(msg)
        Kernel.const_get(encoding).new unless encoding == "Unknown"
      end

      def get_packet_encoding(msg)
        encoding = case msg[0]
          when 224 then "BinaryPacket"
          when 36 then "TextPacket"
          else "Unknown"
        end
      end
    end

    def initialize
      puts "hola desde #{self.class}"
    end
  end

  class TextPacket < Packet
  end

  class BinaryPacket < Packet
  end

  No conocia la posibilidad de definir alias de metodos, la
posibilidad de hacer modificaciones
  temporales en runtime "backupeando" el metodo con un alias es alucinante.

  Si uno le muestra esto a un programador que no conozca ruby, cuando
entienda como
  funciona se le vuela el peluquín. :)

  Calculo que en un par de meses voy a tener una implementacion
cliente-servidor de
  OpenDMTP decente basada en EventMachine, cuando la termine la voy a liberar.

  En fin, queria compartir mi "descubrimiento" con ustedes.

Saludos.
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a