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