

WEBVTT

00:00.080 --> 00:00.800
خوش آمدید.

00:00.800 --> 00:06.740
در این ویدیو، ما به بررسی دو دلیل اصلی استفاده از رابط‌ها خواهیم پرداخت.

00:06.740 --> 00:11.570
و آن‌ها جداسازی کد و افزایش قابلیت تست‌پذیری هستند.

00:11.570 --> 00:15.620
پس بیایید ببینیم این کجا مفید خواهد بود.

00:15.620 --> 00:22.910
این در برنامه‌های بزرگ مفید است که در آن اجزا باید به صورت جداگانه با یکدیگر تعامل داشته باشند.

00:22.910 --> 00:23.480
چرا این مهم است؟

00:23.480 --> 00:31.220
خوب، رابط‌ها به جداسازی کد کمک می‌کنند با کاهش وابستگی‌ها بین کلاس‌ها.

00:31.220 --> 00:34.610
این باعث می‌شود کد آسان‌تر تست و نگهداری شود.

00:34.610 --> 00:35.990
و چه زمانی از آن استفاده می‌کنید؟

00:35.990 --> 00:43.520
خوب، شما از رابط‌ها زمانی استفاده می‌کنید که بخواهید جزئیات پیاده‌سازی را از قرارداد رابط جدا کنید،

00:43.520 --> 00:47.420
که به ویژه در سیستم‌های بزرگ و پیچیده مفید است.

00:47.420 --> 00:50.660
پس ما یک مثال دنیای واقعی خواهیم ساخت.

00:50.660 --> 00:53.960
اما این به وضوح یک برنامه بسیار ساده کوچک خواهد بود.

00:53.960 --> 00:59.300
این واقعاً منطقی نخواهد بود اگر شما یک برنامه کوچک با شاید

00:59.300 --> 01:02.420
دوازده کلاس یا کمتر بسازید.

01:02.420 --> 01:07.610
اما وقتی بیش از آن دارید، واقعاً استفاده از رابط‌ها بسیار منطقی‌تر می‌شود.

01:07.610 --> 01:08.120
خوب؟

01:08.120 --> 01:13.550
و این به ویژه اگر بخواهید به عنوان یک توسعه‌دهنده در یک شرکت کار کنید

01:13.550 --> 01:21.710
در یک نرم‌افزار بزرگ موجود که در آن صدها و صدها کلاس با ده‌ها هزار

01:21.710 --> 01:22.640
خط کد وجود دارد، بسیار منطقی‌تر خواهد بود.

01:22.640 --> 01:27.350
خوب، بیایید به مثال دنیای واقعی بپردازیم که در آن ما در یک برنامه وارد می‌شویم.

01:27.350 --> 01:33.620
پس یک برنامه را در نظر بگیرید که شما نیاز دارید پیام‌ها را به مقاصد مختلفی مانند یک فایل،

01:33.620 --> 01:38.090
همانطور که قبلاً دیدیم، یک پایگاه داده یا یک سرور از راه دور ثبت کنید.

01:38.090 --> 01:43.160
پس همه این‌ها باید کلاس‌های جداگانه‌ای داشته باشند و تمام پیاده‌سازی‌ها.

01:43.160 --> 01:48.350
اما واقعاً وقتی از جداسازی و رابط‌ها استفاده می‌کنیم، این کار بسیار آسان‌تر است.

01:48.350 --> 01:50.210
پس بیایید شروع کنیم.

01:50.210 --> 01:53.000
بنابراین من این کد را نگه می‌دارم.

01:53.000 --> 01:55.040
من در یک ثانیه آن را کپی می‌کنم.

01:55.040 --> 02:00.020
اما اول ما یک رابط عمومی ایجاد خواهیم کرد.

02:00.020 --> 02:02.420
و من این را Ilogger می‌نامم.

02:02.420 --> 02:03.200
خوب.

02:03.200 --> 02:06.710
و این لاگر یک متد log خواهد داشت.

02:06.710 --> 02:08.750
پس void log string message، خوب.

02:08.750 --> 02:09.560
بسیار ساده.

02:09.560 --> 02:19.130
و سپس من یک کلاس عمومی خواهم داشت که به نام file logger نامیده می‌شود که رابط

02:19.130 --> 02:21.110
Ilogger را پیاده‌سازی می‌کند.

