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.

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!!

O Projeto Da Vinci VM!!

Da Vinci

Da Vinci

A Proxima Grande Revolução da Informática!

De Tempos em Tempos acontecem algumas coisas que mudam o mundo de maneira tão grande que é impossível tentar prever as coisas depois da mudança, e também após a mudança fica dificil lembrar como viviamos sem ela. Bem são essas mudanças que mudam o rumo de nossas vidas e torna o mundo diferente.

Talvez voce esteja se perguntando, do que o IsaacGuerra ta falando! Que mudança é essa?

Revolução da Tecnologia

Revolução da Tecnologia

Sim eu vejo um projeto que pode mudar o modo em que programamos e tratamos a programação!

Só o simples pensamento de que a maioria das coisas que fazemos pode ser bem mais fácil, que  tudo que criamos pode ser mais acessível, ja cria em mim um anseio e uma esperança que me faz ter curiosidade e um pouco de medo do futuro.

Bem vamos falar de programação!! de Código que é o que interessa!

Hoje com certeza vivemos uma mudança interessante mais muito timida da forma que programamos, com o aparecimento de linguagens mais gostosas como Ruby, Smalltalk, Phyton, etc.. Porém, como o Fabio King sempre diz, nao existe a linguagem completa que resolve tudo que agrega em si a solução total para todos os problemas e isso.

É isso que eu busco em uma liguagem, algo que eu possa nao escrer tudo em uma boa linguagem e sim que eu possa usar a linguagem certa na hora certa, onde tudo que eu fizer seja cambiavel entre elas, sem nenhum transtorno. Neste sentido eu busqui muito, hoje eu acedito que possamos fazer muita coisa em muitas linguagens legais, tais como C, C#, PHP, JAVA, RUBY, PHYTON, PERL, LISP, SMALLTALK, JAVASCRIPT, etc.. Em si toda linguagem faz alguma coisa de bom, agrega em amlgum ponto algo memorável e que ajuda o programador fazer algo.

Porem por mais que eu tenha procurado uma linguagem que faça tudo da melhor maneira ainda nao encontrei. Bem mais foi quando eu vi algumas coisas acontecerem meio timidas e elas foram se encaixando e mostrando que este sonho, o sonho de poder juntar tudo varias linguagens em uam só, nde seis Conponentes, APIs, Bibliotecas sejam cambiaves. Bem eu esperava a linguagem completa mais nao é isso que vai ser.

A Algum tempo a SUM a mantenedora do JAVA abriu o fonte de sua maquina virtual, isso nao foi bombastico nem muita novidade, porém, de alguma forma esse movimento esta mudando o mundo. Na verdade o JAVA e um conjunto de tecnologia sendo RunTime, SDK e linguagem, onde a pior parte de tudo isso com certeza e a linguagem, porém a Maquina Virtual ja tem mais de dez anos e muitos bilhoes de dolares de grandes empresas investidos em otimiza-la, com isso criu-se um ambiente seguro e confiável. Bem mais onde entra e revolução.

Notem que a JVM ja e Multiplataforma agora o grande esforço é que ela seja multilinguagem, onde todas linguagens de ante mao ganham o poder de serem multiplatafor, ganham também o poder e as otimizações do Ambiente Java, e por fim o melhor onde as APIs e bibliotecas ja escritas podem ser consumidas por qualquer Linguagem. Bem isso é legal e dizer que eu posso a partir do Phyton acessar um recurso escrito em Java, bem isso e legal, mais o mais legal e que algo escrito em Ruby seja acessivel em Java, e assim por diante, ou seja todos os recursos escritos habitarem um ambente comum e ser acessível por qualquer linguagem, com isso todo esforço será reusado.

Isso e diser que suas bibliotecas escritas hoje possam ser usadas nas proximas linguagens que vc quiser usar, e entendender que seu programa pode ser escrito por várias linguagens onde cada linguagem faça o que tem de melhor e por fim o seu sistema seja melhor.

Bem esse projeto ja existe e se chama “Da Vinci Machine Project”.

Uma linguagem que foi extremamente importante para o inicio do projeto Da Vinci foi Ruby com o JRuby, onde é possivel rodar aplicações Ruby sobre a VM Java, e mais legal e poder usar todas as bibliotecas escrita em Java em Ruby, bem é interessante também para equipes multidisciplinares, com a possibilidade de escrita em várias linguagens não obriga a equipe escrever tudo na mesma linguagem. Bem eu vou continuar esse assumto com mais dados tecnicos, falando mais sobre HotSpot, JIT, GC, etc.

Valeu!!!