告诉不要问的原则说:
你应该努力告诉对象你想要他们做什么;不要问他们关于他们的状态的问题,做出决定,然后告诉他们该怎么做。
问题在于,作为调用者,您不应基于所调用对象的状态来做出决定,而导致您随后更改对象的状态。您正在实现的逻辑可能是被调用对象的责任,而不是您的责任。对于您来说,在对象之外进行决策会违反其封装。
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
告诉版本是...
Widget w = ...;
w.removeFromParent();
但是,如果我需要知道removeFromParent方法的结果,该怎么办?我的第一个反应就是更改removeFromParent以返回一个布尔值,该布尔值指示是否删除了父对象。
但是后来我遇到了“ 命令查询分离模式”,它说“不要这样做”。
它指出,每个方法都应该是执行操作的命令,或者是将数据返回给调用方的查询,但不能同时是两者。换句话说,提出问题不应改变答案。更正式地讲,方法仅在引用透明且因此没有副作用的情况下才应返回值。
这两个真的是彼此矛盾的,如何在两者之间进行选择?我可以和Pragmatic Programmer或Bertrand Meyer一起使用吗?