El principio Tell Don't Ask dice:
debes esforzarte por decirle a los objetos lo que quieres que hagan; no les haga preguntas sobre su estado, tome una decisión y luego dígales qué hacer.
El problema es que, como la persona que llama, no debe tomar decisiones basadas en el estado del objeto llamado que provoque que cambie el estado del objeto. La lógica que está implementando es probablemente la responsabilidad del objeto llamado, no la suya. Para que usted tome decisiones fuera del objeto viola su encapsulación.
Un ejemplo simple de "Dile, no preguntes" es
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
y la versión tell es ...
Widget w = ...;
w.removeFromParent();
Pero, ¿qué sucede si necesito saber el resultado del método removeFromParent? Mi primera reacción fue simplemente cambiar removeFromParent para devolver un valor booleano que indica si el padre fue eliminado o no.
Pero luego me encontré con el Patrón de separación de consulta de comando que dice NO hacer esto.
Establece que cada método debe ser un comando que realiza una acción o una consulta que devuelve datos al llamante, pero no ambos. En otras palabras, hacer una pregunta no debería cambiar la respuesta. Más formalmente, los métodos deberían devolver un valor solo si son referencialmente transparentes y, por lo tanto, no poseen efectos secundarios.
¿Están estos dos realmente en desacuerdo entre sí y cómo elijo entre los dos? ¿Voy con el programador pragmático o Bertrand Meyer en esto?