Il principio Tell Do not Ask dice:
you should endeavor to tell objects what you want them to do; do not ask them questions about their state, make a decision, and then tell them what to do.
The problem is that, as the caller, you should not be making decisions based on the state of the called object that result in you then changing the state of the object. The logic you are implementing is probably the called object’s responsibility, not yours. For you to make decisions outside the object violates its encapsulation.
Un semplice esempio di "Tell, don" "Chiedi" è
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
e la versione di tell è ...
Widget w = ...;
w.removeFromParent();
Ma cosa succede se ho bisogno di sapere il risultato del metodo removeFromParent? La mia prima reazione è stata quella di cambiare removeFromParent per restituire un valore booleano che indica se il genitore è stato rimosso o meno.
Ma poi mi sono imbattuto in Pattern di separazione delle query di comando che dice di NON farlo.
It states that every method should either be a command that performs an action, or a query that returns data to the caller, but not both. In other words, asking a question should not change the answer. More formally, methods should return a value only if they are referentially transparent and hence possess no side effects.
Questi due sono davvero in contrasto tra loro e come faccio a scegliere tra i due? Vado con il Pragmatic Programmer o Bertrand Meyer su questo?