Classes, escopos e convenções em Ruby

Neste post vamos explorar um pouco de Orientação a Objetos no mundo Ruby e também veremos exemplos simples de como funciona a metaprogramação.

Classes e Escopos

Para falar sobre classes vamos mostrar um exemplo de uma classe, para que então possamos comentar sobre escopos e outros aspectos. Veja o seguinte código, que mostra a sintaxe para criar uma classe:

class Carro
  #Código da classe carro
end

#Instanciando um Carro
carro = Carro.new

Vamos então ver como funciona o escopo no ruby. Basicamente existem os seguintes escopos:

  • Variáveis globais, definidas por um ‘$’ no começo;
  • Variáveis de instância, definidas por um ‘@’ no começo;
  • Variáveis locais, que são nomes simples, ou então começam ‘_’;
  • Variáveis de classe, que possuem ‘@@’ no inicio e;
  • Constantes, que são nomeadas em maiúsculo.
  • A OO do ruby é diferente, por exemplo, do Java. Em Java precisamos definir uma classe “principal” que possui o método estático main para que o código seja executado a partir dali. Em ruby, existe uma grande classe que incorpora todo o código. Ou seja, todo código que você escreve está dentro desta classe.

    Quer uma prova? execute o seguinte código, (basta utilizar o console do ruby chamando irb do terminal)

    1.9.3p125 :001 > self.class
     => Object
    

    “self” no ruby é semelhante ao this do C++ ou Java. Ou seja, abrimos o console, e na primeira linha já executamos “self.class”, mesmo sem ter definido nada. E a saída é Object, o que mostra que o código ruby está dentro de uma classe, que por sua vez é do tipo Object.

    Vamos verificar então os escopos das variáveis que discutimos ali em cima, para isto vamos utilizar o método “defined?”, definido na grande classe que engloba códigos ruby:

    1.9.3p125 :001 > x = "local"
     => "local" 
    1.9.3p125 :002 > defined? x
     => "local-variable" 
    

    Como pode ser visto, criar uma variável simplesmente com um nome dá a ela um escopo local. Vamos então ver os outros tipos de escopos:

    1.9.3p125 :003 > $x = "global"
     => "global" 
    1.9.3p125 :004 > defined? $x
     => "global-variable" 
    1.9.3p125 :005 > @x = "instancia"
     => "instancia" 
    1.9.3p125 :006 > defined? @x
     => "instance-variable" 
    1.9.3p125 :007 > X = "constante"
     => "constante" 
    1.9.3p125 :008 > defined? X
     => "constant" 
    1.9.3p125 :009 > @@x = "classe"
     => "classe" 
    1.9.3p125 :010 > defined? @@x
     => "class variable"
    

    Classes e Convenções

    Simples não? Essa é um característica muito forte do ruby, conhecida como convention over configuration. Ao invés de utilizar várias palavras chave para definir características, basta apenas que você siga a convenção e tudo funcionará bem.

    Sobre convenções vale comentar que classes seguem a convenção CammelCase, semelhante ao Java. Os método seguem a convenção snake_case, onde todas as letras são minúsculas e separadas por ‘_’. Existe um motivo pra isso, então siga a convenção sempre que possível.

    Outro ponto importante sobre convenções do Ruby é o conhecido Poetry mode. Em ruby, as chamadas de métodos nem sempre precisam de pontos ou parênteses, isso é feito para facilitar a leitura do código, apesar de parecer estranho quando se lê da primeira vez. Veja o exemplo:

    #Poetry mode [OFF]
    pessoa.cabelo().cortar("curto")
    #Poetry mode [ON]
    pessoa.cabelo.cortar "curto"
    

    Pode parecer besteira, mas facilita bastante ler o código, veja esse exemplo, onde é feito um redirecionamento de paǵina caso o usuário não esteja logado:

    #Poetry mode [OFF]
    (redirect_to(login_page)) and return() unless logged_in?
    #Poetry mode [ON]
    redirect_to login_page and return unless logged_in?
    

    Outro ponto que vale comentar é na hora de definir métodos, voltemos para a classe Carro, vamos agora adicionar alguns métodos nela:

    class Carro
      def cor_do_carro
        "Prata"
      end
    end
    

    Quando um método não possui parâmetros, não é necessário adicionar os parênteses, na verdade não é preciso colocar nenhum parêntese, mesmo que o método receba parâmetros.

    class Carro
      def fala frase
        puts frase
      end
    end
    

    Outro ponto que vale notar é no método cor_do_carro, veja que ele não possui a palavra chave “return”, pois o interpretador ruby considera que a última linha deve ser o retorno do método, mais um vez convention over configuration para facilitar a leitura do código.

    Por enquanto é isso, espero que agora esteja mais fácil para você entender códigos em ruby, nos próximos posts vamos ver um pouco sobre Reflexão e Metaprogramação em Ruby. Se gostou do post compartilhe com seus amigos e colegas, senão, comente o que pode ser melhorado. Encontrou algum erro no código? Comente também. Possui alguma outra opinião ou alguma informação adicional? Comenta ai! 😀

    Anúncios

    Deixe um comentário

    Preencha os seus dados abaixo ou clique em um ícone para log in:

    Logotipo do WordPress.com

    Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

    Imagem do Twitter

    Você está comentando utilizando sua conta Twitter. Sair / Alterar )

    Foto do Facebook

    Você está comentando utilizando sua conta Facebook. Sair / Alterar )

    Foto do Google+

    Você está comentando utilizando sua conta Google+. Sair / Alterar )

    Conectando a %s