1
00:00.110 --> 00:03.050
بسیار خب، بیایید آنچه رو که تو ویدیوی آخر یاد گرفتیم، به کار ببندیم.

2
00:03.050 --> 00:06.920
بیایید اون رو روی یک **temperature change handler** اعمال کنیم.

3
00:06.920 --> 00:10.040
یعنی ابزاری که تغییرات دما رو مدیریت می‌کنه.

4
00:10.040 --> 00:19.370
و فرض کنید وقتی به یک دمای مشخص، مثلاً 30 درجه سانتی‌گراد، می‌رسیم، **temperature event** ما **trigger** می‌شه (راه می‌افته).

5
00:19.370 --> 00:24.020
که می‌گه: هی، **event** به آستانه (threshold) رسیده یا از اون عبور کرده.

6
00:24.020 --> 00:35.890
بنابراین، من یک **public delegate** ایجاد می‌کنم که **void** (هیچ چیز) برمی‌گردونه. و این رو **TemperatureChangeHandler** صدا می‌زنم. بسیار خب.

7
00:35.890 --> 00:38.770
و فقط پیام رو چاپ می‌کنه.

8
00:38.800 --> 00:42.310
خب، البته که نیازی به بدنه نداره.

9
042.310 --> 00:49.060
و بعد یک **class** اینجا داریم، **public class TemperatureMonitor**، اوکی.

10
00:49.120 --> 00:52.900
این **class** یک وظیفه داره و اون هم **monitor** کردن (نظارت بر) دماست.

11
00:52.900 --> 01:06.950
پس اینجا من یک **event** خواهم داشت که از **TemperatureChangeHandler** من استفاده می‌کنه. و البته یاد گرفتیم که باید اون رو **OnTemperatureChanged** صدا بزنیم. خب، **Changed**.

12
01:06.950 --> 01:14.780
هر وقت دما تغییر کنه، اون وقت می‌خوایم **event** رو **raise** (راه بیندازیم). پس اون موقعی هست که می‌خوایم کد اون **event** رو اجرا کنیم، اوکی؟

13
01:14.780 --> 01:25.000
بعدش، یک **private int** برای **temperature** خواهم داشت و یک **property** که اون هم **int** هست و **Temperature** نامیده می‌شه.

14
01:25.000 --> 01:35.440
و وقتی می‌خوایم **get** (دریافت)ش کنیم، فقط **underscore temperature** رو برمی‌گردونه. و وقتی می‌خوایم **set** (تنظیم)ش کنیم، کمی پیچیده‌تر خواهد بود، اوکی؟

15
01:35.440 --> 01:40.810
پس در **setter** هست که می‌خوایم یک بررسی انجام بدیم.

16
01:40.810 --> 01:49.010
پس بررسی می‌کنیم که آیا دما یک مقدار مشخصی هست یا نه. اگه اینطور بود، شروع به **trigger** کردن **event** می‌کنه.

17
01:49.010 --> 01:57.230
پس بیایید **value** رو برای **temperature** تنظیم کنیم. و بعد بررسی می‌کنیم که آیا **temperature** قراره مثلاً بزرگ‌تر از 30 باشه.

18
01:57.230 --> 02:07.300
و حالا می‌تونید اون رو به **Fahrenheit** تبدیل کنید. فکر می‌کنم حدود 95 یا 90 و خورده‌ای باشه. و اونجاست که می‌خوایم **event** رو **raise** کنیم. **Raise event**.

19
02:07.300 --> 02:28.310
خب، البته ما باید **event**ای رو که می‌خوایم اجرا کنیم، آماده کنیم. پس کدی که می‌خوایم اجرا بشه، داخل این **protected virtual void RaiseTemperatureChangedEvent** خواهد بود.

20
02:28.310 --> 02:40.340
که فقط یک **message** می‌گیره و وقتی **OnTemperatureChanged** اتفاق افتاد، می‌خوایم با اون **message** **invoke** (فراخوانی)ش کنیم. اوکی، پس این شبیه چیزیه که دفعه قبل داشتیم.

21
02:40.340 --> 03:03.610
پس حالا این بار این **event** ما **OnTemperatureChanged** هست و حالا انتظار داریم که صفر باشه. به خاطر همینه که علامت سوال رو اضافه می‌کنیم و بعد تمام **listener**ها رو **invoke** می‌کنیم. پس تمام **subscriber**ها، ما اون متدها رو **invoke** می‌کنیم. پس داریم اون متدها رو صدا می‌زنیم و **message** رو پاس می‌دیم، اوکی؟