02:21.110 --> 02:27.950
پس حالا درون این، من یک متد عمومی void log خواهم داشت.

02:27.950 --> 02:30.380
من باید قوانین قرارداد را دنبال کنم.

02:30.380 --> 02:37.310
و قرارداد می‌گوید شما باید یک متد log داشته باشید که یک رشته به عنوان پارامتر بگیرد و هیچ چیزی برنگرداند.

02:37.310 --> 02:38.030
خوب.

02:38.030 --> 02:45.830
پس پیاده‌سازی من از رابط Ilogger برای متد log خواهد بود کدی که از ویدیو قبلی داریم.

02:45.830 --> 02:46.220
خوب.

02:46.220 --> 02:50.420
پس اساساً می‌گویم اینگونه آن را ثبت می‌کنم.

02:50.420 --> 02:57.860
و من پیام جدیدی ایجاد نخواهم کرد، اما می‌خواهم پیام ارسالی به متد log خود را بگیرم و سپس آن را در

03:05.210 --> 03:06.140
این فایل بنویسم.

03:06.350 --> 03:07.010
خوب.

03:07.010 --> 03:10.550
پس این پیاده‌سازی file logger است.

03:10.550 --> 03:13.670
و حالا بیایید به database logger نگاه کنیم.

03:13.670 --> 03:22.970
پس من یک کلاس دیگر خواهم داشت، کلاس عمومی database logger که همچنین رابط

03:22.970 --> 03:23.600
Ilogger را پیاده‌سازی می‌کند.

03:23.600 --> 03:32.570
و می‌بینید که من باید واضح است که حالا همچنین این متد void log را داشته باشم که یک رشته پیام را بگیرد.

03:32.570 --> 03:38.660
و حالا باید پیاده‌سازی کنم که چگونه این برای یک database logger انجام می‌شود.

03:38.660 --> 03:39.260
خوب.

03:39.260 --> 03:40.610
حالا می‌خواهم آن را ساده نگه دارم.

03:40.610 --> 03:45.080
فقط می‌گویم ثبت در پایگاه داده.

03:45.080 --> 03:48.560
و من فقط پیام را اینجا ثبت می‌کنم به این شکل.

03:48.560 --> 03:57.560
حالا واضح است که در اینجا من منطق ثبت یک پیام در پایگاه داده را پیاده‌سازی می‌کنم.

03:57.560 --> 04:02.900
اما از آنجا که هنوز پایگاه داده‌ها را پوشش نداده‌ایم، فقط آن را بسیار ساده نگه می‌داریم و فقط در

04:02.900 --> 04:03.590
کنسول می‌نویسیم.

04:03.590 --> 04:07.820
پس حالا قسمت جالب می‌آید، خوب.

04:07.820 --> 04:15.050
پس حالا آنچه که ما انجام خواهیم داد این است که یک کلاسی خواهیم داشت که از database logger استفاده می‌کند.

04:15.050 --> 04:26.060
پس کلاس برنامه ما، کلاس عمومی application که یک سازنده خواهد داشت و نیاز دارد از logger استفاده کند، خوب.

04:26.060 --> 04:29.630
پس من یک Ilogger خصوصی فقط خواندنی خواهم داشت که آن را underscore logger می‌نامم.

04:29.630 --> 04:37.580
و من یک Ilogger دارم که باید به سازنده برنامه منتقل شود، جایی که

04:37.580 --> 04:52.190
من فقط فیلد خصوصی Ilogger فقط خواندنی را تنظیم می‌کنم.

04:52.190 --> 04:56.330
پس این برنامه اکنون آماده است تا از logger استفاده کند.

04:56.330 --> 04:59.600
و این برنامه اهمیتی نمی‌دهد که چه کسی.

04:59.740 --> 05:00.940
قرار است ثبت کند؟

05:00.940 --> 05:07.360
آیا این database logger خواهد بود یا file logger خواهد بود، یا stream logger خواهد بود؟

05:07.360 --> 05:08.260
هر نوع logger که به من منتقل می‌کنید، برای من مهم نیست.

05:08.260 --> 05:12.460
فقط کار را انجام دهید.

05:12.460 --> 05:13.780
و کار چیست که می‌خواهم انجام دهم؟

05:13.780 --> 05:21.430
خوب، من فقط می‌گویم public void work یا do work.

