เหตุการณ์คือการแจ้งเตือนการอธิบายปรากฏการณ์ที่เกิดขึ้นจากอดีตที่ผ่านมา
การใช้งานตามปกติของระบบที่ขับเคลื่อนด้วยเหตุการณ์ใช้ฟังก์ชั่นตัวกระจายเหตุการณ์และฟังก์ชันตัวจัดการ (หรือสมาชิก ) โปรแกรมเลือกจ่ายงานจัดหา API ให้กับตัวจัดการสายไฟสูงสุดถึงเหตุการณ์ (jQuery's bind
) และวิธีการเผยแพร่กิจกรรมให้กับสมาชิก ( trigger
ใน jQuery) เมื่อคุณกำลังพูดถึงเหตุการณ์ IO หรือ UI มักจะมีวงวนเหตุการณ์ซึ่งตรวจจับเหตุการณ์ใหม่เช่นการคลิกเมาส์และส่งต่อไปยังโปรแกรมเลือกจ่ายงาน ใน JS-land ตัวกระจายข้อมูลและเหตุการณ์วนรอบจะถูกจัดเตรียมโดยเบราว์เซอร์
สำหรับรหัสที่มีการโต้ตอบกับผู้ใช้โดยตรง - ตอบสนองต่อการกดแป้นและคลิก - การเขียนโปรแกรมเหตุการณ์ที่ขับเคลื่อนด้วย (หรือรูปแบบดังกล่าวเช่นการเขียนโปรแกรมปฏิกิริยาการทำงาน ) หลีกเลี่ยงไม่ได้เกือบ คุณโปรแกรมเมอร์ไม่มีความคิดว่าผู้ใช้จะคลิกเมื่อใดหรือที่ไหนดังนั้นจึงลงไปที่กรอบ GUI หรือเบราว์เซอร์เพื่อตรวจจับการกระทำของผู้ใช้ในลูปเหตุการณ์และแจ้งรหัสของคุณ โครงสร้างพื้นฐานประเภทนี้ยังใช้ในแอปพลิเคชั่นเครือข่าย (cf NodeJS)
ตัวอย่างของคุณในกรณีที่คุณเพิ่มเหตุการณ์ในรหัสของคุณแทนที่จะเรียกฟังก์ชั่นโดยตรงจะมีการแลกเปลี่ยนที่น่าสนใจมากขึ้นซึ่งฉันจะกล่าวถึงด้านล่าง ข้อแตกต่างที่สำคัญคือผู้เผยแพร่กิจกรรม ( makeItSnow
) ไม่ได้ระบุผู้รับของการโทร ที่มีสายอื่น ๆ (ในbind
ตัวอย่างของคุณ) สิ่งนี้เรียกว่าไฟและลืม : makeItSnow
ประกาศให้โลกรู้ว่าหิมะตก แต่ไม่สนใจว่าใครกำลังฟังเกิดอะไรขึ้นต่อไปหรือเมื่อมันเกิดขึ้น - มันออกอากาศข้อความและฝุ่นออกจากมือ
ดังนั้นวิธีการที่ขับเคลื่อนด้วยเหตุการณ์จะแยกผู้ส่งข้อความออกจากผู้รับ ข้อได้เปรียบอย่างหนึ่งที่ทำให้คุณมั่นใจคือเหตุการณ์ที่กำหนดอาจมีตัวจัดการหลายตัว คุณสามารถผูกgritRoads
ฟังก์ชันกับเหตุการณ์หิมะโดยไม่ส่งผลกระทบต่อshovelSnow
ตัวจัดการที่มีอยู่ คุณมีความยืดหยุ่นในการใช้งานแอปพลิเคชันของคุณ หากต้องการปิดการทำงานคุณเพียงแค่ลบการbind
โทรออกแทนที่จะไปหาโค้ดเพื่อค้นหาอินสแตนซ์ทั้งหมดของการทำงาน
ข้อดีอีกอย่างของการเขียนโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์ก็คือมันทำให้คุณมีข้อกังวลข้าม ตัวแจกจ่ายเหตุการณ์มีบทบาทเป็นผู้ไกล่เกลี่ยและบางไลบรารี (เช่นBrighter ) ใช้ไพพ์ไลน์เพื่อให้คุณสามารถปลั๊กอินข้อกำหนดทั่วไปเช่นการบันทึกหรือคุณภาพของบริการได้อย่างง่ายดาย
การเปิดเผยอย่างเต็มรูปแบบ: Brighter พัฒนาขึ้นที่ Huddle ที่ซึ่งฉันทำงานอยู่
ข้อได้เปรียบประการที่สามของการแยกตัวส่งสัญญาณเหตุการณ์จากผู้รับคือมันให้ความยืดหยุ่นเมื่อคุณจัดการกับเหตุการณ์ คุณสามารถประมวลผลเหตุการณ์แต่ละประเภทด้วยเธรดของตัวเอง (หากผู้แจกจ่ายเหตุการณ์ของคุณสนับสนุน) หรือคุณสามารถใส่เหตุการณ์ที่เพิ่มเข้ามาในนายหน้าข้อความเช่นRabbitMQและจัดการกับกระบวนการแบบอะซิงโครนัสหรือดำเนินการแบบข้ามคืนจำนวนมาก ผู้รับของเหตุการณ์อาจอยู่ในกระบวนการแยกต่างหากหรือบนเครื่องแยกต่างหาก คุณไม่จำเป็นต้องเปลี่ยนรหัสเพื่อให้เหตุการณ์เกิดขึ้น! นี่คือความคิดที่ยิ่งใหญ่ที่อยู่เบื้องหลังสถาปัตยกรรม "บริการไมโครสโคป": บริการอิสระสื่อสารโดยใช้กิจกรรมด้วยการส่งข้อความมิดเดิลแวร์เป็นแกนหลักของแอปพลิเคชัน
สำหรับตัวอย่างที่แตกต่างกันของสไตล์ที่ขับเคลื่อนด้วยเหตุการณ์ให้ดูที่การออกแบบที่ขับเคลื่อนด้วยโดเมนโดยที่กิจกรรมโดเมนจะถูกใช้เพื่อช่วยแยกมวลรวมออกจากกัน ตัวอย่างเช่นพิจารณาร้านค้าออนไลน์ที่แนะนำผลิตภัณฑ์โดยอ้างอิงจากประวัติการซื้อของคุณ Customer
ความต้องการที่จะมีประวัติของการซื้อของการอัปเดตเมื่อShoppingCart
มีการจ่ายเงินสำหรับ ผลShoppingCart
รวมอาจแจ้งCustomer
โดยการเพิ่มCheckoutCompleted
เหตุการณ์ Customer
จะได้รับการปรับปรุงในการทำธุรกรรมที่แยกต่างหากในการตอบสนองต่อเหตุการณ์ที่เกิดขึ้น
ข้อเสียหลักของโมเดลที่ขับเคลื่อนด้วยเหตุการณ์นี้คือการอ้อม ตอนนี้หารหัสที่จัดการเหตุการณ์ได้ยากขึ้นเพราะคุณไม่สามารถนำทางได้โดยใช้ IDE ของคุณ คุณต้องคิดออกว่าเหตุการณ์ถูกผูกไว้ในการกำหนดค่าและหวังว่าคุณจะได้พบกับตัวจัดการทั้งหมด มีหลายสิ่งที่คุณจะต้องเก็บไว้ในใจตลอดเวลา การประชุมลักษณะรหัสสามารถช่วยได้ที่นี่ (ตัวอย่างเช่นการโทรทั้งหมดไปยังbind
ไฟล์เดียว) เพื่อประโยชน์ด้านสุขภาพจิตของคุณเป็นเรื่องสำคัญที่จะต้องใช้ผู้ส่งเหตุการณ์หนึ่งรายเท่านั้นและใช้อย่างสม่ำเสมอ
ข้อเสียอีกอย่างหนึ่งก็คือมันยากที่จะปรับโครงสร้างเหตุการณ์ หากคุณต้องการเปลี่ยนรูปแบบของกิจกรรมคุณต้องเปลี่ยนเครื่องรับทั้งหมด สิ่งนี้จะทวีความรุนแรงมากขึ้นเมื่อสมาชิกของกิจกรรมอยู่บนเครื่องที่แตกต่างกันเพราะตอนนี้คุณต้องซิงโครไนซ์การเปิดตัวซอฟต์แวร์!
ในบางสถานการณ์ประสิทธิภาพอาจมีความกังวล เมื่อประมวลผลข้อความโปรแกรมเลือกจ่ายงานจะต้อง:
- ค้นหาตัวจัดการที่ถูกต้องในโครงสร้างข้อมูลบางอย่าง
- สร้างไปป์ไลน์การประมวลผลข้อความสำหรับแต่ละตัวจัดการ นี่อาจเกี่ยวข้องกับการจัดสรรหน่วยความจำมากมาย
- เรียกตัวจัดการแบบไดนามิก (อาจใช้การสะท้อนหากภาษาต้องการ)
นี่จะช้ากว่าการเรียกใช้ฟังก์ชันปกติซึ่งเกี่ยวข้องกับการกดเฟรมใหม่บนสแต็กเท่านั้น อย่างไรก็ตามความยืดหยุ่นที่สถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ทำให้คุณสามารถแยกและทำให้โค้ดช้าได้ง่ายขึ้น การมีความสามารถในการส่งงานไปยังตัวประมวลผลแบบอะซิงโครนัสเป็นชัยชนะที่ยิ่งใหญ่ที่นี่เนื่องจากช่วยให้คุณสามารถให้บริการตามคำขอได้ทันทีในขณะที่การทำงานอย่างหนักจะได้รับการจัดการในพื้นหลัง ไม่ว่าในกรณีใดถ้าคุณกำลังโต้ตอบกับฐานข้อมูลหรือการวาดรูปบนหน้าจอค่าใช้จ่ายของ IO จะเต็มไปด้วยค่าใช้จ่ายในการประมวลผลข้อความ เป็นกรณีของการหลีกเลี่ยงการเพิ่มประสิทธิภาพก่อนวัยอันควร
โดยสรุปเหตุการณ์เป็นวิธีที่ดีในการสร้างซอฟต์แวร์แบบคู่อย่างอิสระ แต่ไม่มีค่าใช้จ่าย มันจะเป็นความผิดพลาดเช่นการเปลี่ยนทุกฟังก์ชั่นในการประยุกต์ใช้ของคุณกับเหตุการณ์ ใช้เหตุการณ์เพื่อทำให้แผนกสถาปัตยกรรมที่มีความหมาย
$(document).bind('snow', shovelShow)
เช่นกันคุณก็สามารถใช้ ไม่จำเป็นต้องห่อในฟังก์ชันที่ไม่ระบุชื่อ