5
วิธีการเลือกระหว่างบอกไม่ถามและแยกคำสั่ง?
หลักการบอกว่าอย่าถามว่า: คุณควรพยายามบอกสิ่งที่คุณต้องการให้พวกเขาทำ อย่าถามพวกเขาเกี่ยวกับสถานะของพวกเขาตัดสินใจแล้วบอกพวกเขาว่าจะทำอย่างไร ปัญหาคือในฐานะผู้โทรคุณไม่ควรทำการตัดสินใจตามสถานะของวัตถุที่เรียกว่าทำให้คุณเปลี่ยนสถานะของวัตถุ ตรรกะที่คุณใช้อยู่อาจเป็นความรับผิดชอบของวัตถุที่เรียกว่าไม่ใช่ของคุณ สำหรับคุณในการตัดสินใจนอกวัตถุที่ละเมิดการห่อหุ้ม ตัวอย่างง่ายๆของ "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 …