Tell Do n't Ask 원칙 은 다음과 같이 말합니다.
당신이 원하는 것을 대상에게 말하려고 노력해야한다. 그들에게 자신의 상태에 대해 질문하지 말고 결정을 한 다음 무엇을해야하는지 이야기하십시오.
문제는 호출자로서 호출 된 객체의 상태를 기반으로 결정을 내려서 객체의 상태를 변경해서는 안된다는 것입니다. 당신이 구현하고있는 논리는 아마도 당신의 책임이 아닌 객체의 책임 일 것입니다. 객체 외부에서 결정을 내리려면 캡슐화를 위반합니다.
"Tell, Do n't Ask"의 간단한 예 는 다음과 같습니다.
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
말해 버전은 ...
Widget w = ...;
w.removeFromParent();
그러나 removeFromParent 메소드의 결과를 알아야하는 경우 어떻게해야합니까? 첫 번째 반응은 부모가 제거되었는지 여부를 나타내는 부울을 반환하도록 removeFromParent를 변경하는 것입니다.
그러나 나는 이것을하지 말라고 명령 쿼리 분리 패턴 을 보았습니다 .
모든 메소드는 조치를 수행하는 명령이거나 호출자에게 데이터를 리턴하는 쿼리 여야하지만 둘다는 아니라고 명시합니다. 다시 말해, 질문을해도 대답이 바뀌지 않아야합니다. 보다 공식적으로, 메소드는 참조 적으로 투명하고 부작용이없는 경우에만 값을 리턴해야합니다.
이 두 가지가 실제로 서로 상충되며 두 가지 중에서 어떻게 선택합니까? Pragmatic Programmer 또는 Bertrand Meyer와 함께 가나 요?