Classes abertas e monkey patch

Em uma palestra do Guilherme Silveira e Ricardo Valeriano na RubyConf Brasil 2012, foi comentado que, para se tornar um melhor programador, é importante conhecer as entranhas da linguagem usada.

Partindo dessa ideia, é importante entender como são criados os objetos e como ocorrem determinados processos dentro de classes e objetos. O modelo de objetos do Ruby é composto por alguns tópicos.


Classes abertas

Em um outro post, falei que quase tudo é objeto. As classes desses objetos podem ser “abertas” em tempo de execução, inclusive aquelas da própria biblioteca padrão. Veja um exemplo:

Podemos usar este comportamento em objetos do tipo String. Veja o resultado:

A classe String não recebeu uma nova definição. A linguagem sabe quando existe uma classe definida e, caso exista, ela apenas “reabre” para adicionar ou modificar um comportamento.


Monkey patch

Seguindo o conceito de classes abertas, monkey patch é, em outras palavras, extender ou modificar comportamentos de métodos em classes existentes. Considerando que temos o seguinte comportamento quando mapeamos um objeto, a fim de obter o valor de um atributo qualquer.

Com a implementação acima, o output padrão é:

Agora, aplicando um monkey patch, podemos alterar o comportamento padrão para que todo output seja com letras maiúsculas. Veja a modificação:

Depois das modificações, o output é:

Em toda sua aplicação, mapeamento de objetos usando o protocolo to_proc serão afetados pelo novo comportamento.

Por conta disto, muitos desenvolvedores consideram monkey patch perigoso, e com razão, visto que alterar comportamentos de métodos da biblioteca padrão do Ruby não soa normal. Seu uso deve ter uma excelente justificativa!

A partir da versão (2.0) é possivel aplicar monkey patching em um escopo bem definido. Leia mais sobre o recurso refinements.

Like what you read? Give Rogério Zambon a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.