05:21.430 --> 05:26.590
و این متد فقط از logger برای ثبت استفاده خواهد کرد.

05:26.590 --> 05:27.880
و چه چیزی باید ثبت کند؟

05:27.880 --> 05:29.500
باید یک پیام ثبت کند.

05:29.500 --> 05:32.080
پس می‌گویم کار شروع شد.

05:32.110 --> 05:37.600
سپس تمام کارها را انجام دهید، هر چه کار است که برنامه باید انجام دهد.

05:37.600 --> 05:46.090
و سپس دوباره به logger ثبت می‌کنم، می‌گویم کار انجام شد، کار خوب یا چیزی شبیه به آن.

05:46.090 --> 05:46.840
خوب.

05:46.840 --> 05:55.810
پس حالا آنچه می‌توانم انجام دهم این است که در کلاس اصلی خود، می‌توانم یک logger ایجاد کنم که آن را file logger می‌نامم،

05:55.810 --> 06:00.160
که یک file logger جدید خواهد بود.

06:00.160 --> 06:06.460
و من یک برنامه ایجاد می‌کنم که یک برنامه جدید با استفاده از آن file logger خواهد بود.

06:06.460 --> 06:08.110
و سپس کار را انجام می‌دهم.

06:08.110 --> 06:10.990
و سپس همین کار را با logger دیگر نیز انجام می‌دهم.

06:10.990 --> 06:14.380
پس Ilogger و این یکی یک DB logger خواهد بود.

06:14.380 --> 06:18.790
پس یک database logger که یک database logger جدید خواهد بود.

06:18.790 --> 06:21.700
و من برنامه را بازنویسی می‌کنم.

06:21.700 --> 06:24.970
پس برنامه یک برنامه جدید خواهد بود.

06:24.970 --> 06:27.100
اما این بار از DB logger استفاده خواهد کرد.

06:27.100 --> 06:30.550
و همچنین کار را بر روی آن انجام خواهد داد.

06:30.550 --> 06:34.240
پس ما این را قبلاً در عمل دیده‌ایم، خوب.

06:34.240 --> 06:36.220
ما یک مثال بسیار مشابه را دیده‌ایم.

06:36.220 --> 06:37.060
دفعه قبل.

06:37.060 --> 06:40.090
فقط می‌خواستم واقعاً نکته‌ای را که در حال وقوع است، بیان کنم.

06:40.090 --> 06:42.340
پس اینجا چه اتفاقی می‌افتد، جداسازی است.

06:42.340 --> 06:44.350
بیایید ببینیم دقیقاً چه کار می‌کند.

06:44.350 --> 06:44.950
پس اول از همه می‌بینیم log.

06:44.950 --> 06:47.290
ما می‌بینیم که به پایگاه داده ثبت می‌شود، کار شروع شد.

06:47.290 --> 06:49.510
و سپس می‌بینیم که به پایگاه داده ثبت می‌شود، کار انجام شد.

06:49.510 --> 06:52.030
حالا بیایید به فایل خود نیز نگاه کنیم که ایجاد کردیم.

06:52.030 --> 06:56.170
پس باید آن را درون پوشه logs خود ببینیم.

06:56.170 --> 07:00.040
Log.txt.

07:00.040 --> 07:01.450
و می‌بینید که کار شروع شد، کار انجام شد.

07:01.450 --> 07:03.730
کار خوب.

07:03.730 --> 07:04.510
پس اینجا هستیم.

07:04.510 --> 07:06.340
حالا logger ما.

07:06.340 --> 07:07.900
اهمیتی نمی‌دهد که آیا یک file logger است.

07:07.900 --> 07:11.500
پس اینجا یا اگر یک database logger باشد، برنامه اهمیتی نمی‌دهد.

07:11.500 --> 07:16.300
آنچه انجام می‌دهد این است که فقط کار را انجام می‌دهد و به آن اجازه می‌دهد که واقعاً کار را با هر نوع

07:16.300 --> 07:24.130
Ilogger که به سازنده برنامه منتقل می‌کنیم، اجرا کند.

07:24.130 --> 07:28.270
پس کدام قسمت آن جداسازی است؟

07:28.270 --> 07:30.700
خوب، قسمت جداسازی این است که کلاس برنامه به رابط Ilogger وابسته است

