سلام
متاسفانه به علت مشغله کاری کمی زمان بر شد ولی به بحث اصلی ادامه میدهیم...
رویداد گرایی
هر کلاسی از هر وراثت ، واسط ، شرایط و... میتواند رویداد داشته باشد و اتفاقات و وقایع خود را منتشر کند.
(((
پیاده سازی زیر بنایی یک رویداد در واقع یک مجموعه اشاره گر توابع است.
کدی که قصد گوش دادن به رویداد و مطلع شدن از آن اتفاق را دارد اشاره گر یک تابع نماینده را به فهرست رویداد اضافه میکند.
کلاس اصلی هر وقت تشخیص داد با به جریان انداختن رویداد تمام توابع نماینده را اجرا میکند
)))
هر رویداد یک "امضا تابعی" خاص خود دارد.
(امضا تابع: نوع و ترتیب پارامترهای ورودی یک تابع)
==============
مثال عملی برای درک بهتر کاربرد وسیع این امکان:
به عنوان نمونه حتماً در WinForm از رویداد Click دکمه ها با امضای object, EventArgs استفاده کرده اید.
این رویداد را کلاس Button هرگاه تشخیص دهد کلیک شده به جریان می اندازد و باعث میشود، تمام توابع نماینده گوش دهنده اجرا شوند. گرچه احتمالاً شما معمولاً برای هر رویداد فقط یک تابع نماینده داشته اید ولی در واقع محودیتی وجود ندارد.
در بحث لایه بندی هم لاس ها از لایه های مختلف میتوانند به رویدادهای یک دیگر گوش دهند...
>>> یک مثال عملی جالب تر در انتهای بحث با یک شبه کد بیان شده است.
==============
پیاده سازی:
اولین مطلب قبل بحث میتواند تایین امضای یک رویداد باشد که با کمک Delegate ها انجام میشود.
(((
Delegate ها اشاره گرهای توابع در دات نت هستند و پرداختن به انها خود بحثی مجزا و گفتاری بسیار می طلبد، دوستان برای اطلاعات بیشتر میتوانند به کتاب های موجود و یا MSDN مراجعه کنند.
)))
دات نت یکسری Delegate آماده دارد مثل System.EventHandler و در دات نت سه System.Action و System.Func که بسیار کاربردی هستند و... و...
بعنوان نمونه EventHandler همان delegate آشنای امضای object, EventArgs است که در WinForm به کرات به ان گوش میدهیم!
تعریف یک رویداد با امضای object, EventArgs :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
از لحاظ استفاده کاربردی میتوان گفت هر سه شکل تعریف فوق برابر هستند و خیلی تفاوتی برای نحوه استفاده ندارند
در واقع مهم "امضای تابع" است که در هر سه مورد فوق بطور مستقیم و غیر مستقیم، امضا را روی دو آرگومان object, EventArgs گذاشته ایم، نتیجتاً عملاً سه شکل فوق یک عمل یکسان انجام میدهند.
به جریان انداختن رویداد (در کلاس مالک رویداد):
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
گوش دادن به یک رویداد در کدی که از کلاس ما استفاده میکند:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یا حتی سینتکس زیر برای کدهای کوچک تر
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بخش AnyCode همان جایی است که کدی خواهید نوشت که در قبال رخ دادن رویداد باید اجرا شود.
قطع ارتباط و عدم گوش دادن به رویداد:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
=====
مثال ما در این پست برای کلاس ناهمزمان با پشتیبانی رویداد پیشرفت کار:
میتوان کلاسی برای کپی فایل ها، فشرده سازی، بروزرسانی نرم افزار، انتقال اطلاعات دیتابیس، پشتیبان گیری اطلاعات و... در لایه های پایین نوشت بطوریکه مستقل از لایه UI و تکنولوژی آن (WinForm,Wpf, Web, Service و...) باشد. ولی با این وجود این کدها بطور طبیعی نیاز دارند تا حین کارکرد مواردی را به لایه UI یا کاربر گزارش دهند از جمله درصد پیشرفت کار، عملیات جاری در حال انجام و... و تصمیم نمایش و عدم نمایش و طریقه نمایش را بر عهده لایه UI بگذارند.
کد کلاس اصلی در لایه پایین
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد لایه UI که در واقع مستقل از مکانیزم لایه پایین است و به راحتی میتوان آن را مطابق الگوی Wpf یا ASP.Net و... کرد یا در WinService باشد که اصلاً گزارش دادن این اطلاعات به کاربر برایش مهم نباشد و به رویداد مربوطه گوش ندهد و...
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
==============
مطلب اول:
لازم میدانم که حتماً بیان کنم شیوه دیگری از رویداد گرایی وجود دارد که بیش از رویداد گرایی با نام Callback شناخته میشود که در اصل بسیار مشابه رویدادگرایی بیان شده فوق است و طی آن میتوانید تابع نماینده ای برای ارتباط با کد خودتان به لایه پایین تحویل دهید تا با آن بتواند کد لایه بالاتر را (معمولاً در حین انجام کار یا پایان کار) اجرا نماید.
مطلب دوم:
تمام موارد فوق عین در VB.Net هم قابل پیاده سازی و انجام است، طبیعتاً سینتکس نوشتاری خودش را دارد.
حقیقتش دیگر حوصله کافی نوشتن کدهای VB.Net اش را هم نداشتم ولی اگر دوستان با هر بخشی از ان در VB.Net مشکلی داشتند در تالار مطرح بفرمایند، سایر دوستان عزیز و همچنین خودم انشاا... پاسخ خواهیم داد.
مطلب آخر:
در آخر لازم میدانم متذکر شوم که مطالب فوق فقط سرنخ های این کار بوده و شاید 33% مطالب بیان شده و جزئیات و قابلیت های متنوع دیگری در این حیطه وجود دارد که دوستان برای تکمیل بحث و قابلیت های این حیطه میتوانند به کتوب و MSDN مراجعه کنند.
==============
موفق باشید.