SlideShare uma empresa Scribd logo
1 de 8
Baixar para ler offline
ENGENHARIAS E TECNOLOGIA – Computação e Informática
UM ESTUDO SOBRE METAPROGRAMAÇÃO: AS LINGUAGENS DE
PROGRAMAÇÃO PYTHON E RUBY
Autor: LUCAS FURTADO DE OLIVEIRA
Coautor: RODRIGO VITTORAZO
Orientador: Prof. Fernando Salles Claro
Resumo
A proposta para este projeto de pesquisa é apresentar a técnica de
desenvolvimento de software denominada Metaprogramação, utilizando as
linguagens de altíssimo nível e de características dinâmicas Python e Ruby.
Linguagens dinâmicas (também denominadas linguagens de script) tem como
fundamentos as habilidades de que suas classes e objetos consigam ler seus
atributos (Introspecção ou Reflexão) e de alterar o comportamento de seus
objetos em tempo de execução (Interseção), sem estas características, não
seria possível a Metaprogramação. A utilização de linguagens de programação
com estas características no desenvolvimento de softwares vem se destacando
quando se deseja maior produtividade e menor curva de aprendizagem. Para
o desenvolvimento do trabalho, será realizado uma pesquisa do tipo
exploratória através de um levantamento bibliografia, discutindo conclusões e
agregando ideias de pesquisas realizadas ao longo do tempo por estudiosos da
área de ciências da computação, obtendo assim uma compreensão mais clara
sobre como se deve aplicar a esta técnica de desenvolvimento de softwares.
Este estudo tem como objetivo principal definir o que é Metaprogramação, a
importância de seu estudo, além de aplica-lá através de exemplos, mostras
diferenças como sintaxe e estrutura ao emprega-lá em linguagens diferentes, e
avalia-lá, pontuando suas vantagens e desvantagens.
Introdução
A Metaprogramação pode ser definida como “código que escreve
código”, ou seja, um programa que pode criar ou alterar outros programas ou a
si mesmo. Esta técnica vem sendo utilizada para o aumento de produtividade
no desenvolvimento de software, pois evita que partes do código fonte sejam
escritos diretamente pelo programador.
Linguagens com essas características de manipular código fonte são
denominadas Metalinguagens. Exemplos são Lisp, Python e Ruby, que
possuem recursos como reflexão e a própria linguagem como um objeto de
primeira classe.
Metaprogramas podem ser classificados como estáticos, por exemplo os
compiladores e pre-processadores, que são executados antes do código que
manipulam, e dinâmicas, por exemplos frameworks como Ruby on Rails e
Django, em que a execução e modificação no código são realizadas em
conjunto.
Objetivo
O objetivo deste trabalho é compreender o que é a metaprogramação,
agrupar conhecimentos, ideias, estudos e experiencias, destacando vantagens,
desvantagens, formas de aplicação, avaliações de quando aplicar esta técnica,
críticas e dicas, utilizando os recursos disponíveis presentes nas linguagens
de programação Python e Ruby .
Metodologia
Para o desenvolvimento do trabalho proposto, a metodologia consiste
em uma pesquisa do tipo exploratória, realizando um levantamento bibliográfico
por meio de livros e artigos de autores famosos no meio do desenvolvimento
de software, como Luciano Ramalho, Fabio Akita, Dave Thomas, Guido van
Russum e Yukihiro Matsumoto . A pesquisa também se baseia na interpretação
das ideias propostas por estes pesquisadores, a fim de agrupá-las para a
resolução do mesmo problema.
Desenvolvimento
A Metaprogramação se baseia no fato de um software poder escrever ou
manipular outros softwares (compiladores). Linguagens com essa
características são denominadas metalinguagens, já a linguagem do programa
manipulado é denominada linguagem objeto. Metaprogramas também podem
se referir a programas que gerem ou manipulam seu próprio código, ou seja, a
metalinguagem e a linguagem objeto são a mesma linguagem. Estas
características muitas vezes é denominada reflexão, e são mais comuns em
linguagens de alto nível onde não há uma separação exata entre o tempo de
compilação e execução, como Python e Ruby.
Python é uma linguagem de programação desenvolvida por Guido van Rossum
em 1991, a motivação para criação desta linguagem foi a necessidade de uma
linguagem de alto nível para um projeto de sistema operacional chamado de
Amoeba.
Segundo Rossum, o desenvolvimento na linguagem C das ferramentas de
administração do projeto estava demorando demais, e a linguagem não
funcionaria por uma serie de rações na Bourne Shell do sistema operacional.
Então houve a carência de uma linguagem que pudesse fazer uma ligação
entre a linguagem C e a Shell do sistema operacional.
Ruby é uma linguagem de programação orientada a objeto desenvolvida por
Yukihiro Matsumoto em 1993 e apresentada ao publico somente em 1995.
Ficou conhecida como Matz. É uma linguagem de simples compreensão e
leitura, que possibilita o desenvolvimento e manutenção em um curto periodo
de tempo.
Um dos exemplos mais comuns de “código escrevendo código” esta na forma
como são definidos os métodos acessores em Ruby, não precisamos definir
cada método getter e setter, podemos utilizar o método de classe
attr_accessor.
>>> Class Person
>>> attr_accessor :name
>>> end
>>> p = Person.new
>>> p.name = "lucas"
>>> puts p.name
=> "lucas"
Em Python, assim como no Ruby, tudo é um objeto, incluindo classes, como
pode ser visto no exemplo a seguir, demonstrando que a classe str do Python
é na verdade um objeto do tipo “type”:
>>> type(str)
<type 'type'>
Podemos também inspecionar um elemento, visualizando seus métodos e
atributos em tempo de execução:
#Exemplo em Python
>>>dir(int)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__',
'__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__',
'__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__',
'__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__',
'__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__',
'__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__',
'__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__',
'__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__',
'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
Neste exemplo, utilizando o method helper dir para retornas todos os métodos
da classe int, que em Python representa números inteiros.
Métodos
Além desses recursos, os objetos são abertos, ou seja, podemos modificar seu
comportamento. Como exemplo o script abaixo modificamos o comportamento
de subtração de inteiros em Ruby, agora realizando adição:
#Código em Ruby
>>1 + 1
2
>>class Fixnum
>> def +(other)
>> self - other
>> end
>>end
>>1 + 1
=> 0
Podemos definir novos métodos e comportamentos para um determinado
objeto, não afetando outros que foram instanciados a partir da mesma classe:
>>> a = "string"
=> "string"
>>> a.say_hello
NoMethodError: undefined method `say_hello' for "string":String
from (irb):3
from /usr/bin/irb:12:in `<main>'
>>> def a.say_hello
>>> "Hello"
>>> end
>>> a.say_hello
=> "Hello"
>>> "other string".say_hello
NoMethodError: undefined method `say_hello' for "other string":String
from (irb):8
from /usr/bin/irb:12:in `<main>'
Considerando as afirmações anteriores, levar o dinamismo a um novo nível. No
próximo exemplo, estamos criando um novo tipo de objeto de adiciona um novo
método a outros objetos:
>>> class Student; end
>>> class Teacher
>>> def teach(student)
>>> def student.writing
>>> puts "writing"
>>> end
>>> end
>>> end
>> student = Student.new
>>student.writing
NoMethodError: undefined method `writing' for #<Student:0x00000000e75568>
from (irb):31
from /usr/bin/irb:12:in `<main>'
>> teacher = Teacher.new
>> teacher.teach(student)
>> studend.writing
=> writing
Outra característica interessante em Ruby esta na forma como os métodos de
um objeto são invocados, são apenas chamadas por referencias passando
como argumento o nome do método desejado. Assim, podemos invocar
métodos dinamicamente utilizando outro método especial send:
>>> 12.to_s
=> "12"
>>> 12.send :to_s
=> "12"
Não bastando todo este flexibilidade, podemos definir construir as chamadas
de métodos dinamicamente, podemos utilizar o método especial
method_missing. Este método vai intercepta chamadas de métodos que não
existem, possibilitando adicionar funcionalidades de acordo com as
necessidades.
>>> class Person
>>> def method_missing(method, *args)
>>> message = method.to_s.split("_")
>>> puts message.last if message.first == "say"
>>> end
>>> end
>>> person = Person.new
>>> person.say_hello
=> hello
>>> person.say_world
=> world
Resultados
Com a pesquisa realizada foi possível obter experiencia em técnicas de
Metaprogramação através da exploração das linguagens Python e Ruby,
capacitando os leitores há aplicar os estudos levantados por este trabalho em
seus projetos, independente de seus tamanhos.
Outra vantagem obtida foi mostrar a importância da Metaprogramação
no desenvolvimento de software, pois seu conhecimento é de grande
importância para a utilização de frameworks como Ruby e Django.
Também foi constatado que a Metaprogramação deve ser usada com
moderação e sabedoria, apesar de uma técnica poderosa, o codigo criado
pode se tornar difícil de ler, entender e manter.
Finalmente, foi possível definir o conceito de Metaprogramação de forma
clara, habilitando leitores a aplicá-los em outras linguagens além de Python e
Ruby .
Considerações Finais
Com o estudo realizado, foi constatada a aplicabilidade da Metaprogramação
no desenvolvimento de software para obter reusabilidade, escalabilidade e
atender a complexidade exigida das aplicações atuais.
Fontes Consultadas
THOMAS, Dave; HANSSON, David Heinemeier; BREEDT, Leon.
Desenvolvimento Web ágil com Rails. 2. ed. Porto Alegre: Bookman, 2008.
URUBATAN, Rodrigo. Desenvolvimento Fácil e Rápido de Aplicações Web.
2. ed. São Paulo: Novatec, 2012.
THOMAS, Date; FOWLER, Chad; HUNT, Andy. Programming Ruby 1.9: The
Pragmatic Programmers Guide. Dallas: The Pragmatic Programmes, 2010.
LUTZ, Mark; ASCHER, David. Aprendento Python: Programação orientada a
objetos. 2. ed. Porto Alegre: O'reilly, 2007.
BORGES, Luiz Eduardo. Python para Desenvolvedores. 2. ed. Rio de
Janeiro: Edição do Autor, 2010.

