اصل تفکیک Interface در SOLID



visibility  
mode_comment   ۲

اصل تفکیک Interface در SOLID : معمولا برنامه نویسان تازه کار در اوایل دوران برنامه نویسی خود، دچار مشکلاتی می شوند. کدها در یک جای کار به بن بست می خورند. اوایل کار، برنامه نویس نامبرده (!) شروع به حل مسئله با روش های خلاقانه مخصوص خود می کند! تا جایی که یک جای پروسه این روش های خلاقانه به هم پیچ می خورند! در بهترین حالت حتی با رفع پیچ خوردگی ها و تحویل پروژه، یک جای کار می لنگد: تغییر در کدها به یک کابوس شبانه شده است! برنامه نویس تازه کار با خود فکر می کند که همه راه را درست رفته. پس مشکل از کجاست؟ در این وضعیت برنامه نویسان تازه کار به دو دسته تقسیم می شوند:

  • آدم های عاقلی که به سراغ یک حرفه کم دردسرتر می روند
  • آدم های سمجی که در مورد کد تمیز (Clean Code) مطالعه می کنند!

مسلما این مطلب را برای دسته دوم نوشته ایم! یکی از اصول مهمی که برای دستیابی به کد تمیز مطرح است به اصول SOLID مشهور است. SOLID بر اساس این پنج اصل در طراحی کد (Code Design) تعریف می شود:

  1. Single Responsibility Principle یا اصل تک وظیفگی (SRP)
  2. Open/Closed Principle یا اصل باز و بسته بودن (OCP)
  3. Liskov Substitution Principle یا اصل جانشینی لیسکف (LSP)
  4. Interface Segregation Principle یا اصل تفکیک Interface (ISP)
  5. Dependency Inversion Principle یا اصل وارونه کردن وابستگی (DIP)

در این مطلب به معرفی اصل چهارم یعنی اصل تفکیک Interface می پردازیم.

اصل تفکیک Interface چیست

بر اساس اصل تفکیک Interface ما نباید از Interface هایی استفاده کنیم که بیش از حد چاق هستند! رابرت مارتین (Robert Martin) مشهور به عمو باب در این باره می گوید:

کاربران نباید مجبور به استفاده از Interface هایی شوند که از آن ها استفاده نمی کنند.

برای رسیدن به این هدف هر Interface باید تنها یک کار را انجام دهد. حتی در ایده آل ترین حالت ممکن، بهتر است هر Interface تنها از یک متد ابسترکت (abstract) تشکیل شده باشد. در صورتی که یک Interface اصطلاحا چاق باشد (Fat Interface) کلاس های پیاده کننده را مجبور به پیاده سازی تعداد زیادی متد می کند که قرار نیست استفاده ای از آن ها بشود.

Interface Segregation چیست

ممکن است تصور کنید که این همان اصل اول از اصول SOLID یعنی همان اصل تک وظیفگی (Single Responsibility Principle) است. در مورد کارایی حق با شماست! اما در مورد کاربرد، این دو اصل یک تفاوت کوچک دارند. اصل تک وظیفگی در مورد همه ماژول های برنامه شامل کلاس ها، متد ها و... صحبت می کند. وظیفه اصل اول ایجاد انسجام در واحدهای سازنده برنامه است. اما اصل چهارم در مورد Interface ها و دردسرهای پیاده سازی آن ها صحبت می کند.

مثالی از اصل تفکیک Interface

فرض کنید یک Interface با عنوان ماشین یا Car نوشته ایم. تمام انواع کلاس های ماشین مثل GasCar یا ElectricCar باید این Interface را پیاده سازی یا Implement کنند. Interface ماشین را به این صورت می نویسیم:

در مورد کلاس GasCar همه چیز به درستی پیش می رود. چون یک ماشین با سوخت گازی می تواند سوخت گیری کند، دنده عوض کند و رانده شود:

اما اگر بخواهیم یک کلاس ElectricCar داشته باشیم قضیه کمی فرق می کند. ماشین الکتریکی احتیاجی به سوخت گیری ندارد. بنابراین به متد getFuel() احتیاجی نیست. متد getFuel() باید یا مقدار null را بازگرداند، یا خطایی ارسال کند. بنابراین در این مثال اصل تفکیک Interface را نقض کرده ایم. برای حل ماجرا کافی است کمی Interface ماشینمان را لاغر کنیم! بنابراین این Interface چاق را به دو اینترفیس خوش تیپ می شکنیم:

  • Interface ماشین سوختی با نام FuelCar
  • Interface راندن ماشین با نام RideCar

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

history یاداوری :

در شی گرایی هر کلاس می تواند چندین Interface را پیاده سازی کند.

حال دو کلاس GasCar و ElectricCar به این صورت در می آیند:

نتیجه گیری

در این مطلب به معرفی اصل تفکیک Interface یا ISP پرداختیم. همانطور که دیدیم این اصل می تواند از میزان کدهای اضافی کم کند و حجم کد را کاهش دهد. بر اساس این اصل Interface های چاق همه منظوره باید به Interface های کوچک تک منظوره شکسته شوند. آیا شما با رعایت نکردن این اصل به مشکل بر خورده اید؟ از خواندن نظرات شما خوشحال می شویم!

7Learn Experts
comment دیدگاه کاربران
محمد نقلانی replyپاسخ

این مقاله خیلی بدر بخور بود
. خواهشا بقیه اصل هارو هم تو برنامه داشته باشید و یه پیشنهاد امکانش هست که منابع رو در انتهای مقالات ذکر کنید که بشه به صورت مستقیم هم به منابع دسترسی داشت ( البته میدنم هم میشه سرچ کرد ولی ذکر منابع خیلی کمک بیشتری میکنه چون از صحت و کامل بودنش اطمینان کامل داریم )

زهرا فرحمند

با تشکر جناب نقلانی عزیز. در صورتی که مقاله ای ترجمه مستقیم و خالص باشه منبع حتما ذکر میشه 🙂

add_circle ارسال دیدگاه

خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :