پرش به مطلب اصلی

Event Listeners

نکته کلیدی

Event Listener ها کاملاً در مورد مبادلات هستند. آن‌ها ذاتاً خوب یا بد نیستند—بستگی به زمینه و نیازهای سیستم شما دارد.

1. مقدمه و سؤال کلیدی​

چه زمانی باید از Event Listener ها استفاده کنیم و چه زمانی باید از آن‌ها اجتناب کنیم؟ آیا درست یا غلط واضحی وجود دارد، یا همیشه یک مبادله است؟

2. مدیریت رویداد در معماری سیستم​

در معماری‌های مدرن، به ویژه Microservices و Event-Driven Architecture، چندین الگو برای مدیریت رویدادها وجود دارد:

ذخیره تمام تغییرات وضعیت اپلیکیشن به عنوان دنباله‌ای از رویدادها.

تأثیر بر معیارهای کیفیت کد​

چرا مدیریت رویداد مهم است

با افزایش حجم رویدادها، جنبه‌های مختلف کدبیس شما به طرق متفاوتی تحت تأثیر قرار می‌گیرند:

🔻 معیارهای کاهنده

  • خوانایی کد
  • انسجام ماژول

🔺 معیارهای بهبودیافته

  • جداسازی وابستگی‌ها
  • انعطاف‌پذیری سیستم
یادداشت

در سیستم‌های ماژولار یا میکروسرویس که جداسازی حیاتی است، Event Listener ها می‌توانند به ویژه ارزشمند باشند.

3. قرارداد تیم برای Event Listener ها​

اصل اساسی

استفاده از Event Listener ها در داخل یک ماژول ممنوع است. آن‌ها فقط باید برای ارتباط بین ماژول‌های جداگانه استفاده شوند.

Event Listener ها به عنوان هماهنگ‌کننده​

Event listener ها باید فقط بر مسئولیت‌های هماهنگی متمرکز باشند، نه اجرای منطق اصلی کسب‌وکار. آن‌ها باید تا حد امکان سبک باقی بمانند با:

  • واگذاری منطق کسب‌وکار به لایه‌های سرویس اختصاصی
  • اجتناب از شرطی‌های پیچیده یا قوانین کسب‌وکار
  • کمینه‌سازی عملیات همزمان و فراخوانی‌های مسدودکننده
  • نگه‌داشتن listener متمرکز بر مسیریابی و هماهنگی

این رویکرد جداسازی واضح دغدغه‌ها را حفظ می‌کند و قابلیت نگهداری را بهبود می‌بخشد.

مثال سناریو​

مجاز

✅ مجاز: ماژول A رویدادی شلیک می‌کند که ماژول B به آن گوش می‌دهد

مجاز نیست

❌ مجاز نیست: ماژول A مستقیماً متدهای ماژول B را فراخوانی می‌کند

چرا این مهم است

اتصال مستقیم ماژول‌ها استقلال را کاهش می‌دهد و سیستم را سخت‌تر می‌کند. رویدادها معماری شل‌تر و قابل نگهداری‌تری ایجاد می‌کنند.

4. راهنمایی‌های پیاده‌سازی​

سناریوهای رایج​

ماتریس تصمیم‌گیری​

سناریووضعیتتأثیر
اتصال مستقیم بین انتیتی‌های دو ماژول❌ ممنوعماژولاریتی را نقض می‌کند
فراخوانی مستقیم سرویس از ماژول دیگر⚠️ توصیه نمی‌شودباعث اتصال محکم می‌شود
شلیک رویداد از ماژول A و گوش دادن در ماژول B✅ مجازاتصال شل را ترویج می‌کند
بهترین شیوه

در صورت تردید، رویکرد مبتنی بر رویداد را برای ارتباط بین ماژولی ترجیح دهید.

5. استاندارد Business Events​

تعریف

یک Business Event وقوع معنادار کسب‌وکاری را نمایندگی می‌کند که بخش‌های دیگر سیستم ممکن است به آن علاقه‌مند باشند.

ویژگی‌های کلیدی​

  • معماری شما را برای آینده آماده می‌کند
  • اتصال شل بین ماژول‌ها را امکان‌پذیر می‌کند
  • سیستم را قابل مشاهده‌تر می‌کند
// مثال: شلیک یک business event
class OrderService {
async completeOrder(orderId) {
// منطق کسب‌وکار...
eventBus.publish('order.completed', { orderId, timestamp: Date.now() });
}
}

6. چارچوب تصمیم‌گیری​

چه زمانی از Event Listener ها استفاده کنیم​

✅ استفاده کنید وقتی:
  • بین ماژول‌های مستقل ارتباط برقرار می‌کنید
  • جداسازی مهم‌تر از اتصال مستقیم است
  • چندین جزء نیاز به واکنش به یک رویداد دارند

چه زمانی از Event Listener ها اجتناب کنیم​

❌ اجتناب کنید وقتی:
  • ارتباط در داخل یک ماژول باقی می‌ماند
  • اتصال مستقیم ساده‌تر و قابل نگهداری‌تر است
  • به ارتباط همزمان نیاز دارید

7. راهنمایی‌های نهایی​

نکات کلیدی
  • بازسازی هر event listener درون ماژولی که یافت می‌شود
  • حفظ ارتباط مبتنی بر رویداد بین ماژولی
  • مستندسازی تمام business event ها و اهداف آن‌ها
به یاد داشته باشید

حتی اگر listener فعلی وجود نداشته باشد، شلیک business event ها برای وقایع مهم به حفظ انعطاف‌پذیری برای نیازهای آینده کمک می‌کند.