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:
[code language=\\\”ruby\\\”]
def street_name(user)
if user.address
user.address.street_name
else
\\\’No street name on file\\\’
end
end
[/code]
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:
[code language=\\\”ruby\\\”]
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
[/code]
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
Deixe um comentário