Le principe Tell Don't Ask dit:
vous devez essayer de dire aux objets ce que vous voulez qu'ils fassent; ne leur posez pas de questions sur leur état, ne prenez pas de décision, puis dites-leur quoi faire.
Le problème est que, en tant qu'appelant, vous ne devez pas prendre de décisions basées sur l'état de l'objet appelé, ce qui vous amène à changer ensuite l'état de l'objet. La logique que vous implémentez est probablement la responsabilité de l'objet appelé, pas la vôtre. Pour vous, prendre des décisions en dehors de l'objet viole son encapsulation.
Un exemple simple de «Dites, ne demandez pas» est
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
et la version tell est ...
Widget w = ...;
w.removeFromParent();
Mais que faire si j'ai besoin de connaître le résultat de la méthode removeFromParent? Ma première réaction a été simplement de changer le removeFromParent pour retourner un booléen indiquant si le parent a été supprimé ou non.
Mais ensuite, je suis tombé sur le modèle de séparation des requêtes de commande qui dit de ne pas faire cela.
Il indique que chaque méthode doit être soit une commande qui exécute une action, soit une requête qui renvoie des données à l'appelant, mais pas les deux. En d'autres termes, poser une question ne devrait pas changer la réponse. Plus formellement, les méthodes ne doivent renvoyer une valeur que si elles sont référentiellement transparentes et ne possèdent donc aucun effet secondaire.
Ces deux-là sont-ils vraiment en contradiction l'un avec l'autre et comment choisir entre les deux? Dois-je aller avec le programmeur pragmatique ou Bertrand Meyer à ce sujet?