Metaclasse em Ruby!
Esse assunto é bem legal porém as vezes muito confuso vou tentar explica-lo sem confundir.
O que é uma Metaclasse?
Para que serve uma Metaclasse?
Bem antes vamos falar de Classes e Objetos. Vamos fazer uma classe simples para usarmos como exemplo.
Uma Classe é composta de atributos e métodos, entao todos os Objetos de uma classe tem em comum seus atributos e métodos. Porém cada objetos tem seus atributos específicos, ou seja, se uma classe tem o atributo “nome” todos os objetos teram um nome, so que para cada objetos o nome é particular, ex. Joao, Maria, Jose, etc. sendo assim cada Objeto tem seu próprio atributo e é individual. Já os métodos, sao todos iguais para todos os objetos, a ação de um método é sempre igual em todos os objetos.
E o que isso implica? É que quando se instancia um Objeto, o Objeto é colocado em memória e lá é reservado espaço de memória para todos seus atributos, isso é importante para que possamos guardar valores individuais para cada Objeto. Porém os métodos são iguais a todos os Objetos e não faz sentido ocupar espaço em memória colocando para cada Objeto seus métodos é muito mais inteligente colocar todos os métodos em um único Obejto e esses métodos serem usados por todos os Objetos da mesma Classe.
Bem este Objeto que guarda em sí todos os métodos de uma Classe chama-se Metaclasse! Em Ruby uma Metaclasse é um Objeto(constante) Singleton, que guarda em sí todos os métodos e representa a classe durante a execução do código.
Em miudos, em Ruby uma Metaclasse é um Objeto que representa a Classe, ou seja, uma espécie de procurador, ou executor do que está escrito na Classe. Estranho, mais é isso, lembrando que Classe nunca faz nada, pois em Orientação a Objetos só Objetos podem fazer algo e não Classe. Isso torna o ruby uma linguagem altamente Orientada a Objetos. Costuma-se dizer que em Ruby até as Classes são Objetos porém não é bem verdade Classes continuam sendo documentos e as Metaclasses é que são os Objetos que representão a Classe.
Fica Assim! Quando se escreve uma classe em Ruby automaticamente o interpretador cria um Objetos(Metaclasse) que representa essa Classe, este Objeto é uma constante por isso tem a primeira letra em maiúcula e é singleton, ou seja, só existe uma instancia em execução. Por fim não podemos deixa de lembrar que a Metaclasse é um Objeto, sendo um Objeto ele vem de uma classe, que é a classe “Class”, e tem atributos e métodos como qualquer Objeto. Vejamos:
Notem que no Objeto(metaclasse) que representa a Classe “Teste” não tem o método “falar”, isso porque ele não e da classe “Teste” e sim da classe “Class” e tem o métodos da sua classe. Mais o Objeto(metaclasse) guarda em si alguns métodos legais, como o método “new”.
Em algums linguagens de programação a criação de uma instacia de um objeto é feito pelo interpretador, já em Ruby a criação de uma instacia de um Objeto é feita pela sua Metaclasse, isso é ser Orientado a Objetos.
Bem classicamente o método “new” lê a documentação, ou seja a “Classe” e cria um Objeto com seus atributos em memória. Essa ação é realizada pelo método “new”. Sendo um método é possivel mudar seu comportamento, pensemos algo como.
- Primeiro abrir uma conexao com o Banco de dados
- Ir em uma tabela e coletar o nome de suas colunas
- depois criar um Objeto que tenha seus atributos representando essas colunas
- criar também todos os métodos de persistencia para essas informações no bando
Ficou mais legal assim o método “new”! heheh!
Olha que legal, em Ruby por a Metaclasse ser responsável pelo criação de Objetos, a Metaclasse tem em si um método “new”, sendo um método eu posso sobrescreve-lo e mudar seu comportamento natural, e colocar mais aqueles passos no método “new”, assim eu posso automatimente criar um Objeto que seja um modelo de Dados persistente em Banco de dados. legal isso. Acho que voces ja viram essa idéia no Activerecord do RubyonRails. Talvez voce esteja falando, poxa como é facil, aquela mágica todo é so isso!
Porém o Poder a Metaclasse vai muito além disso, vejamos outro exemplo classico e muito poderoso:
Vamos pensar em atributos. Para que seus atributos sejam Encapsulas corretametne é necessário que se tenha os métodos acessores. Métodos acessores, como o nome ja diz são os métodos que dão acesso ao atributo, os famosos métodos gets e sets, sempre chatos! Bem para criarmos um atributo e seus acessore a classe ficaria assim:
Bem assim é que se faz encapsulamento de atributos, é sempre a mesma coisa e sempre chata, agora pense em um objeto que tem vários atributos para cada atributo seus métodos acessores, isso é um tormento e não melhora em nada o código, pois sempre é meiro do mesmo jeito.
Deixando a chatisse dos métodos acessore de lado, e lembrando que nós temos uma Objeto(metaclasse) que faz as coisas para mim, porque não criarmos um método na Objeto(metaclasse) que escreva os métodos acessores para mim. Poxa isso seria mágico eu passaria a chatisse para o Objeto(metaclasse) fazer. Isso ja foi feito e é usado assim:
Existe o método “attr_acessor” escreve o Atributo e seus métodos acessores, este método é do Objeto(metaclasse).
Como existe o método “attr_accessor” existem vários outro metodos que nso ajuda a diminuir a aquntidade de código durante a programação. O mais legal de tudo é que voce pode escrever seus próprio métodos de ajuda, sei lá, alguma rotina que voce esteja reescrevendo, ou algo que de para automatizar é legal esse recurso, lembrabdo de nao esquecer do conseito DRY.
Bem acho que este artigo ta ficando muito cansativo e longo, vamos continuar vendo em outro artigo!
No proximo artigo veremos como colocar funcionalidades na Metaclass.
E onde fica os métodos dos objetos na metaclasse, e adicionar novos metodos de instancia,
Espero que estejam gostando do assunto, valeu!!
Comments
3 Respostas para “Metaclasse em Ruby!”
Deixe um comentário
Muito bOm esSe aRtigo!!
mOstra de fOrma simples e facil de entender
a implementação de meTacLasses e métodos acessores..
paRabéns aee…
eLevandO a cuLtura do nOrte!!!!
xD
[...] Este artigo é uma continuação de Metaclasse em Ruby! [...]
[...] tem a primeira letra em maiúcula e é singleton, ou seja, só existe uma … fique por dentro clique aqui. Fonte: [...]