Il principio Tell Don't Ask dice:
dovresti cercare di dire agli oggetti cosa vuoi che facciano; non porre loro domande sul loro stato, prendere una decisione e poi dire loro cosa fare.
Il problema è che, come chiamante, non dovresti prendere decisioni basate sullo stato dell'oggetto chiamato che ti porta a cambiare lo stato dell'oggetto. La logica che stai implementando è probabilmente la responsabilità dell'oggetto chiamato, non la tua. Per te prendere decisioni al di fuori dell'oggetto viola la sua incapsulamento.
Un semplice esempio di "Tell, Don't Ask" è
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
e la versione tell è ...
Widget w = ...;
w.removeFromParent();
E se avessi bisogno di sapere il risultato dal metodo removeFromParent? La mia prima reazione è stata solo quella di cambiare removeFromParent per restituire un valore booleano che indica se il genitore è stato rimosso o meno.
Ma poi mi sono imbattuto in un modello di separazione delle query di comando che dice di NON farlo.
Indica che ogni metodo dovrebbe essere un comando che esegue un'azione o una query che restituisce dati al chiamante, ma non entrambi. In altre parole, porre una domanda non dovrebbe cambiare la risposta. Più formalmente, i metodi dovrebbero restituire un valore solo se sono referenzialmente trasparenti e quindi non presentano effetti collaterali.
Questi due sono davvero in contrasto tra loro e come faccio a scegliere tra i due? Vado con il programmatore pragmatico o Bertrand Meyer su questo?