مفهوم جدایی واسط ها (Interface Segregation Principle) در مهندسی نرم افزار

پیش نیاز این درس:

بهتر است با Interface و Classها در برنامه نویسی شی گرا آشنایی داشته باشید. همچنین میتوانید قسمت های ابتدایی دوره SOLID را مطالعه فرمایید.

مدرس: مسعود کاویانی

تا اینجا با مفاهیم زیادی از اصول SOLID در برنامه نویسی و مهندسی نرم افزار آشنا شدیم. در این قسمت میخواهیم به چهارمین حرف از اصول SOLID بپردازیم که به آن Interface Segregation یا جدا سازی واسط ها میگویند. برای درک بهتر این درس باید با Inteface ها یا موارد مشابه آن در یک زبان برنامه نویسی کار کرده باشید. اجازه بدهید با یک مثال این درس را جلو ببریم:

فرض کنید شما مدیر یک اداره هستید و ۵ کارمند دارید. به ۴ نفر از کارمندان طبق ساعت ورود و خروج حقوق می دهید. پس نیاز دارید که یک دستگاه اثر انگشت برای ورود یا خروج این ۴ نفر نصب کنید و قانونی بگذارید هر شخص باید هنگام ورود و خروج، با این دستگاه ورود و خروج خود را ثبت کند. همچنین هر فرد باید در طول روز کارهای خود را مستند کرده و در پایان روز به صورت یک ایمیل گزارش کار روزانه خود را بنویسد. ۱نفر از این ۵ نفر بر اساس کار روزانه حقوق میگیرد و ورود و خروجش مهم نیست. حال فرض کنید شما به عنوان مدیر قانون ثبت اثر انگشت هنگام ورود و خروج را برای همه کارمندان (حتی آن ۱نفر که ورود و خروجش مهم نیست) گذاشته باشید. این کار (شاید در علم مدیریت درست باشد) ولی باعث نقض شدن مفهوم جدایی واسط ها در مهندسی نرم افزار می شود.

جدایی واسط ها یک تعریف ساده دارد:

هیچ شخص یا کدی نباید به ماژولی وابسته باشد که به آن احتیاج ندارد.

در مثال بالا، کارمندی که ورود و خروجش مهم نیست، نباید ورود خروج خود را وابسته به دستگاه ثبت اثر انگشت کند. در برنامه نویسی هم اگر یک ماژولی داید که از نوع یک Interface خاص است، نباید تابعی در آن Interface باشد که کد ما به آن احتیاج نداشته باشد.

اجازه بدهید به سراغ کد برویم و یک مثال ساده از نقض شدن Interface Segregation بنویسیم. یک Interface داریم به اسم EmployeeRules که در آن قوانین کار به صورت Interface آورده شده است. و دو کلاس که کلاس اول، برای کارمندان ساعتی (EmployeeTypeOne) و کلاس دوم برای کارمندان غیر ساعتی (EmployeeTypeTwo) آورده شده است.

<?php
interface EmployeeRules
{
    public function set_entry_time ();
    public function set_exit_time ();
    public function set_report ();
}

public function EmployeeTypeOne implements EmployeeRules
{
    public function set_entry_time ()
    {
        // do something
    }
    
    public function set_exit_time ()
    {
        // do something
    }

    public function set_report ()
    {
        // do something
    }
}

public function EmployeeTypeTwo implements EmployeeRules
{
    public function set_entry_time ()
    {
        // do something
    }

    public function set_exit_time ()
    {
        // do something
    }

    public function set_report ()
    {
        // do something
    }
}

?>

در مثال بالا، کلاس EmployeeTypeTwo نیازی به دو تابع set_entry_time و set_exit_time نداشت. پس در واقع ساختار برنامه Interface Segregation را نقض کرده است. بهتر بود دو Interface برای قوانین در نظر گرفته می شد، یکی برای کلاس کارمندانی که نیاز به ثبت ورود و خروج دارند و یکی برای کارمندانی که نیاز به ثبت ورود و خروج ندارند و هر کدام از کلاس ها از Interface مربوط به خود ارث بری میکردند.

منابع این بحث و اطلاعات بیشتر

» وب سایت TutsPlus

» مثال PHP دیگری از Interface Segregation

» ویکیپدیا

» وب سایت OODesign

در صورت تمایل به یادگیری بیشتر، منابع بالا در نظر گرفته شده است. می توانید با خواندن این منابع، به یادگیری خود در این زمینه عمق ببخشید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *