Diga, não pergunte

Diga, não pergunte – mais popularmente conhecido como tell, don’t ask – é um princípio da orientação a objetos que nos lembra de que, ao invés de pedir dados a um objeto, devemos dizer a ele o que fazer.

Dados e operações devem pertencer ao objeto, logo, você não precisa consultá-lo para depois agir em seu nome. Ou seja, você deve dizer ao objeto o que você quer que ele faça, e não perguntar sobre seu estado para depois tomar uma decisão. Por exemplo:

def street_name(user)
  if user.address
    user.address.street_name
  else
    'No street name on file'
  end
end

O método street_name está perguntando o estado de user para tomar uma decisão e retornar algo. De acordo com o tell, don’t ask, a implementação dessa lógica deveria ser responsabilidade de user e não do chamador, pois o tipo de implementação visto acima, viola o encapsulamento de user.

Uma solução bem melhor seria:

 def street_name(user)
   user.address.street_name
 end

 class User
   def address
     @address || NullAddress.new
   end
 end

 class NullAddress
   def street_name
     'No street name on file'
   end
 end

Agora, stree_name apenas diz o que quer e o objeto user se encarrega da lógica. Também fazemos uso do pattern NullObject, para deixarmos a solução orientada a objetos de fato.

Deste modo, passamos a pensar declarativamente ao invés de proceduralmente.

Referências
http://martinfowler.com/bliki/TellDontAsk.html
https://pragprog.com/articles/tell-dont-ask

Anúncios

O que tu achas?

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