Rails Way #4: Métodos destrutivos ou somente perigosos?

27 de fevereiro de 2009  |  Rails Way  | 

O último artigo desta série levantou uma certa polêmica em alguns pontos. Quero deixar claro que entendo muito bem que existem situações em que não é possível ou mesmo prático utilizar as sugestões descritas aqui. Você não deve encarar esta série de artigos como um livro de leis, mas somente como boas práticas adotadas pela maior parte da comunidade de desenvolvedores Rails.

O que quero é exatamente isto, levantar discussões sobre o que é bom ou ruim e o que é realmente prático ou simplesmente moda.

Ao comentar sobre algumas boas práticas ao nomear métodos, mencionei sobre o uso dos sinais de exclamação (!) e interrogação (?) como uma forma de deixar os métodos mais descritivos. Meu erro talvez tenha ocorrido ao usar o nome ‘métodos destrutivos’ quando me referi aos métodos terminados com o sinal de exclamação.

Concordo em dizer que na verdade ‘!’ no fim de um método não necessariamente significa “destrutivo”, mas sim que o método em questão é uma versão mais perigosa de um outro método com o mesmo nome, mas sem o sinal.

Deixe-me explicar isto melhor

2990809708_b26fb9ef8c

O sinal ! no nome de um método serve como um alerta de “perigo”

O uso da expressão ‘método perigoso’ é relativo. Dizer que um método terminado com ! é perigoso, não diz nada se você não possuir um outro método similar menos perigoso e sem o sinal de exclamação.

Assim, a regra número um é que todo método terminado com ! deve vir acompanhado de um outro método com o mesmo nome, mas sem o sinal.

No Ruby e também no Rails encontramos muitos casos assim. Por exemplo, temos o método gsub! que é mais perigoso que o seu companheiro gsub. Assim como também temos o método exit! que é a versão mais perigosa do método exit, e assim por diante.

Alguns acreditam que devem usar o sinal ! apenas quando o método alterar a sua própria instância. Embora muitos método perigosos façam isto, esta não a finalidade do sinal de exclamação. No próprio Ruby encontramos métodos que tem esta característica mas que não são considerados perigosos, como os métodos Array#pop e Array#push, apenas para citar alguns exemplos.

Devemos apenas fazer uso do sinal ! quando criarmos um método que represente mais perigo que outro já criado. Tome como exemplo os métodos save e save! do ActiveRecord. O primeiro método simplesmente grava o registro no banco de dados e retorna verdadeiro ou falso de acordo com o resultado do procedimento. Utilizando o segundo método, caso algo dê errado não teremos de volta apenas um booleano falso, teremos o disparo de uma exceção, o que pode representar um certo risco se o seu aplicativo não estiver preparado para isto. Desta forma podemos considerar este método mais perigoso que o primeiro, merecendo assim a adição do sinal ! no final de seu nome.

A conclusão é que o uso de “!” no nome de um método não dirá a você exatamente o que ele fará ou de que forma ele representa perigo. Mas o sinal de exclamação (!) é importante como um alerta de que o método em questão pode representar algum risco se usado de forma impensada.


2 Comentários


  1. Obrigado por este post Carlos, estou começando no RoR e ainda estou boiando em algumas coisas. =P vou seguir teu blog de bem perto. Abraços!

  2. Eu adotei a prática de criar um método que dispara exceptions no ! e no normal ele trata isso. É interessante quando você começa a trabalhar com transactions, e dependendo da hora é importante disparar uma exception ou não.

    Por exemplo:

    def activate!
      raise FooError, "Bleh :P" if true
    end
    
    def activate
      begin
        activate!
      rescue FooError => ex
        # bleh :P
        return false
      end
    end

    Mas também adotei como algo para determinar “ordens” algumas vezes!

    def complete!
      update_attribute(:completed_at, Time.now)
    end

    E o ? funciona para checar:

    def complete?
      !self.completed_at.nil?
    end

Deixe um comentário