برنامه‌نویسی رویدادمحور EventDriven چیست

خلاصه
1404/10/18

پارادایم **برنامه‌نویسی رویدادمحور (Event-Driven Programming - EDP)** یک سبک برنامه‌نویسی است که در آن جریان برنامه توسط **رویدادها** (Events) تعیین می‌شود؛ مانند کلیک ماوس، در

برنامه‌نویسی رویدادمحور EventDriven چیست

پارادایم **برنامه‌نویسی رویدادمحور (Event-Driven Programming - EDP)** یک سبک برنامه‌نویسی است که در آن جریان برنامه توسط **رویدادها** (Events) تعیین می‌شود؛ مانند کلیک ماوس، دریافت داده از شبکه، فشردن یک کلید یا پایان یک تایمر.

در این سبک، برنامه منتظر می‌ماند تا اتفاقی بیفتد (رویداد رخ دهد)، سپس در پاسخ به آن، کد مشخصی را اجرا می‌کند.

در ادامه مفاهیم، اجزا و نحوه کار آن را به زبان ساده توضیح می‌دهم:

---

### ۱. مفهوم اصلی: "صدور وقایع" (Publish/Subscribe)
برخلاف برنامه‌های خطی که از بالا به پایین اجرا می‌شوند، برنامه‌های رویدادمحور مبتنی بر **یک حلقه انتظار (Loop)** هستند:

1. **منتظر ماندن:** برنامه اجرا می‌شود و منتظر می‌ماند (Idle).
2. **رخ دادن رویداد:** یک اتفاق خارجی یا داخلی می‌افتد.
3. **شکار رویداد (Event Handling):** برنامه متوجه رویداد می‌شود.
4. **فراخوانی Callback:** تابع یا کدی که از قبل به آن رویداد متصل شده، اجرا می‌شود.

### ۲. اجزای کلیدی

برای درک بهتر، این ۴ مفهوم را بشناسید:

* **رویداد (Event):** هر اتفاقی که قابل تشخیص باشد (مثلاً `click`، `keypress`، `dataReceived`).
* ** Listener (شنونده) یا Handler:** تابعی که می‌گوید: "اگر این رویداد اتفاق افتاد، این کار را انجام بده". مثلاً: `button.addEventListener('click', function)`
* **Emitter (صادر کننده):** منبعی که رویداد را تولید می‌کند (مثل مرورگر، سرور، سخت‌افزار).
* **Queue (صف رویداد):** رویدادها در یک صف قرار می‌گیرند تا به ترتیب پردازش شوند.

---

### ۳. مثال ساده (زبان جاوااسکرپت)

این ساده‌ترین مثال در وب است. ما به دکمه می‌گوییم: "گوش کن، اگر کلیک شدی، پیام بده".

```javascript
// ۱. انتخاب المنت
const button = document.getElementById('myButton');

// ۲. تعریف تابع Handler (برنامه واکنش‌گرا)
function handleClick(event) {
console.log("دکمه کلیک شد!");
console.log("مختصات کلیک:", event.clientX, event.clientY);
}

// ۳. ثبت رویداد (آویزان کردن رویداد)
// حالا برنامه کارش را می‌کند و منتظر می‌ماند.
button.addEventListener('click', handleClick);
```
**نتیجه:** برنامه خطی اجرا نمی‌شود. اگر دکمه کلیک نشود، تابع `handleClick` هرگز اجرا نمی‌شود.

---

### ۴. مقایسه با برنامه‌نویسی رویه‌ای (Imperative)

* **رویه‌ای (خطی):** فکر کنید یک ربات خط مونتاژ هستید. خط ۱ را انجام بده، خط ۲ را انجام بده، خط ۳ را انجام بده. (مثل یک فرمول ریاضی).
* **رویدادمحور (واکنش‌گرا):** فکر کنید یک نگهبان هستید. کاری نمی‌کنید مگر اینکه کسی زنگ بزند یا اتفاقی بیفتد.

### ۵. کاربردهای مهم

تقریباً تمام نرم‌افزارهای مدرن امروزی از این پارادایم استفاده می‌کنند:

* **رابط کاربری (GUI):** کلیک‌ها، درگ و دراپ‌ها، تاچ‌های موبایل (همه رویداد هستند).
* **Node.js:** محیط جاوااسکرپت سروری که بر اساس رویدادها کار می‌کند (غیرهمزمان/Asynchronous). وقتی فایلی خوانده می‌شود یا درخواستی به دیتابیس می‌رود، برنامه معطل نمی‌ماند و با رویداد بازمی‌گردد.
* **میکروکنترلرها (IoT):** سنسور تشخیص حرکت یا دما که وقتی مقداری تغییر می‌کند، یک سیگنال (رویداد) می‌فرستد.
* **پیام‌رسان‌ها (Message Brokers):** سیستم‌هایی مثل Kafka یا RabbitMQ که اطلاعات را بین سرویس‌ها جابجا می‌کنند.

---

### ۶. مزایا و معایب

**مزایا:**
* **رابط کاربرپسند:** ایجاد رابط‌های گرافیکی با آن بسیار آسان است.
* **کارایی در I/O:** برای عملیات ورودی/خروجی (مثل خواندن فایل یا اتصال به شبکه) عالی است چون برنامه هرز نمی‌رود.
* **انعطاف‌پذیری:** اضافه کردن قابلیت‌های جدید بدون تغییر ساختار اصلی برنامه.

**معایب:**
* **کنترل سخت‌تر:** دنبال کردن جریان اجرای برنامه دشوار است (کد در جاهای مختلفی پرش می‌زند).
* **Call Stack عمقی:** مدیریت خطاها (Error Handling) می‌تواند پیچیده باشد.
* **Race Condition:** اگر دو رویداد همزمان بخواهند به یک منبع مشترک دسترسی داشته باشند، ممکن است تداخل ایجاد شود.

### خلاصه
برنامه‌نویسی رویدادمحور یعنی **"نمایش را اجرا کن و منتظر تماشاچی (رویداد) باش"**. به جای اینکه خودت دیالوگ بگویی، صبر می‌کنی تا تماشاچی سوالی بپرسد یا واکنشی نشان دهد و تو در همان لحظه پاسخ می‌دهی.