Contexto

A linguagem Ruby tem padrões e boas práticas bastante interessantes. Uma padrão que acho bem legal é o retorno dos método escritos em Ruby. Perceba que todo os métodos do core do Ruby tem os seguintes retornos.

  1. Retorna o valor ou nil.
    • Para métodos que retornam o valor, quando esse valor não é retornado, então o que é retornado é o nil.
  2. Retorna true ou false.
    • Para métodos que retornam um booleano, então sempre um booleano é retornado.
  3. Não existe método que retorna um valor ou booleano.

Então, quando você for criar seus próprio método, siga essas práticas e mantenha o padrão.

Boas práticas para usar true, false ou nil

0. Retorne true ou false

  • Em seus métodos escritos em ruby, caso precise retornar uma simples informação se deu certo ou não, retorne true ou false, pois são objetos simples e fácil de entender quando uma pessoa for ler seu código

  • Os métodos do core do ruby funcionam da mesma maneira, retorna true ou false, mas quando pprecisam retornam algum valor, eles retornam nil ou o valor.

2.odd?
=> false
2.even?
=> true
  • Não retorne nil para casos negativos, sempre retorne false

1. Retorne nil ou objeto

  • Caso precise retornar algum o objeto do método, na ausência de objeto, retorne nil. Não retorne false

  • Os métodos do core do ruby funcionam da mesma maneiro e você estará seguindo o padrão da linguagem
    "carlos".gsub!"b", "*")
    => nil
    
    "carlos".gsub!("a", "*")
    => "c*rlos"
    
  • Dessa forma, podemos escrever um código com uma perfomance melhor, caso queiramos executar uma parte do código somente se o valor for diferente de nil.
    senha = "nova-senha"
    if senha.gsub!("-", "*")
      # codigo para ser executado caso a string seja modificada.
    end
    
  • O mesmo código acima usando um método que não altere o valor do objeto seria escrito da seguinte forma:
    senha = "nova-senha"
    nova_senha = senha.gsub("-", "*")
    if !nova_senha.nil?
      # codigo para ser executado caso a string seja modificada.
    end
    
  • Dessa forma o código seria menos perfomático, pois teria que alocar memória para salvar a variável nova_senha e consequentemente o garbage collector entraria em ação para limpar e a execução de tal coletor é um importante fator para a perda de perfomance do código, então sempre tente escrever um código que use o mínimo de garbage collector.

  • Mas atenção, nem tudo pode ser perfeito assim. Ao usar métodos que alteram o valor do objeto perdemos a possibilidade escrever o código abaixo, pois agora gsub! retonar nil caso o valor do objeto não seja modificado:
    # Problemas!
    senha = "nova-senha"
    senha.gsub!("b", "*").downcase!
    => NoMethodError
    
    if senha.gsub!("-", "*")
      senha.downcase!
    end
    
  • Todos os métodos do core do ruby funcionam desse jeito, exemplo, veja a definição no método downcase! na documentação para saber mais.
    downcase!(*args) public
    Downcases the contents of str, returning nil if no changes were made.
    See String#downcase for meaning of options and use with different encodings.
    

2. Resumo

  1. Retorne true ou false de seus métodos
  2. Retorne nil ou objeto de seus métodos
    • Ganhe em perfomance usando essa característica.