خوش آمدید.
در این ویدیو، ما به بررسی دو دلیل اصلی استفاده از رابط‌ها خواهیم پرداخت.
و آن‌ها جداسازی کد و افزایش قابلیت تست‌پذیری هستند.
پس بیایید ببینیم این کجا مفید خواهد بود.
این در برنامه‌های بزرگ مفید است که در آن اجزا باید به صورت جداگانه با یکدیگر تعامل داشته باشند.
چرا این مهم است؟
خوب، رابط‌ها به جداسازی کد کمک می‌کنند با کاهش وابستگی‌ها بین کلاس‌ها.
این باعث می‌شود کد آسان‌تر تست و نگهداری شود.
و چه زمانی از آن استفاده می‌کنید؟
خوب، شما از رابط‌ها زمانی استفاده می‌کنید که بخواهید جزئیات پیاده‌سازی را از قرارداد رابط جدا کنید،
که به ویژه در سیستم‌های بزرگ و پیچیده مفید است.
پس ما یک مثال دنیای واقعی خواهیم ساخت.
اما این به وضوح یک برنامه بسیار ساده کوچک خواهد بود.
این واقعاً منطقی نخواهد بود اگر شما یک برنامه کوچک با شاید
دوازده کلاس یا کمتر بسازید.
اما وقتی بیش از آن دارید، واقعاً استفاده از رابط‌ها بسیار منطقی‌تر می‌شود.
خوب؟
و این به ویژه اگر بخواهید به عنوان یک توسعه‌دهنده در یک شرکت کار کنید
در یک نرم‌افزار بزرگ موجود که در آن صدها و صدها کلاس با ده‌ها هزار
خط کد وجود دارد، بسیار منطقی‌تر خواهد بود.
خوب، بیایید به مثال دنیای واقعی بپردازیم که در آن ما در یک برنامه وارد می‌شویم.
پس یک برنامه را در نظر بگیرید که شما نیاز دارید پیام‌ها را به مقاصد مختلفی مانند یک فایل،
همانطور که قبلاً دیدیم، یک پایگاه داده یا یک سرور از راه دور ثبت کنید.
پس همه این‌ها باید کلاس‌های جداگانه‌ای داشته باشند و تمام پیاده‌سازی‌ها.
اما واقعاً وقتی از جداسازی و رابط‌ها استفاده می‌کنیم، این کار بسیار آسان‌تر است.
پس بیایید شروع کنیم.
بنابراین من این کد را نگه می‌دارم.
من در یک ثانیه آن را کپی می‌کنم.
اما اول ما یک رابط عمومی ایجاد خواهیم کرد.
و من این را Ilogger می‌نامم.
خوب.
و این لاگر یک متد log خواهد داشت.
پس void log string message، خوب.
بسیار ساده.
و سپس من یک کلاس عمومی خواهم داشت که به نام file logger نامیده می‌شود که رابط
Ilogger را پیاده‌سازی می‌کند.
پس حالا درون این، من یک متد عمومی void log خواهم داشت.
من باید قوانین قرارداد را دنبال کنم.
و قرارداد می‌گوید شما باید یک متد log داشته باشید که یک رشته به عنوان پارامتر بگیرد و هیچ چیزی برنگرداند.
خوب.
پس پیاده‌سازی من از رابط Ilogger برای متد log خواهد بود کدی که از ویدیو قبلی داریم.
خوب.
پس اساساً می‌گویم اینگونه آن را ثبت می‌کنم.
و من پیام جدیدی ایجاد نخواهم کرد، اما می‌خواهم پیام ارسالی به متد log خود را بگیرم و سپس آن را در
این فایل بنویسم.
خوب.
پس این پیاده‌سازی file logger است.
و حالا بیایید به database logger نگاه کنیم.
پس من یک کلاس دیگر خواهم داشت، کلاس عمومی database logger که همچنین رابط
Ilogger را پیاده‌سازی می‌کند.
و می‌بینید که من باید واضح است که حالا همچنین این متد void log را داشته باشم که یک رشته پیام را بگیرد.
و حالا باید پیاده‌سازی کنم که چگونه این برای یک database logger انجام می‌شود.
خوب.
حالا می‌خواهم آن را ساده نگه دارم.
فقط می‌گویم ثبت در پایگاه داده.
و من فقط پیام را اینجا ثبت می‌کنم به این شکل.
حالا واضح است که در اینجا من منطق ثبت یک پیام در پایگاه داده را پیاده‌سازی می‌کنم.
اما از آنجا که هنوز پایگاه داده‌ها را پوشش نداده‌ایم، فقط آن را بسیار ساده نگه می‌داریم و فقط در
کنسول می‌نویسیم.
پس حالا قسمت جالب می‌آید، خوب.
پس حالا آنچه که ما انجام خواهیم داد این است که یک کلاسی خواهیم داشت که از database logger استفاده می‌کند.
پس کلاس برنامه ما، کلاس عمومی application که یک سازنده خواهد داشت و نیاز دارد از logger استفاده کند، خوب.
پس من یک Ilogger خصوصی فقط خواندنی خواهم داشت که آن را underscore logger می‌نامم.
و من یک Ilogger دارم که باید به سازنده برنامه منتقل شود، جایی که
من فقط فیلد خصوصی Ilogger فقط خواندنی را تنظیم می‌کنم.
پس این برنامه اکنون آماده است تا از logger استفاده کند.
و این برنامه اهمیتی نمی‌دهد که چه کسی.
قرار است ثبت کند؟
آیا این database logger خواهد بود یا file logger خواهد بود، یا stream logger خواهد بود؟
هر نوع logger که به من منتقل می‌کنید، برای من مهم نیست.
فقط کار را انجام دهید.
و کار چیست که می‌خواهم انجام دهم؟
خوب، من فقط می‌گویم public void work یا do work.
و این متد فقط از logger برای ثبت استفاده خواهد کرد.
و چه چیزی باید ثبت کند؟
باید یک پیام ثبت کند.
پس می‌گویم کار شروع شد.
سپس تمام کارها را انجام دهید، هر چه کار است که برنامه باید انجام دهد.
و سپس دوباره به logger ثبت می‌کنم، می‌گویم کار انجام شد، کار خوب یا چیزی شبیه به آن.
خوب.
پس حالا آنچه می‌توانم انجام دهم این است که در کلاس اصلی خود، می‌توانم یک logger ایجاد کنم که آن را file logger می‌نامم،
که یک file logger جدید خواهد بود.
و من یک برنامه ایجاد می‌کنم که یک برنامه جدید با استفاده از آن file logger خواهد بود.
و سپس کار را انجام می‌دهم.
و سپس همین کار را با logger دیگر نیز انجام می‌دهم.
پس Ilogger و این یکی یک DB logger خواهد بود.
پس یک database logger که یک database logger جدید خواهد بود.
و من برنامه را بازنویسی می‌کنم.
پس برنامه یک برنامه جدید خواهد بود.
اما این بار از DB logger استفاده خواهد کرد.
و همچنین کار را بر روی آن انجام خواهد داد.
پس ما این را قبلاً در عمل دیده‌ایم، خوب.
ما یک مثال بسیار مشابه را دیده‌ایم.
دفعه قبل.
فقط می‌خواستم واقعاً نکته‌ای را که در حال وقوع است، بیان کنم.
پس اینجا چه اتفاقی می‌افتد، جداسازی است.
بیایید ببینیم دقیقاً چه کار می‌کند.
پس اول از همه می‌بینیم log.
ما می‌بینیم که به پایگاه داده ثبت می‌شود، کار شروع شد.
و سپس می‌بینیم که به پایگاه داده ثبت می‌شود، کار انجام شد.
حالا بیایید به فایل خود نیز نگاه کنیم که ایجاد کردیم.
پس باید آن را درون پوشه logs خود ببینیم.
Log.txt.
و می‌بینید که کار شروع شد، کار انجام شد.
کار خوب.
پس اینجا هستیم.
حالا logger ما.
اهمیتی نمی‌دهد که آیا یک file logger است.
پس اینجا یا اگر یک database logger باشد، برنامه اهمیتی نمی‌دهد.
آنچه انجام می‌دهد این است که فقط کار را انجام می‌دهد و به آن اجازه می‌دهد که واقعاً کار را با هر نوع
Ilogger که به سازنده برنامه منتقل می‌کنیم، اجرا کند.
پس کدام قسمت آن جداسازی است؟
خوب، قسمت جداسازی این است که کلاس برنامه به رابط Ilogger وابسته است
به جای پیاده‌سازی‌های خاص مانند file logger یا database logger، یا stream logger یا هر logger دیگری که
شما به آن فکر می‌کنید.
درست است؟
فقط مهم است که این file logger و database logger رابط Ilogger را پیاده‌سازی کنند، که
سپس به نوبه خود واضح است که متد log را پیاده‌سازی می‌کند.
این متد log اینجا و سپس اهمیتی نمی‌دهد.
پس این به این معناست که شما می‌توانید به راحتی مکانیزم ثبت را بدون تغییر کلاس برنامه تغییر دهید.
پس ما نیازی به پیاده‌سازی نحوه کار ثبت و کلاس do work نداریم.
یا نیازی به فکر کردن درباره استفاده از کلاس‌های مختلف و اینکه کدام کلاس یا کدام شیء را از کدام کلاس استفاده می‌کنیم و غیره نداریم.
این مهم نیست.
اهمیتی نمی‌دهد.
و این جنبه جداسازی آن است.
واقعاً چیزهای جالبی است.
و در عین حال این قابلیت تست‌پذیری را افزایش می‌دهد.
پس می‌توانید برنامه خود را تست کنید.
این یکی اینجا، برنامه ما به اصطلاح با پیاده‌سازی‌های مختلف ثبت یا اشیاء mock.
اما بیشتر در مورد تست‌گیری بعداً در دوره با یانیک.
خوب، پس این واقعاً فقط برای بیان نکته‌ای بود که جداسازی چیست.
ما قبلاً جداسازی را در عمل دیده‌ایم.
ما اکنون دوباره آن را دیده‌ایم، اما با تمرکز بر جنبه جداسازی.
خوب.
و این به وضوح بسیار منطقی‌تر است اگر شما کلاس‌های زیادی و کدهای زیادی داشته باشید و پروژه‌های واقعاً بزرگی داشته باشید
که در آن یک نفر تعریف می‌کند که یک logger به طور کلی باید چه کاری انجام دهد، و سپس افراد دیگر می‌توانند
کلاس‌های خود را ایجاد کنند که رابط AIlogger را پیاده‌سازی می‌کنند و سپس می‌توانند کلاس‌های خود را منتقل کنند.
پس روش خود را برای پیاده‌سازی نحوه کار یک AIlogger یا نحوه کار متد log یک AIlogger به برنامه خود منتقل کنند.
خود برنامه در اینجا.
پس حالا می‌توانید ادامه دهید و می‌توانید logger خود را ایجاد کنید که فقط نیاز دارد رابط AIlogger را پیاده‌سازی کند.
یا رابط AIlogger را پیاده‌سازی کنید.
و می‌توانید هر کاری که می‌خواهید با متد log خود انجام دهید و فقط به طور کامل آزاد باشید.
و می‌توانید از شیء کلاس خود استفاده کنید و آن را به سازنده برنامه منتقل کنید هنگام ایجاد
یک برنامه جدید.
خوب، پس این برای این ویدیو کافی است.
در ویدیو بعدی می‌بینیم. ```