Mais conteúdo relacionado

Mais procurados

Introdução ao paradigma imperativo
Introdução ao paradigma imperativoIntrodução ao paradigma imperativo
Introdução ao paradigma imperativoTony Alexander Hild
 
Linguagens de programação
Linguagens de programaçãoLinguagens de programação
Linguagens de programaçãoessa
 
Linguagens de programação 03-12-09
Linguagens de programação   03-12-09Linguagens de programação   03-12-09
Linguagens de programação 03-12-09essa
 
Paradigmas de Linguagens de Programacao - Aula #1
Paradigmas de Linguagens de Programacao - Aula #1Paradigmas de Linguagens de Programacao - Aula #1
Paradigmas de Linguagens de Programacao - Aula #1Ismar Silveira
 
Linguagens de Programação
Linguagens de ProgramaçãoLinguagens de Programação
Linguagens de ProgramaçãoBeDMK
 
Linguagen..
Linguagen..Linguagen..
Linguagen..essa
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para LinuxChris x-MS
 
Apresentação final
Apresentação finalApresentação final
Apresentação finalvalmon
 
Introdução a Linguagem de Programação
Introdução a Linguagem de ProgramaçãoIntrodução a Linguagem de Programação
Introdução a Linguagem de ProgramaçãoJessica Ribeiro
 
