ویرگول
ورودثبت نام
فرشید عزیزی
فرشید عزیزیSoftware Engineer
فرشید عزیزی
فرشید عزیزی
خواندن ۳ دقیقه·۵ سال پیش

اصل (ISP)Interface segregation principle

اصل Interface segregation principle
اصل Interface segregation principle

اصل ISP بیان می کند که کلاینت ها نباید مجبور به پیاده سازی رابط هایی(Interface) شوند که استفاده
نمی کنند. بنابراین به جای اینترفیس های بزرگ(“bulky” or “fat” interface)، بهتر است چندین Interface کوچک ایجاد کنید تا به بهترین شکل ممکن از آنها استفاده شود.
مشابه کلاس‌ها، واسط‌ها(Interface) باید هدف خاصی داشته باشند (به اصل SRP اشاره می‌شود).

نکته : شما به راحتی می توانید این اصل را به خاطر بسپارید زیرا منطقی مشابه با اصل SRP دارد، اما برای
رابط ها(Interface).
همانند کلاس ها، هر رابط(Interface) باید هدف/مسئولیت خاصی داشته باشد وقتی شیء شما آن هدف را ندارد، نباید مجبور به پیاده سازی یک رابط شوید. هرچه اینترفیس بزرگتر باشد، به احتمال زیاد متدهایی را شامل می شود که همه پیاده سازها، نمی توانند و یا لازم نیستآن را انجام دهند. این ماهیت اصل جداسازی رابط (ISP) است
نکته : ISP نیز یک اصل کلیدی در طراحی سیستم های توزیع شده به طور کلی و میکروسرویس ها به طور خاص است.

پیاده سازی (Implementation)

در اینجا ما رابطی (Interface)را بررسی می کنیم که ISP را نقض می کند:

// Not following the Interface Segregation Principle Public interface ISmartDevice { void Print(); void Fax(); void Scan(); }

این رابط(Interface) بیان می کند که یک دستگاه هوشمند قادر به چاپ، فکس و اسکن است. پیاده سازی این رابط می تواند یک کلاس AllInPrinter باشد:

Public class AllInOnePrinter : ISmartDevice { public void Print() { // Printing code. } public void Fax() { // Beep booop biiiiip. } public void Scan() { // Scanning code. } }

حال فرض کنید باید یک دستگاه (کلاس EconomicPrinter) که فقط می تواند چاپ کند، کنترل کنیم. برای مثال:

Public class EconomicPrinter : ISmartDevice { public void Print() { //Yes I can print. } public void Fax() { throw new NotSupportedException(); } public void Scan() { throw new NotSupportedException(); } }

خیلی جالب و خوب بنظر نمی رسد!!!

بیایید کد فوق را Refactor کنیم

Public interface IPrinter{ void Print(); } Public interface IFax{ void Fax(); } Public interface IScanner{ void Scan(); }

به این ترتیب، پیاده‌سازی کلاس‌هایی که نیازی به مدیریت همه عملکردهای اصلی دستگاه ISmart، رابطی مانند EconomicPrinter ما ندارند، آسان‌تر است. کد ما جداتر است و نگهداری آن آسان تر است. بیایید EconomicPrinter خود را با این معماری دوباره پیاده سازی کنیم:

Public class EconomicPrinter : IPrinter { public void Print() { // Printing code. } }

خوب AllInOnePrinter اصلی اکنون به شکل زیر است:

Public class AllInOnePrinter : IPrinter, IFax, IScanner { public void Print() { // Printing code. } public void Fax() { // Beep booop biiiiip. } public void Scan() { // Scanning code. } }

اصل ISP ما را راهنمایی می کند تا به جای چند رابط بزرگ با روش های مختلف، بسیاری از رابط های کوچک با عملکردهای منسجم ایجاد کنیم. وقتی ISP را اعمال می کنیم، کلاس و وابستگی های آن ها با استفاده از رابط های متمرکز با هم ارتباط برقرار می کنند و وابستگی ها را به حداقل می رساند. رابط های کوچکتر برای پیاده سازی آسان تر هستند، انعطاف پذیری و امکان استفاده مجدد را بهبود می بخشند.

بیشتر بخوانید : اصول طراحی نرم افزار Software Design Principles

اصول solid
۹
۰
فرشید عزیزی
فرشید عزیزی
Software Engineer
شاید از این پست‌ها خوشتان بیاید