#3 Metaprogramação: method_missing()

10 February 2010

No último post vimos como aplicar metaprogramação para melhorar a classe Computador, utilizando Dynamic Methods e Dynamic Dispatch. Porém essa não é a única forma. Você já conhece o modelo de objetos Ruby e a técnica "one step right, then up", que consiste em primeiro procurar um método na classe do objeto receiver e depois subir em suas superclasses. Quando o Ruby não encontra o método invocado nesse caminho, é disparado NoMethodError: Quando o método format é chamado, Ruby verifica a classe Computador e procura pelos métodos de instância. Se ele não encontrar lá, ele começa a procurar nas superclasses até chegar em Object e Object inclui um método chamado method_missig().
Ghost Methods: Sobrescrevendo o method_missing()
Toda mensagem direcionada ao method_missing inclui o nome do método chamado mais todos os argumentos ou blocos associados. Obs: method_missing é muito usado em Ruby, bons exemplos podem ser encontrados no Ruport, OpenStruct e no próprio Rails.
Refatorando
Vamos utilizar o method_missig para refatorar nossa classe Computador. O que acontece quando um método como cpu é chamado ? A chamada chega no method_missig, que verifica se a classe possui um método chamado get_cpu_info(). Caso não exista, a chamada cai no method_missing do Kernel, que foi sobrescrito! Agora com apenas um método nossa classe resolve todos os casos que precisamos! Continua Próximo post - Blocos
comments powered by Disqus