Linguagem de programação
Linguagem de programação Linguagem de programação
Linguagem de programação Marcos Gregorio
 

Mais procurados (17)

Introdução ao paradigma imperativo
Introdução ao paradigma imperativoIntrodução ao paradigma imperativo
Introdução ao paradigma imperativo
 
Linguagens de programação
Linguagens de programaçãoLinguagens de programação
Linguagens de programação
 
Linguagem c
Linguagem cLinguagem c
Linguagem c
 
1.1.paradigmas
1.1.paradigmas1.1.paradigmas
1.1.paradigmas
 
Linguagens de programação 03-12-09
Linguagens de programação   03-12-09Linguagens de programação   03-12-09
Linguagens de programação 03-12-09
 
Paradigmas de Linguagens de Programacao - Aula #1
Paradigmas de Linguagens de Programacao - Aula #1Paradigmas de Linguagens de Programacao - Aula #1
Paradigmas de Linguagens de Programacao - Aula #1
 
Linguagens de Programação
Linguagens de ProgramaçãoLinguagens de Programação
Linguagens de Programação
 
Linguagen..
Linguagen..Linguagen..
Linguagen..
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para Linux
 
Apresentação final
Apresentação finalApresentação final
Apresentação final
 
Linguagem da programação
Linguagem da programaçãoLinguagem da programação
Linguagem da programação
 
