
1
00:00.140 --> 00:04.520
اوکی، خب حالا که دو نوع دیگه از دیپندِنسی اینجِکشِن (dependency injection) رو دیدیم،

2
00:04.520 --> 00:06.860
بریم سراغ نوع سوم، که اینتِرفِیس اینجکشن هست.

3
00:06.860 --> 00:14.030
خب، این کار شامل ارائه دیپندِنسی‌ها (dependencies) از طریق اینتِرفِیسی (interface) هست که اون کلاس، پیاده‌سازیش می‌کنه.

4
00:14.030 --> 00:19.640
پس خود اینتِرفِیس متدها رو برای سِت کردن دیپندِنسی‌ها تعریف می‌کنه.

5
00:19.640 --> 00:20.120
بسیار خب.

6
00:20.120 --> 00:30.560
خب بیاید بریم جلو و یک public interface ایجاد کنیم که من اسمش رو می‌ذارم IToolUser، اوکی؟

7
00:00:30.560 --> 00:00:31.910
چه اسم باحالی.

8
00:00:31.910 --> 00:00:34.820
می‌بینید که اینجا حرف I بزرگه.

9
00:00:34.820 --> 00:00:36.740
حرف دوم هم همین‌طور.

10
00:00:36.740 --> 00:00:46.130
پس می‌گیم که هر وقت می‌خواید از یک Tool User مثل سازنده (Builder) استفاده کنید، باید چکش (Hammer) رو سِت کنید.

11
00:00:46.130 --> 00:00:46.880
پس می‌گیم:

12
00:00:46.880 --> 00:00:53.120
"یه چکش به من بده" و باید اره (Saw) رو هم سِت کنید.

13
00:00:53.120 --> 00:00:55.490
و می‌گیم: "یه اره به من بده".

14
00:00:55.490 --> 01:00.890
خب، چکش هنوز کارهایی رو انجام می‌ده.

15
01:00.890 --> 01:05.690
اره هم فقط داره استفاده می‌شه، اما سازنده (Builder) هست که در اون تغییر ایجاد می‌شه.

16
01:05.690 --> 01:14.300
سازنده حالا یک IToolUser هست، پس اون حالا یک Tool Userه، به این معنی که باید چکش رو سِت کنه،

17
01:14.300 --> 01:19.520
و باید اره رو هم سِت کنه قبل از اینکه بتونه خونه رو بسازه.

18
01:19.520 --> 01:22.040
یا حداقل متدهای اون باید وجود داشته باشند.

19
01:22.040 --> 01:27.200
خب می‌تونیم برگردیم به اینکه این‌ها فیلدهای (fields) خصوصی (private) باشند.

20
01:27.200 --> 01:30.650
پس، private hammer underscore hammer.

21
01:30.650 --> 01:36.620
و بیاید یک underscore اضافه کنیم چون خصوصی هست و private saw underscore saw.

22
01:36.620 --> 01:41.780
خب مشخصه وقتی از چکش استفاده می‌کنیم، باید بگیم hammer use.

23
01:41.780 --> 01:48.380
و وقتی از اره استفاده می‌کنیم، باید بگیم underscore saw dot use.

24
01:48.380 --> 01:54.350
پس حالا ما همچنان باید اون دو تا متدی رو پیاده‌سازی کنیم که در اون‌ها چکش و اره رو سِت می‌کنیم.

25
01:54.350 --> 01:57.470
پس بریم روشون هاور (hover) کنیم و راه‌حل‌های بالقوه رو ببینیم.

26
01:57.470 --> 01:59.420
و بگیم "پیاده‌سازی اینترفیس" (implement the interface).

27
01:59.420 --> 02:02.600
و کاری که انجام می‌ده اینه که اون دو تا متد رو برامون ایجاد می‌کنه.

28
02:02.600 --> 02:08.180
پس set hammer، که در اون به یک چکش نیاز داریم و کاری که قراره انجام بدیم اینه که اون چکش رو برداریم

29
02:08.180 --> 02:10.490
و داخل underscore hammer ذخیره‌اش کنیم.

