نظرتون چیه برای رخداد های نرم افزارتون Event بنویسید؟

رخداد های یا همون Event ها تو سیستم های نرم افزاری خ به درد بخوره. حتما اگه برنامه نویس باشید اسم ایونت ها رو خ شنیدید. چون عوض کردن زبان کیبورد انرژی زیادی ازم میگیره و نوشتن ایونت هم یه جوریه از این به بعد مینویسم رخداد شما به بزرگی خودتون برای اینکه اظهار فضل انگلیسی طور نوشتنمو نمیکنم ببخشید.

اون قدیما که داشتم تازه برای جاوا GUI مینوشتم تازه با رخداد ها آشنا شدم. مثلا اینطوری که اگه کاربر رو صفحه رابط کاربری نرم افزار کلیک کرد من از کجا بفهمم چی شده.

بعدا که گذشت دیدم ای دل غافل٬ کل نوشتن این رخداد و مدیریت اون چقد سادس و در عین حال چقد کاربردی. مثلا داشتم برای پروژه دانشگاه بازی انگری بردز رو مینوشتم و دیدم ک چقد رخداد ها بم کمک میکنند. مثلا وقتی پرنده ها به سنگ یا خوکا میخوردن یه رخداد برخورد به اصطلاح پرتاب میکردم و هر کلاسی که براش مهم بود اونو میگرفت و کد خودشو ران میکرد.



این خلاصه خ طولانی شد. بریم سر اصل مطلب. برای نوشتن رخداد ها و اینکه واقعا به رخداد نیاز دارید یا نه باید یکم از فضای برنامه نویسی خارج بشید. اینطوری به قضیه نگاه کنید که واقعا این اتفاقی که میخاید با رویداد نوشتن هندلش کنید یه رویداده؟؟!!

برای مثال تو همون قضیه برخودر پرنده ها با موانع تو بازی انگری بردز. دیدید؟؟؟ خ ساده نبود؟؟؟ آره خوب یه برخورد اتفاق افتاده و یه رویداد شکل گرفته. یا وقتی کاربر روی صفحه کلیک میکنه این عمل کلیک کردنش یه رویداده دگ.


حالا که فهمیدید رویداد چیه بریم بفهمیم چطوری هندل میشه.

برای هندل کردن رویداد ها یه پترن ساده موجوده به اسم Observer pattern. تو این پترن یه اتفاق خ ساده میوفته.

Observer pattern UML
Observer pattern UML

خو اگه یه نگاه خوب به UML بالا کنید همه چی گویاس. مثلا فک کنید شما دارید یه سیستم تحت وب طراحی میکنید و میخاید وقتی کاربر لاگین میکنه یه سری لاگ بندازید. کار خ سادش اینه که یه متد تو مدل همون یوزر وقتی لاگین میکنه بذارید که توش هر کاری دلتون میخاد بکنید. اما راه درستش اینه یه رخداد ایجاد کنید تحت عنوان لاگین یوزر‍‍‍. بعد وقتی یوزر لاگین کرد٬ چون معمولا هم شما٬ یه جا کد مربوط به لاگین رو مینویسید میاید داد میزنید که آهای کلاس هایی که براتون مهمه. یوزر لاگین کرداااا!!!!!.

خوب این داد زدنه تازه اول قضیه هست. برای این که این دادو بزنید و بقیه کلاس ها حتی بفهمن که شما صداتون درومده باید چی کنید؟؟؟ این قسمت دقیقا پیاده سازی همون مکانیزم رخداد ها هست. شما در راحت ترین سناریو میاید یه کلاس میسازید و به هر شکلی مثل استفاده از آرایه یه لیست از کلاس هایی که براشون لاگین شدن یوزر مهمه نگه میدارید. این کلاسا رو به اصطلاح Observer صدا میکنیم. بعد تو همون کلاس یه متد میذارید تحت عنوان RegisterObserver که ورودیش همون آبجکت یا رفرنس به کلاس یا متدی هست که برای لاگین مهمه. ینی همون Observer خودمون.

این متد کارش اینه که این Observer رو بره بریزه تو لیستی که از قبل برای اونا طراحی کرده که همشونو نگه داره.

ممکنه یه جا بخاید یه Observe رو از لیست درارید که دگ براش اون رخداد مث لاگین کاربر مهم نباشه پس یه متد دگ مینویسید که همین کارو میکنه. تو عکس اسمش unregisterObserve هست.

حالا برای اینکه اصلا بتونید داد بزنید که به بقیه Observer ها بگید کاربر لاگین کرده باید یه متد بنویسید مثلا به اسم notifyObservers که کارش اینه دونه دونه همه آبجت های تو لیست یاد شده تو بالا رو صدا کنه و متد مثلا update که قراره ری اکشن اون observer ها به مثلا لاگین شدن کاربر باشه رو ران کنه.

خوب حالا شما تو همه اون Observer اون متد آپدیت رو میذارید و بعد دونه دونه attach یا register میشن به اون کلاسی که قرار بود رخداد رو هندل کنه.

دگ تموم شد. حالا شما اونجا که کاربر لاگین داشت میکرد و میخاستید داد بزنید که آهای هوار این داداشمون لاگین کرده٬ میاید متد notifyObservers رو تو اون کلاسی که کل رخداد ها رو هندل میکرد صدا میکنید.

اتفاقی که قراره بیوفته هم که واضحه.


انشالله تو نوشتار بعدیم از نحوه پیاده سازی رخداد ها تو فریم ورک Yii2 مینویسم.


مرسی. من امینم.
اگه دوست داشتید لایک کنید و برای دوستاتون بفرستید