O princípio Tell Don't Ask diz:
você deve tentar dizer aos objetos o que você quer que eles façam; não faça perguntas sobre seu estado, tome uma decisão e depois diga a eles o que fazer.
O problema é que, como responsável pela chamada, você não deve tomar decisões com base no estado do objeto chamado que resulta na alteração do estado do objeto. A lógica que você está implementando provavelmente é de responsabilidade do objeto chamado, não sua. Para você tomar decisões fora do objeto, viola seu encapsulamento.
Um exemplo simples de "Diga, não pergunte" é
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
e a versão Tell é ...
Widget w = ...;
w.removeFromParent();
Mas e se eu precisar saber o resultado do método removeFromParent? Minha primeira reação foi apenas alterar o removeFromParent para retornar um valor booleano se o pai foi removido ou não.
Mas então me deparei com Command Query Separation Pattern que diz NÃO para fazer isso.
Ele afirma que todo método deve ser um comando que executa uma ação ou uma consulta que retorna dados ao chamador, mas não os dois. Em outras palavras, fazer uma pergunta não deve alterar a resposta. Mais formalmente, os métodos devem retornar um valor somente se forem referencialmente transparentes e, portanto, não apresentarem efeitos colaterais.
Esses dois estão realmente em conflito um com o outro e como faço para escolher entre os dois? Eu vou com o programador pragmático ou Bertrand Meyer sobre isso?