07:30.700 --> 07:36.850
به جای پیاده‌سازی‌های خاص مانند file logger یا database logger، یا stream logger یا هر logger دیگری که

07:36.850 --> 07:44.020
شما به آن فکر می‌کنید.

07:44.020 --> 07:44.770
درست است؟

07:44.770 --> 07:45.220
فقط مهم است که این file logger و database logger رابط Ilogger را پیاده‌سازی کنند، که

07:45.220 --> 07:51.490
سپس به نوبه خود واضح است که متد log را پیاده‌سازی می‌کند.

07:51.490 --> 07:56.500
این متد log اینجا و سپس اهمیتی نمی‌دهد.

08:00.850 --> 08:06.610
پس این به این معناست که شما می‌توانید به راحتی مکانیزم ثبت را بدون تغییر کلاس برنامه تغییر دهید.

08:06.610 --> 08:11.410
پس ما نیازی به پیاده‌سازی نحوه کار ثبت و کلاس do work نداریم.

08:11.410 --> 08:18.040
یا نیازی به فکر کردن درباره استفاده از کلاس‌های مختلف و اینکه کدام کلاس یا کدام شیء را از کدام کلاس استفاده می‌کنیم و غیره نداریم.

08:18.040 --> 08:19.600
این مهم نیست.

08:19.600 --> 08:20.530
اهمیتی نمی‌دهد.

08:20.530 --> 08:21.400
و این جنبه جداسازی آن است.

08:21.400 --> 08:23.200
واقعاً چیزهای جالبی است.

08:23.200 --> 08:24.880
و در عین حال این قابلیت تست‌پذیری را افزایش می‌دهد.

08:24.880 --> 08:28.510
پس می‌توانید برنامه خود را تست کنید.

08:28.510 --> 08:31.240
این یکی اینجا، برنامه ما به اصطلاح با پیاده‌سازی‌های مختلف ثبت یا اشیاء mock.

08:31.240 --> 08:38.740
اما بیشتر در مورد تست‌گیری بعداً در دوره با یانیک.

08:38.740 --> 08:42.700
خوب، پس این واقعاً فقط برای بیان نکته‌ای بود که جداسازی چیست.

08:42.700 --> 08:47.380
ما قبلاً جداسازی را در عمل دیده‌ایم.

08:47.380 --> 08:49.150
ما اکنون دوباره آن را دیده‌ایم، اما با تمرکز بر جنبه جداسازی.

08:49.150 --> 08:53.560
خوب.

08:53.650 --> 08:54.280
و این به وضوح بسیار منطقی‌تر است اگر شما کلاس‌های زیادی و کدهای زیادی داشته باشید و پروژه‌های واقعاً بزرگی داشته باشید

08:59.800 --> 09:09.700
که در آن یک نفر تعریف می‌کند که یک logger به طور کلی باید چه کاری انجام دهد، و سپس افراد دیگر می‌توانند

09:09.700 --> 09:15.340
کلاس‌های خود را ایجاد کنند که رابط AIlogger را پیاده‌سازی می‌کنند و سپس می‌توانند کلاس‌های خود را منتقل کنند.

09:15.520 --> 09:23.380
پس روش خود را برای پیاده‌سازی نحوه کار یک AIlogger یا نحوه کار متد log یک AIlogger به برنامه خود منتقل کنند.

09:23.380 --> 09:26.020
خود برنامه در اینجا.

09:26.020 --> 09:32.110
پس حالا می‌توانید ادامه دهید و می‌توانید logger خود را ایجاد کنید که فقط نیاز دارد رابط AIlogger را پیاده‌سازی کند.

09:32.110 --> 09:34.210
یا رابط AIlogger را پیاده‌سازی کنید.

09:34.210 --> 09:39.190
و می‌توانید هر کاری که می‌خواهید با متد log خود انجام دهید و فقط به طور کامل آزاد باشید.

09:39.190 --> 09:47.350
و می‌توانید از شیء کلاس خود استفاده کنید و آن را به سازنده برنامه منتقل کنید هنگام ایجاد

09:47.350 --> 09:48.820
یک برنامه جدید.

09:48.820 --> 09:50.500
خوب، پس این برای این ویدیو کافی است.

09:50.500 --> 09:51.520
در ویدیو بعدی می‌بینیم.
```
