Nguyên tắc Tell Don't Ask nói:
bạn nên cố gắng nói với các đối tượng những gì bạn muốn họ làm; đừng hỏi họ những câu hỏi về tình trạng của họ, đưa ra quyết định và sau đó nói cho họ biết phải làm gì.
Vấn đề là, với tư cách là người gọi, bạn không nên đưa ra quyết định dựa trên trạng thái của đối tượng được gọi dẫn đến kết quả là bạn sẽ thay đổi trạng thái của đối tượng. Logic bạn đang thực hiện có lẽ là trách nhiệm của đối tượng được gọi, không phải của bạn. Để bạn đưa ra quyết định bên ngoài đối tượng vi phạm đóng gói của nó.
Một ví dụ đơn giản về "Nói, đừng hỏi" là
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
và phiên bản cho biết là ...
Widget w = ...;
w.removeFromParent();
Nhưng nếu tôi cần biết kết quả từ phương thức removeFromParent thì sao? Phản ứng đầu tiên của tôi chỉ là thay đổi removeFromParent để trả về một biểu thị boolean nếu cha mẹ đã được gỡ bỏ hay không.
Nhưng sau đó tôi đã bắt gặp Mẫu tách biệt truy vấn lệnh mà KHÔNG làm điều này.
Nó tuyên bố rằng mọi phương thức nên là một lệnh thực hiện một hành động hoặc một truy vấn trả về dữ liệu cho người gọi, nhưng không phải cả hai. Nói cách khác, đặt câu hỏi không nên thay đổi câu trả lời. Chính thức hơn, các phương thức chỉ trả về một giá trị nếu chúng trong suốt được tham chiếu và do đó không có tác dụng phụ.
Có phải hai người này thực sự bất hòa với nhau và làm thế nào để tôi chọn giữa hai? Tôi có đi cùng với Lập trình viên thực dụng hay Bertrand Meyer về điều này không?