22
03:03.610 --> 03:20.580
پس اینجا وقتی **event** رو **raise** می‌کنیم، اونجاست که **RaiseTemperatureChangedEvent** رو با چیزی مثل: **Temperature is above threshold** (دما بالاتر از آستانه است) **raise** می‌کنیم، برای مثال. خب، پس حالا که این رو داریم، این **delegate** و **event** ماست که آماده کردیم.

23
03:20.580 --> 03:25.950
حالا به **subscriber** (مشترک)مون نیاز داریم.

24
03:25.950 --> 03:28.380
خب **subscriber** ما کی می‌تونه باشه؟

25
03:28.380 --> 03:30.570
بذارید بگیم یک **TemperatureAlert**.

26
03:30.570 --> 03:39.750
پس **public class TemperatureAlert**. خب، البته ممکنه **class**های زیادی باشن که در این **event**ها **subscribe** بشن. اما در این حالت، **TemperatureAlert** ما خواهد بود.

27
03:39.750 --> 03:57.580
و اینجا من فقط می‌گم **public void OnTemperatureChanged**. **message** رو پاس می‌دم. می‌خوام روی **console** بنویسم: **Alert: ** (اعلان:) و بعد هرچیزی که **message** هست، اوکی؟

28
03:57.580 --> 03:59.590
حالا بیایید از این تو برنامه‌مون استفاده کنیم.

29
03:59.590 --> 04:08.310
پس تو برنامه اصلی، بیایید **TemperatureMonitor**مون رو بسازیم. اسمش رو می‌ذاریم **monitor**، **new TemperatureMonitor**.

30
04:08.310 --> 04:13.950
و بعد بیایید **TemperatureAlert** رو هم بسازیم. اسمش رو می‌ذاریم **alert**، **new TemperatureAlert**.

31
04:13.950 --> 04:25.740
و بعد می‌تونیم به **monitor.OnTemperatureChanged** **event**مون، **alert.OnTemperatureChanged** رو اضافه کنیم.

32
04:25.740 --> 04:39.130
بنابراین حالا می‌تونیم جلو بریم و فقط مقدار **monitored temperature** رو مثلاً 20 بذاریم به صورت پیش‌فرض. و بعد این هیچ چیزی رو **trigger** نمی‌کنه، اوکی؟

33
04:39.160 --> 04:40.930
این **event** رو **trigger** نخواهد کرد.

34
04:40.960 --> 04:44.410
حالا بیایید از کاربر درخواست ورودی کنیم.

35
04:44.410 --> 04:53.910
پس **monitored temperature** هرچیزی خواهد بود که کاربر وارد می‌کنه. پس **console.ReadLine**، هرچیزی که کاربر وارد می‌کنه.

36
04:53.910 --> 05:00.330
پس می‌خوایم اون رو به یک **int** **parse** کنیم، **int.Parse**. و بعد هرچیزی که کاربر وارد کرده رو **parse** می‌کنیم.

37
05:00.330 --> 05:04.320
خب البته می‌تونستیم از **try** و غیره استفاده کنیم. این بار ساده نگهش می‌داریم.

38
05:04.320 --> 05:16.960
و بیایید بذاریم کاربر بدونه: **Please enter a temperature** (لطفا یک دما یا دما را وارد کنید). خب البته این دما می‌تونه از سنسورهایی که داریم یا یک **API** که ازش می‌خونیم و غیره بیاد.

39
05:19.480 --> 05:20.260
اوکی.

40
05:20.260 --> 05:25.300
پس حالا بیایید جلو بریم و اپلیکیشن کوچیکمون رو اینجا اجرا کنیم.

41
05:25.300 --> 05:28.270
و می‌گه: لطفا دما را وارد کنید.

42
05:28.270 --> 05:31.570
بذارید 25 رو وارد کنیم. هیچ اتفاقی نمی‌افته، اوکی؟

43
05:31.570 --> 05:35.320
پس تغییر زیادی ندادیم چون دما به آستانه نرسید.

44
05:35.320 --> 05:37.450
بذارید دوباره 30 رو بزنیم.

45
05:37.450 --> 05:38.860
حالا هیچ اتفاقی نمی‌افته.

46
05:38.860 --> 05:41.940
بذارید دوباره اجراش کنیم. و این بار بذارید بگیم 31 هست.

47
05:41.940 --> 05:43.320
و بعد **alert** رو می‌گیریم.

48
05:43.320 --> 05:45.750
می‌گه: **Alert: Temperature is above threshold**.

49
05:45.750 --> 05:53.700
پس تو این حالت چیزی که اتفاق افتاد اینه که ما **property**مون رو داریم که وقتی **set** می‌شه، مقداری **custom logic** (منطق سفارشی) داره.