30
02:10.490 --> 02:17.600
پس چیزی که داریم می‌گیم اینه که چکشی رو که به من می‌دهید، به عنوان چکشِ اون سازنده، برای استفاده سِت کنید.

31
02:17.600 --> 02:20.630
پس سازنده هر وقت set hammer سِت بشه، یک چکش می‌گیره.

32
02:20.630 --> 02:23.360
و بعد همین کار رو با اره انجام می‌دیم.

33
02:23.360 --> 02:28.220
پس هر وقت set saw استفاده می‌شه، فقط اره رو به من بده.

34
02:28.220 --> 02:34.310
بنابراین حالا به جای استفاده از سِتِرها (setters)، داریم از اینتِرفِیس‌ها استفاده می‌کنیم.

35
02:34.310 --> 02:39.440
البته می‌تونید اون‌ها رو هم سِتِر صدا کنید، اما داریم با یک معماری پیچیده‌تر ازش استفاده می‌کنیم.

36
02:39.440 --> 02:43.970
این به ما اجازه می‌ده حالا Tool Userهای بیشتری ایجاد کنیم.

37
02:43.970 --> 02:49.370
پس فقط سازنده (Builder) نیست که می‌تونه از این ابزارها استفاده کنه، بلکه شخص دیگه‌ای هم می‌تونه، مثل

38
02:49.370 --> 02:52.280
سازنده‌مون و شاید خانه‌ساز، یا هر چیز دیگه‌ای.

39
02:52.280 --> 02:55.910
اما بعدش یک مکانیک (mechanic) هم داریم، اوکی؟

40
02:55.910 --> 03:01.940
و مکانیک یک سازنده نیست، اما شاید هنوز هم بتونه از اره و چکش استفاده کنه.

41
03:01.940 --> 03:08.450
و در اون صورت، ما همچنان باید اون‌ها رو بهشون بدیم، پس می‌تونیم از set saw برای سِت کردن اره استفاده کنیم.
42
03:08.450 --> 03:12.770
و می‌تونیم از builder set hammer برای سِت کردن چکش استفاده کنیم.

43
03:12.770 --> 03:17.570
پس اینجا dot set hammer و چکش رو پاس (pass) می‌دیم.

44
03:17.570 --> 03:19.670
و کدوم اره و چکشی رو داریم پاس می‌دیم؟

45
03:19.820 --> 03:23.060
بذارید در واقع ترتیبی رو که قبلاً داشتیم حفظ کنم.

46
03:23.060 --> 03:27.470
خب ما چکشی رو که اینجا ایجاد کردیم پاس می‌دیم، یعنی دیپندِنسی.

47
03:27.470 --> 03:29.120
و همین‌طور برای اره.

48
03:29.120 --> 03:32.390
پس ما اون دو تا رو به set hammer و set saw پاس می‌دیم.

49
03:32.390 --> 03:33.950
و حالا می‌تونیم از اون‌ها استفاده کنیم.

50
03:33.950 --> 03:37.190
و می‌بینیم "میخ زدن با چکش"، "بریدن چوب با اره"، "خانه ساخته شد".

51
03:37.190 --> 03:45.350
پس می‌بینید که روش‌های مختلف زیادی وجود داره برای اینکه دیپندِنسی اینجکشن رو اجرا کنید، اوکی؟

52
03:45.350 --> 03:47.420
خب حالا بیاید سعی کنیم این رو کمی بهتر درک کنیم.

53
03:47.420 --> 03:53.750
خب، اینتِرفِیس اینجکشن، در این مورد، کلاس سازنده (builder) اینتِرفِیس IToolUser رو پیاده‌سازی می‌کنه که

54
03:53.750 --> 03:56.900
متدهایی رو برای سِت کردن دیپندِنسی‌هاش تعریف می‌کنه.

55
03:57.110 --> 03:59.630
مزیت این کار اینه که به ما انعطاف‌پذیری می‌ده.

56
03:59.630 --> 04:05.210
پس دیپندِنسی‌ها از طریق متدهای اینتِرفِیس تزریق (inject) می‌شن، و به کلاس اجازه می‌دن دیپندِنسی‌هاش رو