02 historia da programação
02   historia da programação02   historia da programação
02 historia da programação
 
Introdução a Linguagem de Programação
Introdução a Linguagem de ProgramaçãoIntrodução a Linguagem de Programação
Introdução a Linguagem de Programação
 
Cap02
Cap02Cap02
Cap02
 
Linguagens de programação
Linguagens de programaçãoLinguagens de programação
Linguagens de programação
 
15. introducao ao c++
15. introducao ao c++15. introducao ao c++
15. introducao ao c++
 
Linguagem de programação
Linguagem de programação Linguagem de programação
Linguagem de programação
 

Semelhante a UM ESTUDO SOBRE METAPROGRAMAÇÃO: AS LINGUAGENS DE PROGRAMAÇÃO PYTHON E RUBY

LIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO ILIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO IOs Fantasmas !
 
Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos Luis Ferreira
 
Desenvolvimento de aplicações web em Dart
Desenvolvimento de aplicações web em DartDesenvolvimento de aplicações web em Dart
Desenvolvimento de aplicações web em DartRoger Ritter
 
Java programação orientada a objetos
Java   programação orientada a objetosJava   programação orientada a objetos
Java programação orientada a objetosPaulo Carvalho
 
Linguagens de programação 03-12-09
Linguagens de programação   03-12-09Linguagens de programação   03-12-09
Linguagens de programação 03-12-09essa
 
Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01joaocarlobarros
 
Paradigmas da programacao apostila
Paradigmas da programacao apostilaParadigmas da programacao apostila
Paradigmas da programacao apostilaNathiele Lacerda
 
Net uma revisão sobre a programação orientada a objetos
Net   uma revisão sobre a programação orientada a objetosNet   uma revisão sobre a programação orientada a objetos
Net uma revisão sobre a programação orientada a objetosLP Maquinas
 
DDD e PHP - TDC 2012
DDD e PHP - TDC 2012DDD e PHP - TDC 2012
DDD e PHP - TDC 2012Luís Cobucci
 
Técnicas_Implementação
Técnicas_ImplementaçãoTécnicas_Implementação
Técnicas_ImplementaçãoWagner Zaparoli
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaSérgio Souza Costa
 
Orientação a objetos java
Orientação a objetos javaOrientação a objetos java
Orientação a objetos javavicnetepc
 

Semelhante a UM ESTUDO SOBRE METAPROGRAMAÇÃO: AS LINGUAGENS DE PROGRAMAÇÃO PYTHON E RUBY (20)

Introdução ao Ruby on Rails
Introdução ao Ruby on RailsIntrodução ao Ruby on Rails
Introdução ao Ruby on Rails
 
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO ILIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
LIVRO PROPRIETÁRIO - PROGRAMAÇÃO I
 
