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:

[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


Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *