سبد (0)

اصل تفکیک واسط

اصل تفکیک واسط - Interface Segregation principle یا (ISP)

مقایسه با دنیای واقعی:

فرض کنید یک کامپیوتر خریده اید. شما تعدادی پورت usb، چند پورت سریال، یک پورت گرافیک و .. ملاحظه می نمایید. اگر شما درب کیس را باز کنید اسلات های زیادی را روی مادر بورد پیدا می کنید که قسمت های مختلف را به همدیگر اتصال داده اند، که بیشتر توسط مهندسین سخت افزار در هنگام اسمبلی استفاده شده است.

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


فرض کنید برای خرید چیزی به یک مغازه رفته اید. (مثلا، برای خریدن چوب کریکت- احتمالا نویسنده یک کریکت باز است یا اینکه در حال تبلیغ بازی کریکت است.)

حالتی را در نظر بگیرید که فروشنده مشغول نمایش دادن توپ ها و میله های عمودی کریکت به شما می شود. ممکن است شما سر در گم و کلافه شوید و این امکان وجود دارد که دست از خرید بردارید. حتی بعید نیست فراموش کنید که اصلا به چه منظور به فروشگاه رفته اید (خرید چوب کریکت)


شناسایی مشکل در برنامه نویسی

فرض کنید می خواهیم یک سیستم مدیریت گزارش را توسعه دهیم. اولین کاری که باید انجام دهیم ایجاد یک لایه تجاری (business layer) که توسط سه UI متفاوت استفاده می شود.

  1. EmployeeUI- که گزارشات مربوط به کارمندی که در حال حاضر وارد شده است را نمایش می دهد.
  2. ManagerUI- که اطلاعات مربوط به مدیر و تیمی که او هدایت می کند را نمایش می دهد.
  3. AdmnUI- که گزارشات مربوط به هر کارمند، تیم مربوطه، و شرکت مرتبط را نمایش می دهد.
public interface IReportBAL
{
    void GeneratePFReport();
    void GenerateESICReport();

    void GenerateResourcePerformanceReport();
    void GenerateProjectSchedule();

    void GenerateProfitReport();
}
public class ReportBAL : IReportBAL
{    
    public void GeneratePFReport()
    {/*...............*/}

    public void GenerateESICReport()
    {/*...............*/}

    public void GenerateResourcePerformanceReport()
    {/*...............*/}

    public void GenerateProjectSchedule()
    {/*...............*/}

    public void GenerateProfitReport()
    {/*...............*/}
}
public class EmployeeUI
{
    public void DisplayUI()
    {
        IReportBAL objBal = new ReportBAL();
        objBal.GenerateESICReport();
        objBal.GeneratePFReport();
    }
}
public class ManagerUI
{
    public void DisplayUI()
    {
        IReportBAL objBal = new ReportBAL();
        objBal.GenerateESICReport();
        objBal.GeneratePFReport();
        objBal.GenerateResourcePerformanceReport ();
        objBal.GenerateProjectSchedule ();
    }
}
public class AdminUI
{
    public void DisplayUI()
    {
        IReportBAL objBal = new ReportBAL();
        objBal.GenerateESICReport();
        objBal.GeneratePFReport();
        objBal.GenerateResourcePerformanceReport();
        objBal.GenerateProjectSchedule();
        objBal.GenerateProfitReport();
    }
}

حال در هر UI هنگامی که توسعه دهنده  "objBal" تایپ می کند، intellisense مانند زیر نمایش داده می شود.


اشکال کار کجاست؟

توسعه دهنده ای که روی EmployeeUI کار می کند به تمام متدهای دیگر نیز دسترسی دارد، این ممکن است او را ناخواسته سردرگم کند.


ISP چیست؟

ISP بیان می کند که: "کلاینت نباید مجبور باشد که واسط هایی که استفاده نمی کند را پیاده سازی کند."

همچنین ISP می تواند اینگونه بیان شود: "هر چه واسط های خاص تر بیشتری داشته باشیم بهتر است از اینکه، یک واسط با اهداف کلی داشته باشیم."

به عبارت ساده تر، اگر واسط شما چاق است آن را به چندین واسط (لاغر) بشکنید.

به روز رسانی کد، برای پیروی از ISP :

public interface IEmployeeReportBAL
{
    void GeneratePFReport();
    void GenerateESICReport();
}
public interface IManagerReportBAL : IEmployeeReportBAL
{
    void GenerateResourcePerformanceReport();
    void GenerateProjectSchedule();
}
public interface IAdminReportBAL : IManagerReportBAL
{
    void GenerateProfitReport();
}
public class ReportBAL : IAdminReportBAL 
{    
    public void GeneratePFReport()
    {/*...............*/}

    public void GenerateESICReport()
    {/*...............*/}

    public void GenerateResourcePerformanceReport()
    {/*...............*/}

    public void GenerateProjectSchedule()
    {/*...............*/}

    public void GenerateProfitReport()
    {/*...............*/}
}
public class EmployeeUI
{
    public void DisplayUI()
    {
        IEmployeeReportBAL objBal = new ReportBAL();
        objBal.GenerateESICReport();
        objBal.GeneratePFReport();
    }
}

public class ManagerUI
{
    public void DisplayUI()
    {
        IManagerReportBAL  objBal = new ReportBAL();
        objBal.GenerateESICReport();
        objBal.GeneratePFReport();
        objBal.GenerateResourcePerformanceReport ();
        objBal.GenerateProjectSchedule ();
    }
}

public class AdminUI
{
    public void DisplayUI()
    {
        IAdminReportBAL  objBal = new ReportBAL();
        objBal.GenerateESICReport();
        objBal.GeneratePFReport();
        objBal.GenerateResourcePerformanceReport();
        objBal.GenerateProjectSchedule();
        objBal.GenerateProfitReport();
    }
}

با رعایت ISP، به مشتری چیزی که نیاز دارد ببیند را نشان می دهیم.

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