Ruby
RubyRuby
Ruby
 
Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos
 
Desenvolvimento de aplicações web em Dart
Desenvolvimento de aplicações web em DartDesenvolvimento de aplicações web em Dart
Desenvolvimento de aplicações web em Dart
 
Java programação orientada a objetos
Java   programação orientada a objetosJava   programação orientada a objetos
Java programação orientada a objetos
 
Linguagens de programação 03-12-09
Linguagens de programação   03-12-09Linguagens de programação   03-12-09
Linguagens de programação 03-12-09
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01
 
Paradigmas da programacao apostila
Paradigmas da programacao apostilaParadigmas da programacao apostila
Paradigmas da programacao apostila
 
Net uma revisão sobre a programação orientada a objetos
Net   uma revisão sobre a programação orientada a objetosNet   uma revisão sobre a programação orientada a objetos
Net uma revisão sobre a programação orientada a objetos
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
DDD e PHP - TDC 2012
DDD e PHP - TDC 2012DDD e PHP - TDC 2012
DDD e PHP - TDC 2012
 
Cap02
Cap02Cap02
Cap02
 
Cap02
Cap02Cap02
Cap02
 
Linguagem Python
Linguagem PythonLinguagem Python
Linguagem Python
 
Padrões de Projeto de Software
Padrões de Projeto de SoftwarePadrões de Projeto de Software
Padrões de Projeto de Software
 
Técnicas_Implementação
Técnicas_ImplementaçãoTécnicas_Implementação
Técnicas_Implementação
 
Linguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo LuaLinguagens de Script: Caso de Estudo Lua
Linguagens de Script: Caso de Estudo Lua
 
Orientação a objetos java
Orientação a objetos javaOrientação a objetos java
Orientação a objetos java
 

