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.

Metaprogramming - Hooks


Hoje falaremos sobre:

  • Included
  • Extended
  • Inherited

Aula Prática

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}
      
    
Conclusão

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.




Próximas Aulas


Metaprogramming - Missings

Nesta aula iremos aprender a utilizar os comandos const_missing e method_missing, com isso iremos cr...

Instalando Rails

Nesta aula iremos aprender a instalar e configurar o Rails que é um dos frameworks mais utilizados p...

Rails Generators

Nesta aula iremos aprender um pouco sobre os generators do Rails, utilizaremos o, scaffold, models e...

Rails - Routes

Nessa aula iremos iniciar uma aplicação web do zero, agora passo a passo. Iremos ver algumas rotas u...

Rails - Partials

Nesta aula iremos aprender como dividir o conteúdo de nossos templates html em partials, evitando as...

Rails - Migrations

Nesta aula iremos aprender a diferença de fazer um modelo de forma manual e a agilidade que teremos ...

Rails - Forms

Nesta aula iremos aprender como fazer um CRUD de forma manual no Rails....

Rails - initializers

Nesta aula iremos aprender como configurar dados na inicialização de uma aplicação Rails....



Danilo

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.

ELEVE SEUS GANHOS E POTENCIALIZE SUA PERFORMANCE

Receba nossa Ebook de LÓGICA DE PROGRAMAÇÃO

© Didox Business & Technology - CNPJ: 12.127.195/0001-14