terça-feira, 2 de abril de 2013

Exercitando com Ruby Parte 6 (Classes, Modulos)

Classes
Para iniciar uma classe usamos a expressão class em seguida o nome da classe, finalizada com end. Seguindo os padrões de desenvolvimento para classes em Ruby, é aconselhado trabalhar com o nome das classes, com a técnica CamelCase (as iniciais em maiúsculo todas juntas, sem espaços), EX: MinhaClasse; e para o nome dos métodos use caixa baixa e separe-as com sublinhado "_", EX: nome_metodo.
  1. Exemplo de uma simples classe com construtor denominado initialize. Para instanciar a classe use o operador new juntamente com o nome da classe.  Note que usei um Symbol, se você chegou até aqui, sabe para que serve ;):
  2. class Ola
       def initialize()
        puts :oi
       end
    end
    
    Ola.new
    =>oi
  3. Criando e chamando um método:
  4. class Ola
       def fale_algo(diga)
          puts diga
       end
    end
    a = Ola.new
    a.fale_algo('Barbaridade')
    =>Barbaridade
  5. Uma classe mais completa simulando leitura e escrita de atributos. Existem três tipos controle de acesso, attr_reader (somente leitura), attr_write (somente escrita), attr_accessor (leitura e escrita):
  6. 
    class Pessoa
     attr_reader :nome,:fone
     attr_writer :fone
     attr_accessor :email
    
     def initialize(nome,fone,email)
      @nome  = nome
      @fone  = fone
      @email = email
     end 
     
    end
    pes = Pessoa.new('Darlan Dieterich','7777-7777','d@d.com')
    pes.fone = '0000-0000'
    p pes.nome
    p pes.fone
    p pes.email
    =>Darlan Dieterich
    =>0000-0000
    =>d@d.com
    
  7. Mudando estrutura da classe sem alterar a original. Note que é usado Struct para redefinir a estrutura da classe:
  8. class Pessoa
     attr_reader   :nome,:fone
     attr_writer   :fone
     attr_accessor :email
    
     def initialize(nome,fone,email)
      @nome  = nome
      @fone  = fone
      @email = email
     end 
    end
    Pessoa = Struct.new(:nome,:email,:fone)
    pes = Pessoa.new('dieterich',77777777,'d@d.com')
    p pes
    =><struct Pessoa nome="dieterich", email=77777777, fone="d@d.com">
  9. Variaveis da classe. Em Ruby as variaveis da classe são definidas com @@ (dois arroba) juntamento com nome da classe, e também precisam ser inicializadas antes de seu uso:
  10. class Pessoa
     attr_reader   :nome,:fone
     attr_writer   :fone
     attr_accessor :email
     @@contador = 0
    
     def initialize(nome,fone,email)
      @nome  = nome
      @fone  = fone
      @email = email
      @@contador += 1
     end 
     def instancias
      @@contador
     end
    end
    pes1 = Pessoa.new('Laura',77777777,'l@l.com')
    pes2 = Pessoa.new('Darlan',77777777,'d@d.com')
    pes3 = Pessoa.new('Jenifer',77777777,'j@j.com')
    puts pes3.instancias
    =>3
  11. Herança. Trabalha de forma hierárquica  com objetivo de herdar as propriedades da classe antecessora, é usado '<' para definir a classe que sera herdada:
  12. class Pessoa
     attr_reader   :nome,:fone
     attr_writer   :fone
     attr_accessor :email 
    
     def initialize(nome,fone,email)
      @nome  = nome
      @fone  = fone
      @email = email  
     end
    end
    
    class Fisica < Pessoa
     def sou
      "pessoa fisica"
     end
    end
    
    f = Fisica.new('Darlan',987654321,'d@d.com')
    puts f.nome
    puts f.sou
    =>"Darlan"
    =>"pessoa fisica"
  13. Controle de acesso. Em Ruby public (público), protected (protegido), e private (privado), se aplicam somente a métodos. O public pode ser chamado a qualquer momento e lugar, o protected é usado na mesma ou na sua subclasse (acesso hierárquico), já o private somente pode ser chamado no objeto atual:
  14. class Pai  
     def publico
      puts 'sou o metodo publico'
     end 
     def protegido
      puts 'sou o metodo protegido'
     end  
     def privado
      puts 'sou o metodo privado'
     end
    
     public    :publico
     protected :protegido
     private   :privado
    end
    
    class Filho < Pai
     def diga
      puts protegido
     end
    end
    
    a = Filho.new
    a.publico
    a.diga
    a.privado
    =>sou o metodo publico
    =>sou o metodo protegido
    =>private method `privado' called for #<Filho:0x26adf98>
Módulos
Módulos não são Classes, porém com funcionalidades semelhantes. Por exemplo, Modulo não possui instâncias e subclasses. Um módulo é iniciado com bloco module e finalizado com end. Os módulos são divididos em dois tipos, métodos de módulo e métodos de instância.
  1. Método de módulo. Não precisa ser incluído em outro objeto. Note que usei o comando self, ele é usado para fazer referência ao receiver atual.:
  2. module Soma 
     def self.calcula(val1,val2)
      val1+val2
     end
    end
    
    puts Soma.calcula(16,50)
    =>66
    
  3. Método de instância. É usada na instância de um objeto:
  4. module Soma 
     def self.calcula(val1,val2)
      val1+val2
     end
    end
    
    class Calculadora
     def self.soma(val1,val2)
      Soma.calcula(val1,val2)
     end
    end 
    
    p x = Calculadora.soma(1,4)
    =>5
Autor: Darlan Dieterich

Nenhum comentário:

Postar um comentário

Deixe aqui seu comentário