57
04:05.210 --> 04:07.430
از یک منبع خارجی دریافت کنه.

58
04:07.430 --> 04:10.490
حالا بیاید سه مثال رو که داشتیم با هم مقایسه کنیم.

59
04:10.490 --> 04:13.160
خب ما اینجکشن‌های مختلف رو داشتیم، درسته؟

60
04:13.160 --> 04:15.890
پس بیاید متدهای اینجکشن رو مقایسه کنیم.

61
04:15.890 --> 04:18.290
ما Constructor Injection رو داریم.

62
04:18.290 --> 04:19.700
مزایای اون اینه که تضمین می‌کنه.

63
04:19.700 --> 04:24.200
همه دیپندِنسی‌ها در زمان ساخت آبجکت (object) ارائه می‌شن، که این خیلی خوبه.

64
04:24.200 --> 04:26.000
اما معایبی هم داره.

65
04:26.000 --> 04:29.870
دیپندِنسی‌ها بعد از ساخت آبجکت قابل تغییر نیستند.

66
04:29.870 --> 04:31.700
بعد Setter Injection رو داریم.

67
04:31.700 --> 04:36.410
مزیتش اینه که اجازه می‌ده دیپندِنسی‌ها بعد از ساخت آبجکت تغییر کنند.

68
04:36.410 --> 04:37.580
معایبش اینه که.

69
04:37.580 --> 04:44.390
ممکنه دیپندِنسی‌ها در زمان ساخت آبجکت سِت نشوند، که منجر به استثناهای احتمالی Null Reference می‌شه،

70
04:44.390 --> 04:45.320
همونطور که دیدیم.

71
04:45.320 --> 04:45.680
درسته؟

72
04:45.680 --> 04:53.300
شروع به اجرا کردیم و دیدیم که کِرَش (crash) کرد چون دیپندِنسی‌های مختلفی رو که مورد نیاز بودند، سِت نکرده بودیم.

73
04:53.300 --> 04:53.960
بله.

74
04:53.960 --> 04:57.170
بعد Interface Injection رو داریم که همین الان تمومش کردیم.

75
04:57.170 --> 04:59.840
مزایاش اینه که یک قرارداد واضح رو برای.

76
04:59.960 --> 05:03.170
برای تزریق دیپندِنسی‌ها از طریق اینتِرفِیس‌ها ارائه می‌ده.

77
05:03.170 --> 05:06.020
پس تمام مزایای اینتِرفِیس‌ها اینجا وجود دارند.

78
05:06.020 --> 05:12.380
اما معایبش اینه که نیاز به تعریف اینتِرفِیس‌های اضافی برای سِت کردن دیپندِنسی‌ها داره.

79
05:12.380 --> 05:19.130
پس نتیجه‌گیری: با استفاده از مثال سازنده (Builder)، سه روش دیپندِنسی اینجکشن رو نشون دادیم.

80
05:19.130 --> 05:24.470
Constructor Injection که در اون دیپندِنسی‌ها از طریق کانسترَکتور (constructor) ارائه می‌شن، Setter Injection که در اون

81
05:24.470 --> 05:30.800
دیپندِنسی‌ها از طریق پراپرتی‌ها (properties) یا متدهای عمومی (public methods) سِت می‌شن، و Interface Injection که در اون دیپندِنسی‌ها

82
05:30.800 --> 05:33.980
از طریق متدهای تعریف شده در یک اینتِرفِیس تزریق می‌شن.

83
05:33.980 --> 05:38.180
هر روشی مزایا و معایب خاص خودش رو داره و درکِ

84
05:38.180 --> 05:42.710
این‌ها می‌تونه بهتون کمک کنه بهترین رویکرد رو برای مورد استفاده خاص خودتون انتخاب کنید.

85
05:42.710 --> 05:48.830
با استفاده از دیپندِنسی اینجکشن، می‌تونید کدهای ماژولارتر، انعطاف‌پذیرتر و قابل تست‌تری ایجاد کنید.