Das Prinzip Tell Don't Ask besagt:
Sie sollten versuchen, Objekten mitzuteilen, was sie tun sollen. Fragen Sie sie nicht nach ihrem Zustand, treffen Sie keine Entscheidung und sagen Sie ihnen dann, was sie tun sollen.
Das Problem ist, dass Sie als Aufrufer keine Entscheidungen treffen sollten, die auf dem Status des aufgerufenen Objekts basieren und zu einer Änderung des Status des Objekts führen. Die Logik, die Sie implementieren, liegt wahrscheinlich in der Verantwortung des aufgerufenen Objekts, nicht in Ihrer. Wenn Sie Entscheidungen außerhalb des Objekts treffen, wird dessen Kapselung verletzt.
Ein einfaches Beispiel für "Tell, Don't Ask" ist
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
und die tell version ist ...
Widget w = ...;
w.removeFromParent();
Was ist, wenn ich das Ergebnis der removeFromParent-Methode kennen muss? Meine erste Reaktion bestand lediglich darin, removeFromParent so zu ändern, dass ein Boolescher Wert zurückgegeben wird, der angibt, ob das übergeordnete Element entfernt wurde oder nicht.
Aber dann bin ich auf das Trennmuster für Befehlsabfragen gestoßen, das besagt, dass dies NICHT erfolgen soll.
Jede Methode sollte entweder ein Befehl sein, der eine Aktion ausführt, oder eine Abfrage, die Daten an den Aufrufer zurückgibt, jedoch nicht beide. Mit anderen Worten, das Stellen einer Frage sollte die Antwort nicht ändern. Formal sollten Methoden nur dann einen Wert zurückgeben, wenn sie referenziell transparent sind und daher keine Nebenwirkungen aufweisen.
Sind diese beiden wirklich uneins und wie wähle ich zwischen den beiden? Gehe ich mit dem Pragmatic Programmer oder Bertrand Meyer darüber?