UM ESTUDO SOBRE METAPROGRAMAÇÃO: AS LINGUAGENS DE PROGRAMAÇÃO PYTHON E RUBY

  • 1. ENGENHARIAS E TECNOLOGIA – Computação e Informática UM ESTUDO SOBRE METAPROGRAMAÇÃO: AS LINGUAGENS DE PROGRAMAÇÃO PYTHON E RUBY Autor: LUCAS FURTADO DE OLIVEIRA Coautor: RODRIGO VITTORAZO Orientador: Prof. Fernando Salles Claro Resumo A proposta para este projeto de pesquisa é apresentar a técnica de desenvolvimento de software denominada Metaprogramação, utilizando as linguagens de altíssimo nível e de características dinâmicas Python e Ruby. Linguagens dinâmicas (também denominadas linguagens de script) tem como fundamentos as habilidades de que suas classes e objetos consigam ler seus atributos (Introspecção ou Reflexão) e de alterar o comportamento de seus objetos em tempo de execução (Interseção), sem estas características, não seria possível a Metaprogramação. A utilização de linguagens de programação com estas características no desenvolvimento de softwares vem se destacando quando se deseja maior produtividade e menor curva de aprendizagem. Para o desenvolvimento do trabalho, será realizado uma pesquisa do tipo exploratória através de um levantamento bibliografia, discutindo conclusões e agregando ideias de pesquisas realizadas ao longo do tempo por estudiosos da área de ciências da computação, obtendo assim uma compreensão mais clara sobre como se deve aplicar a esta técnica de desenvolvimento de softwares. Este estudo tem como objetivo principal definir o que é Metaprogramação, a importância de seu estudo, além de aplica-lá através de exemplos, mostras diferenças como sintaxe e estrutura ao emprega-lá em linguagens diferentes, e avalia-lá, pontuando suas vantagens e desvantagens. Introdução A Metaprogramação pode ser definida como “código que escreve código”, ou seja, um programa que pode criar ou alterar outros programas ou a si mesmo. Esta técnica vem sendo utilizada para o aumento de produtividade
  • 2. no desenvolvimento de software, pois evita que partes do código fonte sejam escritos diretamente pelo programador. Linguagens com essas características de manipular código fonte são denominadas Metalinguagens. Exemplos são Lisp, Python e Ruby, que possuem recursos como reflexão e a própria linguagem como um objeto de primeira classe. Metaprogramas podem ser classificados como estáticos, por exemplo os compiladores e pre-processadores, que são executados antes do código que manipulam, e dinâmicas, por exemplos frameworks como Ruby on Rails e Django, em que a execução e modificação no código são realizadas em conjunto. Objetivo O objetivo deste trabalho é compreender o que é a metaprogramação, agrupar conhecimentos, ideias, estudos e experiencias, destacando vantagens, desvantagens, formas de aplicação, avaliações de quando aplicar esta técnica, críticas e dicas, utilizando os recursos disponíveis presentes nas linguagens de programação Python e Ruby . Metodologia Para o desenvolvimento do trabalho proposto, a metodologia consiste em uma pesquisa do tipo exploratória, realizando um levantamento bibliográfico por meio de livros e artigos de autores famosos no meio do desenvolvimento de software, como Luciano Ramalho, Fabio Akita, Dave Thomas, Guido van Russum e Yukihiro Matsumoto . A pesquisa também se baseia na interpretação das ideias propostas por estes pesquisadores, a fim de agrupá-las para a resolução do mesmo problema. Desenvolvimento A Metaprogramação se baseia no fato de um software poder escrever ou manipular outros softwares (compiladores). Linguagens com essa características são denominadas metalinguagens, já a linguagem do programa manipulado é denominada linguagem objeto. Metaprogramas também podem se referir a programas que gerem ou manipulam seu próprio código, ou seja, a
  • 3. metalinguagem e a linguagem objeto são a mesma linguagem. Estas características muitas vezes é denominada reflexão, e são mais comuns em linguagens de alto nível onde não há uma separação exata entre o tempo de compilação e execução, como Python e Ruby. Python é uma linguagem de programação desenvolvida por Guido van Rossum em 1991, a motivação para criação desta linguagem foi a necessidade de uma linguagem de alto nível para um projeto de sistema operacional chamado de Amoeba. Segundo Rossum, o desenvolvimento na linguagem C das ferramentas de administração do projeto estava demorando demais, e a linguagem não funcionaria por uma serie de rações na Bourne Shell do sistema operacional. Então houve a carência de uma linguagem que pudesse fazer uma ligação entre a linguagem C e a Shell do sistema operacional. Ruby é uma linguagem de programação orientada a objeto desenvolvida por Yukihiro Matsumoto em 1993 e apresentada ao publico somente em 1995. Ficou conhecida como Matz. É uma linguagem de simples compreensão e leitura, que possibilita o desenvolvimento e manutenção em um curto periodo de tempo. Um dos exemplos mais comuns de “código escrevendo código” esta na forma como são definidos os métodos acessores em Ruby, não precisamos definir cada método getter e setter, podemos utilizar o método de classe attr_accessor. >>> Class Person >>> attr_accessor :name >>> end >>> p = Person.new >>> p.name = "lucas" >>> puts p.name => "lucas"
  • 4. Em Python, assim como no Ruby, tudo é um objeto, incluindo classes, como pode ser visto no exemplo a seguir, demonstrando que a classe str do Python é na verdade um objeto do tipo “type”: >>> type(str) <type 'type'> Podemos também inspecionar um elemento, visualizando seus métodos e atributos em tempo de execução: #Exemplo em Python >>>dir(int) ['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real'] Neste exemplo, utilizando o method helper dir para retornas todos os métodos da classe int, que em Python representa números inteiros. Métodos Além desses recursos, os objetos são abertos, ou seja, podemos modificar seu comportamento. Como exemplo o script abaixo modificamos o comportamento de subtração de inteiros em Ruby, agora realizando adição: #Código em Ruby >>1 + 1 2 >>class Fixnum >> def +(other) >> self - other >> end
  • 5. >>end >>1 + 1 => 0 Podemos definir novos métodos e comportamentos para um determinado objeto, não afetando outros que foram instanciados a partir da mesma classe: >>> a = "string" => "string" >>> a.say_hello NoMethodError: undefined method `say_hello' for "string":String from (irb):3 from /usr/bin/irb:12:in `<main>' >>> def a.say_hello >>> "Hello" >>> end >>> a.say_hello => "Hello" >>> "other string".say_hello NoMethodError: undefined method `say_hello' for "other string":String from (irb):8 from /usr/bin/irb:12:in `<main>' Considerando as afirmações anteriores, levar o dinamismo a um novo nível. No próximo exemplo, estamos criando um novo tipo de objeto de adiciona um novo método a outros objetos: >>> class Student; end >>> class Teacher >>> def teach(student) >>> def student.writing >>> puts "writing"
  • 6. >>> end >>> end >>> end >> student = Student.new >>student.writing NoMethodError: undefined method `writing' for #<Student:0x00000000e75568> from (irb):31 from /usr/bin/irb:12:in `<main>' >> teacher = Teacher.new >> teacher.teach(student) >> studend.writing => writing Outra característica interessante em Ruby esta na forma como os métodos de um objeto são invocados, são apenas chamadas por referencias passando como argumento o nome do método desejado. Assim, podemos invocar métodos dinamicamente utilizando outro método especial send: >>> 12.to_s => "12" >>> 12.send :to_s => "12" Não bastando todo este flexibilidade, podemos definir construir as chamadas de métodos dinamicamente, podemos utilizar o método especial method_missing. Este método vai intercepta chamadas de métodos que não existem, possibilitando adicionar funcionalidades de acordo com as necessidades. >>> class Person >>> def method_missing(method, *args) >>> message = method.to_s.split("_")
  • 7. >>> puts message.last if message.first == "say" >>> end >>> end >>> person = Person.new >>> person.say_hello => hello >>> person.say_world => world Resultados Com a pesquisa realizada foi possível obter experiencia em técnicas de Metaprogramação através da exploração das linguagens Python e Ruby, capacitando os leitores há aplicar os estudos levantados por este trabalho em seus projetos, independente de seus tamanhos. Outra vantagem obtida foi mostrar a importância da Metaprogramação no desenvolvimento de software, pois seu conhecimento é de grande importância para a utilização de frameworks como Ruby e Django. Também foi constatado que a Metaprogramação deve ser usada com moderação e sabedoria, apesar de uma técnica poderosa, o codigo criado pode se tornar difícil de ler, entender e manter. Finalmente, foi possível definir o conceito de Metaprogramação de forma clara, habilitando leitores a aplicá-los em outras linguagens além de Python e Ruby . Considerações Finais Com o estudo realizado, foi constatada a aplicabilidade da Metaprogramação no desenvolvimento de software para obter reusabilidade, escalabilidade e atender a complexidade exigida das aplicações atuais. Fontes Consultadas THOMAS, Dave; HANSSON, David Heinemeier; BREEDT, Leon. Desenvolvimento Web ágil com Rails. 2. ed. Porto Alegre: Bookman, 2008.
  • 8. URUBATAN, Rodrigo. Desenvolvimento Fácil e Rápido de Aplicações Web. 2. ed. São Paulo: Novatec, 2012. THOMAS, Date; FOWLER, Chad; HUNT, Andy. Programming Ruby 1.9: The Pragmatic Programmers Guide. Dallas: The Pragmatic Programmes, 2010. LUTZ, Mark; ASCHER, David. Aprendento Python: Programação orientada a objetos. 2. ed. Porto Alegre: O'reilly, 2007. BORGES, Luiz Eduardo. Python para Desenvolvedores. 2. ed. Rio de Janeiro: Edição do Autor, 2010.