Nesta aula iremos aprender os conceitos de hooks, veremos como utilizar 3 tipos de hooks (web hook, app hook, sql hook) e iremos ver como implementar ele utilizando meta programação.
Hoje falaremos sobre:
Sobre o included
temos um método de classe que é chamado(dispara um Hook) sempre que incluímos
um
método numa
classe.
Execute o código abaixo e veremos duas chamadas de included
require 'byebug'
module UmModulo
def self.included(klass)
puts "Modulo #{self} incluido em #{klass}"
end
def self.extended(klass)
puts "Modulo #{self} extendido em #{klass}"
end
def instancia
"metodo de instancia"
end
def self.de_classe
"metodo de classe"
end
end
class Teste
include UmModulo
end
class Teste2
include UmModulo
end
Para o extended
temos um comportamento parecido com o included
, mas agora no caso
de estendermos nosso módulo.
require 'byebug'
module UmModulo
def self.included(klass)
puts "Modulo #{self} incluido em #{klass}"
end
def self.extended(klass)
puts "Modulo #{self} extendido em #{klass}"
end
def instancia
"metodo de instancia"
end
def self.de_classe
"metodo de classe"
end
end
class Teste
include UmModulo
end
class Teste2
extend UmModulo
end
Agora nosso Hood self.extended
será chamado.
Vimos acima os Hooks para módulos agora veremos como ele funciona com classes
Agora veremos o inherited
, assim que for herdado um Hook será disparado.
require 'byebug'
class Pai
def self.inherited(klass)
puts "A classe #{klass} herda de #{self}"
end
end
class Filho < Pai
end
class Danilo < Pai
end
class Lana < Pai
end
puts Filho.new
No programa abaixo temos 4 exemplos de herança, .
require 'byebug'
class Pai
def self.inherited(klass)
puts "A classe #{klass} herda de #{self}"
# se não existir atribuí um array vazio
@classes ||= []
# incluí dados de klass
@classes << klass
end
def self.lista_de_classes
@classes
end
end
class Filho < Pai
def mostre_o_nome
"Leandro"
end
end
class Filho2 < Pai
def mostre_o_nome
"Gustavo"
end
end
class Filho3 < Pai
def mostre_o_nome
"Jose"
end
end
class Filho4 < Pai
def mostre_o_nome
"Fabiana"
end
end
debugger
Pai.lista_de_classes.map{|f| f.new.mostre_o_nome}
puts Pai.lista_de_classes
Arquivo final:
# hooks (ganchos)
# require 'byebug'
# module UmModulo
# def self.included(klass)
# puts "Modulo #{self} incluido em #{klass}"
# end
# def self.extended(klass)
# puts "Modulo #{self} extendido em #{klass}"
# end
# def instancia
# "metodo de instancia"
# end
# def self.de_classe
# "metodo de classe"
# end
# end
# class Teste
# include UmModulo
# end
# class Teste2
# extend UmModulo
# end
# class Teste3
# extend UmModulo
# end
# debugger
# class Teste
# extend UmModulo
# end
# puts Teste.new
############ inherited (Herdado) ##############
# class Pai
# def self.inherited(klass)
# puts "A classe #{klass} herda de #{self}"
# end
# end
# class Filho < Pai
# end
# class Danilo < Pai
# end
# class Lana < Pai
# end
# puts Filho.new
############ inherited (Herdado) ##############
class Pai
def self.inherited(klass)
puts "A classe #{klass} herda de #{self}"
@classes ||= []
@classes << klass
end
def self.lista_de_classes
@classes
end
end
class Filho < Pai
def mostre_o_nome
"Leandro"
end
end
class Filho2 < Pai
def mostre_o_nome
"Gustavo"
end
end
class Filho3 < Pai
def mostre_o_nome
"Jose"
end
end
class Filho4 < Pai
def mostre_o_nome
"Fabiana"
end
end
debugger
Pai.lista_de_classes.map{|f| f.new.mostre_o_nome}
puts Pai.lista_de_classes
Código para ser executado em debug que traz os nomes dos filhos como um array.
Pai.lista_de_classes.map{|f| f.new.mostre_o_nome}
Com esses métodos adquirimos mais habilidades com metaprogramação executando códigos em momentos específicos do nosso programa, quando herdarmos, incluirmos ou/e estendermos.
Arquiteto de software, analista, programador, professor. Danilo criou o projeto torne-se um programador, para passar o seu conhecimento para a nova geração. Com o intuito de ser um bom pai, Danilo trabalha muito motivado para garantir o futuro de sua filha.