تا اینجا با مفاهیم زیادی از اصول 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 مربوط به خود ارث بری میکردند.
- ۱ » مسئولیت واحد (Single Responsibility) در مهندسی نرم افزار و برنامه نویسی
- ۲ » مفهوم باز-بسته (Open-Closed) در برنامه نویسی و مهندسی نرم افزار
- ۳ » مفهوم جایگزینی لیسکو (Lisko Substitution Principle) در برنامه نویسی
- ۴ » مفهوم جدایی واسط ها (Interface Segregation Principle) در مهندسی نرم افزار
- ۵ » معکوس سازی وابستگی (Dependency Inversion) در برنامه نویسی