Successfully reported this slideshow.
Your SlideShare is downloading. ×

Metaprogramação Ruby

Ad

META
PROGRAM
AÇÃO
RUBY
Marcos Brizeno

Ad

Cientista da Computação
Consultor ThoughtWorks
Cearense!
@marcosbrizeno
brizeno.wordpress.com

Ad

Avisos

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Upcoming SlideShare
Aula02 - JavaScript
Aula02 - JavaScript
Loading in …3
×

Check these out next

1 of 67 Ad
1 of 67 Ad
Advertisement

More Related Content

Advertisement

Metaprogramação Ruby

  1. 1. META PROGRAM AÇÃO RUBY Marcos Brizeno
  2. 2. Cientista da Computação Consultor ThoughtWorks Cearense! @marcosbrizeno brizeno.wordpress.com
  3. 3. Avisos
  4. 4. Conteúdo não indicado para menores de 18 anos
  5. 5. Exemplos de código não foram testados
  6. 6. <jabá> </jabá>
  7. 7. ü 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
  8. 8. ⊠ Ruby ⊠ Orientação a Objetos
  9. 9. O que é Metaprogramação? WAT???
  10. 10. § 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
  11. 11. 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
  12. 12. O que é Metaprogramação? WAT???
  13. 13. Metaprogramação § Código genérico § Remove duplicações § É muito foda =)
  14. 14. Metaprogramação § Código difícil de ler § Complexo § É muito foda =(
  15. 15. Exemplo Simples: § Ruby accessors: § attr_accessor § attr_reader § attr_writer
  16. 16. class AttrExamples attr_accessor :accessor attr_reader :reader attr_writer :writer end
  17. 17. class AttrExamples attr_accessor :accessor attr_reader :reader attr_writer :writer end Modificadores de visibiliade/acesso
  18. 18. class AttrExamples attr_accessor :accessor attr_reader :reader attr_writer :writer end Modificadores de visibiliade/acesso Attributos da classe/instancias
  19. 19. class AttrExamples attr_accessor :accessor attr_reader :reader attr_writer :writer end Modificadores de visibiliade/acesso Attributos da classe/instancias
  20. 20. class AttrExamples attr_accessor :accessor attr_reader :reader attr_writer :writer end Modificadores de visibiliade/acesso Attributos da classe/instancias
  21. 21. Rails Models class Product < ActiveRecord::Base end
  22. 22. Rails Models class Product < ActiveRecord::Base end Cadê os atributos? Cadê o construtor?
  23. 23. Métodos que definem métodos § Definidos na class Module
  24. 24. Exemplo: attr_accessor @attr = nil def attr() @attr end def attr=(attr) @attr = attr end
  25. 25. 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
  26. 26. Como o ruby sabe qual o nome da minha variável? Vamos pensar um pouco…
  27. 27. #define_method symbol é o nome do método que vaiser criado block é o que essenovo método vai fazer
  28. 28. #define_method def create_method(name, &block) self.class.send(:define_method, name, block) end Podemos criar qualquer métodoem qualquer lugar em qualquermomento!
  29. 29. 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
  30. 30. Classes ou Instâncias???
  31. 31. Nota sobre mapa do objeto
  32. 32. Classes são Objetos § CONSTANTES são escritas com letras maiúsculas § Uma classe é só uma Constante apontando para um objeto do tipo Class
  33. 33. Exemplo real #showmethecode
  34. 34. 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
  35. 35. Resolvendo com programação Controller Model Worker Notifier -sell() notify_client notify_manager notify_app1 -out_of_stock() EmailHandler ActiveMQHandler RestHandler
  36. 36. 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
  37. 37. 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
  38. 38. 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
  39. 39. 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
  40. 40. Melhorando com metaprogramação
  41. 41. Analisando a solução § Define vários métodos em tempo de execução § Código genérico § Remove duplicações § É muito foda =)
  42. 42. Analisando a solução § O método nunca ser utilizado § Código difícil de ler § Complexo § É muito foda =(
  43. 43. #method_missing se o ruby não sabe o que fazer ele chamao method_missing
  44. 44. Outra solução com metaprogramação
  45. 45. #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
  46. 46. Ruby method lookup Procura no objeto
  47. 47. Ruby method lookup Procura no objeto Procura na classe
  48. 48. Ruby method lookup Procura no objeto Procura na classe Procura nas superclasses
  49. 49. Ruby method lookup Procura no objeto Procura na classe Procura nas superclasses Procura nosmódulos
  50. 50. Ruby method lookup Procura no objeto Procura na classe Procura nas superclasses Procura nosmódulos Procura na classe da classe
  51. 51. Analisando a solução § Só executa quando o método é chamado § Código genérico § Remove duplicações § É muito foda =)
  52. 52. Analisando a solução § Percorre todo o mapa de objetos § Código difícil de ler § Complexo § É muito foda =(
  53. 53. Outra solução com metaprogramação
  54. 54. 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 =)
  55. 55. Analisando a solução § Código difícil de ler § Complexo § É muito foda =(
  56. 56. Outra possível solução § class_eval / instance_eval § String -> Código “def #{event}” + “ #chama notifiers” + “end” § PERIGO!!!
  57. 57. 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
  58. 58. Quais os próximos passos § Entender Modelo de Objetos do Ruby § Singleton class/Eigenclass § Lambdas e Procs § Soluções alternativas para metaprogramação
  59. 59. OBRIGADO! @marcosbrizeno Geek Night Recife

×