META
PROGRAM
AÇÃO
RUBY
Marcos Brizeno
Cientista da Computação
Consultor ThoughtWorks
Cearense!
@marcosbrizeno
brizeno.wordpress.com
Avisos
Conteúdo não indicado
para menores de 18 anos
Exemplos de código não
foram testados
Metaprogramação Ruby
<jabá>
</jabá>
ü Discutir o que é
metaprogramação
ü Diferenciar reflexão e
metaprogramação
ü Como a
metaprogramação pode
nos ajudar
ü Como a
metaprogramação pode
nos atrapalhar
ü Se divertir :D
⊠ Ruby
⊠ Orientação a Objetos
O que é
Metaprogramação?
WAT???
§ Código que escreve código
§ Programa que escreve
programas
§ Altera código em tempo
de execução
§ Alterar o comportamento
do programa com o
programa
§ Lógica escondidada
dentro de si mesma
Metaprogramação Ruby
Reflexão
§ Inspecionar o
próprio objeto
§ respond_to?
§ methods
§ class_variable
_get/set
Metaprogramação
§ Programa que
escreve programa
§ define_method
§ method_missing
§ class_eval
O que é
Metaprogramação?
WAT???
Metaprogramação
§ Código genérico
§ Remove
duplicações
§ É muito foda =)
Metaprogramação
§ Código difícil de ler
§ Complexo
§ É muito foda =(
Exemplo Simples:
§ Ruby accessors:
§ attr_accessor
§ attr_reader
§ attr_writer
class AttrExamples
attr_accessor :accessor
attr_reader :reader
attr_writer :writer
end
class AttrExamples
attr_accessor :accessor
attr_reader :reader
attr_writer :writer
end
Modificadores de
visibiliade/acesso
class AttrExamples
attr_accessor :accessor
attr_reader :reader
attr_writer :writer
end
Modificadores de
visibiliade/acesso
Attributos da
classe/instancias
class AttrExamples
attr_accessor :accessor
attr_reader :reader
attr_writer :writer
end
Modificadores de
visibiliade/acesso
Attributos da
classe/instancias
class AttrExamples
attr_accessor :accessor
attr_reader :reader
attr_writer :writer
end
Modificadores de
visibiliade/acesso
Attributos da
classe/instancias
Rails Models
class Product < ActiveRecord::Base
end
Rails Models
class Product < ActiveRecord::Base
end
Cadê os
atributos?
Cadê o
construtor?
Metaprogramação Ruby
Métodos que definem
métodos
§ Definidos na class Module
Exemplo: attr_accessor
@attr = nil
def attr()
@attr
end
def attr=(attr)
@attr = attr
end
Exemplo: attr_accessor
@attr = nil
def attr()
@attr
end
def attr=(attr)
@attr = attr
end
Método para
ler o valor
Método para
escrever um
valor
Como o ruby sabe qual o nome da
minha variável?
Vamos pensar um pouco…
#define_method
symbol é o nome
do método que vaiser criado
block é o que essenovo método vai fazer
#define_method
def create_method(name, &block)
self.class.send(:define_method,
name, block)
end Podemos criar qualquer métodoem qualquer lugar em qualquermomento!
Metaprogramação Ruby
Metaprogramação Ruby
Ruby tem classes “abertas”
§ Podemos adicionar ou
sobrescrever métodos em
uma classe em qualquer
momento
§ Podemos adicionar ou
sobrescrever métodos em
uma instância em
qualquer momento
Classes ou
Instâncias???
Metaprogramação Ruby
Nota sobre mapa do objeto
Classes são Objetos
§ CONSTANTES são escritas
com letras maiúsculas
§ Uma classe é só uma
Constante apontando para
um objeto do tipo Class
Exemplo real
#showmethecode
Um exemplo mais “interessante”
Um sistema de
vendas de revistas
Eventos:
•  Nova venda
•  Nova promoção
•  Revista em falta
Interessados:
•  Clientes (email)
•  Gerentes (ActiveMQ)
•  Outros apps (WS)
Fontes:
•  Controllers
•  Workers
•  Models
Resolvendo com programação
Controller
Model
Worker
Notifier
-sell()
notify_client
notify_manager
notify_app1
-out_of_stock()
EmailHandler
ActiveMQHandler
RestHandler
Resolvendo com programação
Controller
Model
Worker
Notifier
-sell()
notify_client
notify_manager
notify_app1
-out_of_stock()
EmailHandler
ActiveMQHandler
RestHandler
Notifier tem muitas
responsabilidades
Notifier quebra
muito fácil
Notifier está
sobrecarregado
Resolvendo com programação
Controller
Model
Worker
Notifier
-sell()
ClientNotifier.notify_sell()
ManagerNotifier.notify_sell()
App1Notifier.notify_sell()
-out_of_stock()
EmailHandler
ActiveMQHandler
RestHandler
ClientNotifier
ManagerNotifier
App1Notifier
Resolvendo com programação
Controller
Model
Worker
Notifier
-sell()
ClientNotifier.notify_sell()
ManagerNotifier.notify_sell()
App1Notifier.notify_sell()
-out_of_stock()
EmailHandler
ActiveMQHandler
RestHandler
ClientNotifier
ManagerNotifier
App1Notifier
Classes
especializadas
Ainda existe código
duplicado
Melhorando com metaprogramação
Controller
Model
Worker
Notifier
EVENTOS = [:sell, …]
NOTIFIERS = [ClientNotifier, …]
EmailHandler
ActiveMQHandler
RestHandler
ClientNotifier
ManagerNotifier
App1Notifier
Podemos varrer a lista de
notifiers e eventos para chamar
as devidas notificações
Melhorando com metaprogramação
Analisando a solução
§ Define vários
métodos em tempo
de execução
§ Código genérico
§ Remove
duplicações
§ É muito foda =)
Analisando a solução
§ O método nunca
ser utilizado
§ Código difícil de ler
§ Complexo
§ É muito foda =(
#method_missing
se o ruby não sabe
o que fazer ele chamao method_missing
Outra solução com metaprogramação
#method_missing
§ Executado quando um
método não é encontrado
§ Última tentativa antes de
lançar NoMethodError
§ Só é executado após
percorrer todo o mapa do
objeto
Ruby method lookup
Procura no
objeto
Ruby method lookup
Procura no
objeto
 Procura na
classe
Ruby method lookup
Procura no
objeto
 Procura na
classe
Procura nas
superclasses
Ruby method lookup
Procura no
objeto
 Procura na
classe
Procura nas
superclasses
Procura nosmódulos
Ruby method lookup
Procura no
objeto
 Procura na
classe
Procura nas
superclasses
Procura nosmódulos
Procura na
classe da
classe
Analisando a solução
§ Só executa quando
o método é
chamado
§ Código genérico
§ Remove
duplicações
§ É muito foda =)
Analisando a solução
§ Percorre todo o
mapa de objetos
§ Código difícil de ler
§ Complexo
§ É muito foda =(
Outra solução com metaprogramação
Analisando a solução
§ Só executa quando o
método é chamado
§ Cria o método pra
evitar outra busca
§ Código genérico
§ Remove duplicações
§ É muito foda =)
Analisando a solução
§ Código difícil de ler
§ Complexo
§ É muito foda =(
Outra possível solução
§ class_eval / instance_eval
§ String -> Código
“def #{event}” +
“ #chama notifiers” +
“end”
§ PERIGO!!!
Metaprogramação Ruby
Aprecie com moderação
§ Lógica de negócio NÃO
DEVE ser metaprogramada
§ Muita mágica aumenta o
tempo de aprendizado de
novos devs
§ Debugar o código fica difícil
§ Modificações em uma única
parte são difíceis
Quais os próximos passos
§ Entender Modelo de Objetos do Ruby
§ Singleton class/Eigenclass
§ Lambdas e Procs
§ Soluções alternativas para
metaprogramação
Metaprogramação Ruby
OBRIGADO!
@marcosbrizeno
Geek Night Recife

Mais conteúdo relacionado

ODP
Aula02 - JavaScript
PDF
Pensando Lean
PDF
Javascript aula 01 - visão geral
ODP
Aula05-JavaScript
ODP
Aula06 - JavaScript
PDF
Curso javascript básico
PDF
Test-Driven Development with PHP
PDF
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Aula02 - JavaScript
Pensando Lean
Javascript aula 01 - visão geral
Aula05-JavaScript
Aula06 - JavaScript
Curso javascript básico
Test-Driven Development with PHP
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014

Semelhante a Metaprogramação Ruby (20)

KEY
Design Patterns on Rails
PPT
FC-Logic
PDF
Construindo um micro-serviço Java 100% funcional em 15 minutos
PPTX
Utilização de Mock Objects em Testes Unitários
PDF
Paradigmas de Programação - Imperativo, Orientado a Objetos e Funcional
PPTX
Programando php com excelência
PPTX
Refactoring
PDF
Macro br
PDF
Qualidade de software com Visual Studio ALM
PDF
Aplicações Profissionais para Internet com Zend Framework
PPT
Aplicando eXtreming Programing ao cenário do Borland ALM - BorCon 2003
PDF
Profissao-programador-praticas-para-melhoria-continua-unimonte-outubro-2013
PDF
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
PDF
Carreira de desenvolvedor
PPT
Scrum e o Ambiente de Desenvolvimento Ágil
PDF
Asp.Net Mvc Dev Days09 V3 Pt
PDF
CakePHP - Aprendendo a fazer o primeiro bolo
PPTX
Menos teste e mais qualidade - como equilibrar essa equação?
PPTX
Clean code @rogeriofontes-techfriday-everis
PPTX
Introdução ao desenvolvimento front end usando bootstrap e angular js
Design Patterns on Rails
FC-Logic
Construindo um micro-serviço Java 100% funcional em 15 minutos
Utilização de Mock Objects em Testes Unitários
Paradigmas de Programação - Imperativo, Orientado a Objetos e Funcional
Programando php com excelência
Refactoring
Macro br
Qualidade de software com Visual Studio ALM
Aplicações Profissionais para Internet com Zend Framework
Aplicando eXtreming Programing ao cenário do Borland ALM - BorCon 2003
Profissao-programador-praticas-para-melhoria-continua-unimonte-outubro-2013
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Carreira de desenvolvedor
Scrum e o Ambiente de Desenvolvimento Ágil
Asp.Net Mvc Dev Days09 V3 Pt
CakePHP - Aprendendo a fazer o primeiro bolo
Menos teste e mais qualidade - como equilibrar essa equação?
Clean code @rogeriofontes-techfriday-everis
Introdução ao desenvolvimento front end usando bootstrap e angular js
Anúncio

Mais de Marcos Brizeno (18)

PDF
Refatorando tudo! [Agile brazil 2017]
PDF
GraphQL ou APIs RESTful - DevDay 2017
PDF
Developer Experience como diferencial na Transformação Digital
PDF
Desventuras em série adotando microserviços
PDF
Aprenda Elixir em um final de semana
PDF
5 mitos sobre código bom
PDF
Padrões de projeto superestimados
PDF
Abraçando a mudança com Código
PDF
Práticas Ágeis Distribuidas
PDF
The fine art of slacking
PDF
Aplicando padrões de projeto em Ruby
PDF
Comunidade e Carreira: Você Ganha Todos Ganham
PDF
Dubles de teste
PDF
Entrega Contínua - E Eu Com Isso?
PDF
The fine art of slacking
PDF
Programar #COMOFAS ? - Rails Girls Fortaleza
ODP
Arquitetura Ágil
ODP
Clean code
Refatorando tudo! [Agile brazil 2017]
GraphQL ou APIs RESTful - DevDay 2017
Developer Experience como diferencial na Transformação Digital
Desventuras em série adotando microserviços
Aprenda Elixir em um final de semana
5 mitos sobre código bom
Padrões de projeto superestimados
Abraçando a mudança com Código
Práticas Ágeis Distribuidas
The fine art of slacking
Aplicando padrões de projeto em Ruby
Comunidade e Carreira: Você Ganha Todos Ganham
Dubles de teste
Entrega Contínua - E Eu Com Isso?
The fine art of slacking
Programar #COMOFAS ? - Rails Girls Fortaleza
Arquitetura Ágil
Clean code
Anúncio

Último (20)

PPTX
Treinamento de Espaço Confinado_Trabalhadores e Vigias NR 33.pptx
PPTX
NR 5 Treinamento completo gestão CIPA.pptx
PPT
Domínios Morfoclimáticos.................................
PDF
Atividades sobre o livro Letras de Carvão
PDF
HORÁRIO GERAL SIGAA 2025_PRÉVIA_SIGAA-1.pdf
PPT
1ª Telefonia Fixa Padrao Novo Jailton 2012_22.ppt
PDF
DECISÃO (2).pdf Derrota histórica do Sintero expõe racha interno e fragilidad...
PDF
ENTREVISTA-PROCESSO-SELETIVO-idc8j5.pdf 1
PDF
morfologia5.pdfllllllllllllllllllllllllllll
PPTX
SEGURANÇA, MEIO AMBIENTE E SAÚDE Aula 1.pptx
PDF
DESCCARTE DE MATERIAIS BIOLOGICO ESTUDO DA ODONTOLOGIA
PPTX
Concordância Nominal e Verbal e atividade
PPTX
4. A cultura do cinema e as vanguardas.pptx
PPTX
Adaptação Curricular para Alunos com Deficiências - EMEB. ODIR (1).pptx
PPTX
DOUTRINA FORÇA TÁTICA PMRO 2022 - PPT (1).pptx
PPTX
1. A Cultura do Palco - muitos palcos, um espetáculo.pptx
PPTX
Slides Lição 8, Betel, Jesus e a Mulher Adúltera, 3Tr25.pptx
PDF
Urbanização no Brasil LEVANDO EM CONTA CONCEITOS
PPSX
2. A Cultura do Senado - HistóriaCArtes.ppsx
PPTX
São João Eudes, 1601 – 1680, padre e fondador, Francés.pptx
Treinamento de Espaço Confinado_Trabalhadores e Vigias NR 33.pptx
NR 5 Treinamento completo gestão CIPA.pptx
Domínios Morfoclimáticos.................................
Atividades sobre o livro Letras de Carvão
HORÁRIO GERAL SIGAA 2025_PRÉVIA_SIGAA-1.pdf
1ª Telefonia Fixa Padrao Novo Jailton 2012_22.ppt
DECISÃO (2).pdf Derrota histórica do Sintero expõe racha interno e fragilidad...
ENTREVISTA-PROCESSO-SELETIVO-idc8j5.pdf 1
morfologia5.pdfllllllllllllllllllllllllllll
SEGURANÇA, MEIO AMBIENTE E SAÚDE Aula 1.pptx
DESCCARTE DE MATERIAIS BIOLOGICO ESTUDO DA ODONTOLOGIA
Concordância Nominal e Verbal e atividade
4. A cultura do cinema e as vanguardas.pptx
Adaptação Curricular para Alunos com Deficiências - EMEB. ODIR (1).pptx
DOUTRINA FORÇA TÁTICA PMRO 2022 - PPT (1).pptx
1. A Cultura do Palco - muitos palcos, um espetáculo.pptx
Slides Lição 8, Betel, Jesus e a Mulher Adúltera, 3Tr25.pptx
Urbanização no Brasil LEVANDO EM CONTA CONCEITOS
2. A Cultura do Senado - HistóriaCArtes.ppsx
São João Eudes, 1601 – 1680, padre e fondador, Francés.pptx

Metaprogramação Ruby