terça-feira, 3 de dezembro de 2013

Ruby 5 - METAPROGRAMAÇÃO

Ruby Metaprogramming


Metaprogramação

Metaprogramação é a codificação de programas de computador que escrevem ou manipulam outros programas (ou a si próprios), como seus dados, ou que fazem parte do trabalho em tempo de compilação, que poderiam ser feito em tempo de execução.

Em alguns casos, isso permite que os programadores para minimizar o número de linhas de código para expressar uma solução (reduzindo assim o tempo de desenvolvimento), ou dá programas de maior flexibilidade para lidar eficientemente com situações novas sem recompilação.

Código Ruby pode modificar programaticamente, em tempo de execução, aspectos de sua própria estrutura que seriam fixados em línguas mais rígidas, tais como definições de classe e método. Este tipo de metaprogramação pode ser usado para escrever códigos mais concisos e ampliar eficazmente a linguagem.

Por exemplo, o seguinte código Ruby gera novos métodos para a classe interna String, com base em uma lista de cores. Os métodos envolvem o conteúdo da string com uma tag HTML estilizada com a respectiva cor:

COLORS = { black:   "000",
           red:     "f00",
           green:   "0f0",
           yellow:  "ff0",
           blue:    "00f",
           magenta: "f0f",
           cyan:    "0ff",
           white:   "fff" }
 
class String
  COLORS.each do |color,code|
    define_method "in_#{color}" do
      "<span style=\"color: ##{code}\">#{self}</span>"
    end
  end
end
Os métodos gerados podem então ser usados assim:
"Hello, World!".in_blue
 => "<span style=\"color: #00f\">Hello, World!</span>"
Para implementar o equivalente em outras línguas, o programador teria que escrever cada método (in_black, in_red, in_green, etc) separadamente.
Alguns outros usos possíveis para o Ruby metaprogramação incluem:
  • interceptar e modificar chamadas de método.
  • implementação de novos modelos de herança.
  • gerar dinamicamente as classes a partir de parâmetros.
  • serialização automática de objetos.
  • ajuda interativa e depuração.

Nenhum comentário:

Postar um comentário