หลักการบอกว่าอย่าถามว่า:
คุณควรพยายามบอกสิ่งที่คุณต้องการให้พวกเขาทำ อย่าถามพวกเขาเกี่ยวกับสถานะของพวกเขาตัดสินใจแล้วบอกพวกเขาว่าจะทำอย่างไร
ปัญหาคือในฐานะผู้โทรคุณไม่ควรทำการตัดสินใจตามสถานะของวัตถุที่เรียกว่าทำให้คุณเปลี่ยนสถานะของวัตถุ ตรรกะที่คุณใช้อยู่อาจเป็นความรับผิดชอบของวัตถุที่เรียกว่าไม่ใช่ของคุณ สำหรับคุณในการตัดสินใจนอกวัตถุที่ละเมิดการห่อหุ้ม
ตัวอย่างง่ายๆของ "Tell, Don't Ask"คือ
Widget w = ...;
if (w.getParent() != null) {
Panel parent = w.getParent();
parent.remove(w);
}
และเวอร์ชัน Tell คือ ...
Widget w = ...;
w.removeFromParent();
แต่ถ้าฉันต้องรู้ผลลัพธ์จากวิธี removeFromParent ปฏิกิริยาแรกของฉันคือเพียงแค่เปลี่ยน removeFromParent เพื่อส่งกลับค่าบูลีนเพื่อระบุว่าพาเรนต์ถูกลบหรือไม่
แต่ฉันเจอรูปแบบการแยกคำสั่งซึ่งบอกว่าไม่ต้องทำ
มันระบุว่าทุกวิธีควรเป็นคำสั่งที่ทำการดำเนินการหรือแบบสอบถามที่ส่งคืนข้อมูลไปยังผู้โทร แต่ไม่ใช่ทั้งสองอย่าง กล่าวอีกนัยหนึ่งการถามคำถามไม่ควรเปลี่ยนคำตอบ อย่างเป็นทางการมากขึ้นวิธีการที่ควรส่งกลับค่าเฉพาะในกรณีที่พวกเขามีความโปร่งใส referential และจึงไม่มีผลข้างเคียง
สองคนนี้ขัดแย้งกันจริงๆและฉันจะเลือกระหว่างคนทั้งสองได้อย่างไร ฉันจะไปกับ Pragmatic Programmer หรือ Bertrand Meyer ได้ไหม?