ขำ ๆ คำถามนี้ทำให้ฉันนึกถึงบทสนทนาเดียวกับที่ฉันมีกับหนึ่งในวิศวกรของเราเกี่ยวกับห้องสมุดการสื่อสารที่ฉันทำงานอยู่
แทนที่จะเป็นคำสั่งฉันมีคลาสขอแล้วฉันก็มี RequestHandler การออกแบบนั้นเหมือนกับสิ่งที่คุณกำลังอธิบาย ฉันคิดว่าส่วนหนึ่งของความสับสนที่คุณมีคือคุณเห็นคำภาษาอังกฤษ "คำสั่ง" และคิดว่า "คำกริยาการกระทำ ... ฯลฯ " ทันที
แต่ในการออกแบบนี้ให้คิดว่า Command (หรือ Request) เป็นตัวอักษร หรือสำหรับผู้ที่ไม่ทราบว่าบริการไปรษณีย์คืออะไรคิดอีเมล มันเป็นเพียงเนื้อหาแยกออกจากวิธีการที่เนื้อหาควรจะดำเนินการ
ทำไมคุณถึงทำเช่นนี้? ในกรณีที่ง่ายที่สุดของรูปแบบคำสั่งไม่มีเหตุผลและคุณสามารถให้คลาสนี้ทำงานได้โดยตรง อย่างไรก็ตามการทำ decoupling ในแบบของคุณนั้นสมเหตุสมผลถ้าการกระทำ / คำสั่ง / คำขอของคุณต้องเดินทางไกล ตัวอย่างเช่นข้ามซ็อกเก็ตหรือไพพ์หรือระหว่างโดเมนและโครงสร้างพื้นฐาน หรืออาจจะอยู่ในสถาปัตยกรรมของคุณคำสั่งของคุณจะต้องคงอยู่ (เช่นตัวจัดการคำสั่งสามารถทำ 1 คำสั่งได้ในแต่ละครั้งเนื่องจากเหตุการณ์บางอย่างของระบบคำสั่ง 200 คำสั่งมาถึงและหลังจากกระบวนการ 40 ครั้งแรกได้รับการปิด) ในกรณีดังกล่าวการมีคลาสข้อความอย่างเดียวอย่างง่ายมันจะกลายเป็นเรื่องง่ายมากที่จะทำให้เป็นอนุกรมส่วนของข้อความใน JSON / XML / binary / อะไรก็ตามและส่งมันลงท่อไปจนกว่าตัวจัดการคำสั่งของมันพร้อมที่จะประมวลผล
ข้อดีอีกประการของ decoupling Command จาก CommandHandler คือตอนนี้คุณมีตัวเลือกของลำดับชั้นการสืบทอดขนาน ตัวอย่างเช่นคำสั่งทั้งหมดของคุณอาจได้รับมาจากคลาสคำสั่งฐานที่รองรับการทำให้เป็นอนุกรม และบางทีคุณอาจมีตัวจัดการคำสั่ง 4 จาก 20 ตัวที่มีความคล้ายคลึงกันมากตอนนี้คุณสามารถหาค่าจากคลาสฐานของตัวจัดการที่มา หากคุณต้องมีข้อมูลและการจัดการคำสั่งในชั้นหนึ่งความสัมพันธ์ประเภทนี้จะหมุนวนอย่างไม่สามารถควบคุมได้
อีกตัวอย่างสำหรับ decoupling คือถ้าคำสั่งของคุณต้องการอินพุตน้อยมาก (เช่น 2 จำนวนเต็มและสตริง) แต่ตรรกะการจัดการของมันซับซ้อนพอที่คุณต้องการเก็บข้อมูลในตัวแปรสมาชิกระดับกลาง หากคุณจัดคิว 50 คำสั่งคุณไม่ต้องการจัดสรรหน่วยความจำสำหรับที่เก็บข้อมูลระดับกลางทั้งหมดดังนั้นคุณจึงแยกคำสั่งจาก CommandHandler ตอนนี้คุณจัดคิวโครงสร้างข้อมูลน้ำหนักเบา 50 รายการและการจัดเก็บข้อมูลที่ซับซ้อนมากขึ้นจะถูกจัดสรรเพียงครั้งเดียว (หรือ N ครั้งหากคุณมีตัวจัดการ N) โดย CommandHandler ที่กำลังประมวลผลคำสั่ง