50
05:53.700 --> 05:59.160
پس حالا دلیل خیلی خوب دیگه‌ای هم می‌بینید که چرا **property**ها اینقدر ارزشمند هستن.

51
05:59.160 --> 06:06.830
بنابراین ما این **private field temperature** رو داریم و این **public property** رو داریم. و حالا می‌گیم: اوکی، اگه می‌خوای **get**ش کنی، فقط **get**ش کن.

52
06:06.830 --> 06:10.100
اما اگه می‌خوای **set**ش کنی، یک سری قوانین وجود داره. اوکی.

53
06:10.100 --> 06:12.200
اول از همه می‌تونی **set**ش کنی، من اهمیت نمی‌دم.

54
06:12.200 --> 06:18.770
اما اگه اون رو بالاتر از 30 **set** کنی، من قراره یک **event** **raise** کنم. و قراره کدوم **event** رو **raise** کنم؟

55
06:18.770 --> 06:23.000
خب، قراره این **event** رو **raise** کنم. پس وقتی این **event** اتفاق بیفته، چی می‌شه؟

56
06:23.000 --> 06:33.600
خب، اساساً من فقط تمام **subscriber**ها رو **invoke** می‌کنم تا بهشون خبر بدم: بچه‌ها، **event** **raise** شده. کار خودتون رو انجام بدید، هرچیزی که به عنوان منطق تنظیم کردید.

57
06:33.600 --> 06:44.220
و حالا ما این **TemperatureAlert** رو داریم که این **alert** رو تنظیم می‌کنه. اما تصور کنید که چیزی شبیه این باشه: اوکی، دمای اتاق شما خیلی گرم می‌شه و ممکنه چندین **listener** وجود داشته باشن.

58
06:44.220 --> 07:04.100
ممکنه، برای مثال، یک سیستم خنک‌کننده خودکار روشن بشه، یا ممکنه یک پیام خودکار به گوشی شما ارسال بشه که می‌گه: هی، اتاقت گرمه، اتاقت رو خنک کن، یا چیزی شبیه اون، و همه این چیزهای مختلف که بعد **event** رو **trigger** می‌کنن، یا به نوعی، این اجرا رو **trigger** می‌کنن، اونها **listener**های اون **event** هستن.

59
07:04.100 --> 07:07.490
اونها **event** رو **trigger** نمی‌کنن.

60
07:07.490 --> 07:16.610
چیزی که **event** رو **trigger** می‌کنه، هر اطلاعاتیه که دما رو به **TemperatureMonitor** ما می‌فرسته.

61
07:16.610 --> 07:23.520
**TemperatureMonitor** کد خنک کردن اتاق شما یا ارسال پیام به شما رو اجرا نمی‌کنه.

62
07:23.670 --> 07:31.860
**TemperatureMonitor** فقط یک کار انجام می‌ده. اون دما رو **monitor** می‌کنه و اگه اتفاق خاصی بیفته، یک **event** **raise** می‌کنه. همین.

63
07:31.890 --> 07:45.410
ما می‌تونستیم همچنین چیزی شبیه این بگیم: فرض کنید دما زیر 20 درجه سانتی‌گراد هست، که معمولاً دمای اتاقه. می‌تونه 21، 22 باشه، بستگی داره. پس اگه دما زیر 21 بود، یک **event** دیگه **raise** کن.

64
07:45.410 --> 07:53.660
و حالا می‌تونید بگید: دما رو با روشن کردن سیستم گرمایشی یا چیزی شبیه اون، بهتر یا افزایش بده.

65
07:53.660 --> 08:05.630
برای اون، ما احتمالاً یک **event** دیگه ایجاد می‌کنیم تا اونهایی که به دمای زیر 20 اهمیت می‌دن، به اون گوش بدن و کار خودشون رو انجام بدن. اوکی.

66
08:05.640 --> 08:06.420
خوب.

67
08:06.420 --> 08:08.280
پس این مورد شماره یک بود.

68
08:08.280 --> 08:12.840
حالا بیایید به عنوان مورد بعدی، یک سیستم **stock price alert** (هشدار قیمت سهام) داشته باشیم.

69
08:12.840 --> 08:16.830
و فکر می‌کنم می‌تونیم از اون به عنوان یک چالش کوچیک برای شما استفاده کنیم.

70
08:16.830 --> 08:27.990
اوکی. بنابراین شما باید از همون اصول استفاده کنید که اینجا داریم. اما این بار با تغییر قیمت سهام یا سیستم هشدار، اوکی؟

71
08:27.990 --> 08:30.840
لذت ببرید. موفق باشید و تو ویدیوی بعدی می‌بینمتون.