Tell Do n't Askの原則は次のとおりです。
オブジェクトに何をしたいかを伝えるよう努力する必要があります。彼らに彼らの状態についての質問をしないで、決定を下して、そして、彼らに何をすべきかを彼らに話します。
問題は、呼び出し元として、呼び出されたオブジェクトの状態に基づいて決定を下すべきではないということです。その結果、オブジェクトの状態が変更されます。実装しているロジックは、おそらく呼び出されたオブジェクトの責任であり、あなたの責任ではありません。オブジェクトの外側で決定を下すと、そのカプセル化に違反します。
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
tellバージョンは...
Widget w = ...;
w.removeFromParent();
しかし、removeFromParentメソッドからの結果を知る必要がある場合はどうでしょうか?私の最初の反応は、removeFromParentを変更して、親が削除されたかどうかを示すブール値を返すことでした。
しかし、私はこれをしないと言うコマンドクエリ分離パターンに出くわしました。
すべてのメソッドは、アクションを実行するコマンド、または呼び出し側にデータを返すクエリのいずれかである必要がありますが、両方ではないことを示しています。言い換えれば、質問をしても答えは変わらないはずです。より正式には、メソッドは参照的に透明であり、したがって副作用がない場合にのみ値を返す必要があります。
これら2つは本当に対立しているのですか?どうすれば2つを選択できますか?これについては、Pragmatic ProgrammerまたはBertrand Meyerを使用しますか?