ลองนึกภาพว่าคุณเป็นเจ้าของร้านขายของเล่น ร้านมีพื้นที่สองส่วนคือ 'เคาน์เตอร์ขายของ' และ 'ห้องเก็บของเล่น' ลูกค้าที่มาเดินเลือกของเล่น ต้องมาถามที่เคาน์เตอร์ก่อนว่าของที่อยากได้ยังมีอยู่ไหม? พนักงานที่ห้องเก็บของเล่นจะเป็นคนไปหยิบของให้ แล้วเมื่อขายของเสร็จ พนักงานก็ต้องบันทึกว่าของเล่นตัวนั้นหมดแล้ว
CQRS (Command Query Responsibility Segregation) ก็เหมือนการแบ่งงานในร้านขายของเล่นเรา ด้วยการแบ่งส่วน 'การสั่งซื้อ' (Command) และ 'การสอบถาม' (Query). Command ก็คือการบอกให้ระบบทำอะไรสักอย่าง เช่น หยิบเลโก้ชุดนักบินมาขาย ส่วน Query คือการถามหารายละเอียด ว่าเลโก้ชุดนักบินยังมีเหลืออยู่ไหม
ง่ายๆ นะครับ จินตนาการว่าเราไปเล่นที่สนามเด็กเล่น มีเพื่อนชื่อตู่และฟ้า เพื่อนเราตู่เป็นคนที่บอกเราว่า "เข้าไปเล่นบ้านบอลสีเหลือง" เพราะตู่ชอบสั่งน่ะครับ ส่วนเพื่อนฟ้าเป็นคนถามเราว่า "บ้านบอลสีเหลืองมีบอลกี่ลูก?" เพราะฟ้าชอบถามคำถามน่ารู้
ในภาษาเขียนโปรแกรม CQRS ตู่คือส่วนที่ 'สั่งงาน' หรือ Command และฟ้าคือส่วนที่ 'ถามคำถาม' หรือ Query ด้วยการที่เราแยกตู่กับฟ้าออกจากกัน เราก็สามารถบอกตู่ได้ง่ายว่า "ตู่ครับ ไปหยิบบอลสีเหลืองมาให้หน่อย" และหันไปบอกฟ้าว่า "ฟ้าคะ ตอนนี้บ้านบอลสีเหลืองเหลือบอลกี่ลูกแล้วหรอ?" โดยที่การทำงานของตู่ไม่รบกวนการทำงานของฟ้าเลย ชีวิตง่ายขึ้นเยอะเลยครับ!
CQRS ทำให้โปรแกรมมีความเร็วและยืดหยุ่นขึ้น เพราะเมื่อเราแยกฟังก์ชัน 'สั่งงาน' กับ 'ถามข้อมูล' ออกจากกัน ระบบทำคำสั่งได้รวดเร็วไม่ต้องรอที่จะถามข้อมูล และการถามข้อมูลก็ไม่ต้องรอคำสั่งที่ใช้เวลานานๆ จบ
เช่น เว็บไซต์อีคอมเมิร์ซที่ลูกค้าทั้งหลายสามารถเพิ่มสินค้าลงตะกร้า (Command) ได้โดยไม่ต้องรอให้ระบบจัดการกับคำถามว่าสินค้ายังเหลืออยู่ไหม (Query) นั่นทำให้การทำงานรอบข้างเบาลงและลดโอกาสที่เว็บจะล่มได้
สมัครว่าเรากำลังเขียนเว็บไซต์ขายหนังสือ เรามีหน้าเว็บที่ลูกค้าสามารถสั่งซื้อหนังสือได้ และอีกหน้าเว็บที่แสดงหนังสือทั้งหมดที่มี
ด้วย CQRS เรามีโค้ดสั่งซื้อหนังสือ (Command) แยกกับโค้ดที่แสดงรายการหนังสือ (Query) เมื่อมีลูกค้าสั่งซื้อหนังสือ, ระบบทำงาน 'Command' ได้ทันที และระบบ 'Query' สามารถอัพเดทข้อมูลได้โดยอิสระ
# Command: สั่งซื้อหนังสือ
def purchase_book(book_id, user_id):
...
# โค้ดที่ทำงานสั่งซื้อ
...
return "บันทึกคำสั่งซื้อเรียบร้อยแล้วครับ!"
# Query: แสดงรายการหนังสือ
def get_books_list():
...
# โค้ดที่เรียกดูข้อมูลหนังสือ
...
return books_list
เมื่อเราต้องการอัพเดทข้อมูลหนังสือหรือเปลี่ยนแปลงกระบวนการซื้อในฝั่ง Command เราก็ทำได้โดยไม่กระทบกับฝั่ง Query ทำให้แต่ละฝั่งสามารถทำงานและพัฒนาได้อย่างอิสระจากกัน
เห็นไหมครับว่า CQRS ทำให้เราสามารถจัดการกับ 'การสั่งซื้อ' และ 'การเรียกดูข้อมูล' ได้อย่างรวดเร็วและมีประสิทธิภาพ หากคุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการเขียนโค้ดที่มีประสิทธิภาพ ทาง EPT มีหลักสูตรที่จะช่วยให้คุณได้ฝึกฝนและเรียนรู้วิธีการพัฒนาโปรแกรมแบบมืออาชีพนะครับ!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM