قاعده تفکیک رابط‌ها

اصل تفکیک رابط‌ها (Interface Segregation Principle یا ISP)  یکی از پنج اصل SOLID در طراحی شیءگرا است و بیان می‌کند که هیچ استفاده‌کننده‌ای نباید به اجبار، وابسته به متدهایی باشد که از آن‌ها استفاده نمی‌کند.Martin, Robert (2002). Agile Software Development: Principles, Patterns, and Practices. Pearson Education. اصل ISP رابط‌های بزرگ را به اندازه‌های کوچکتر با دامنه‌ای خاص‌تر تقسیم می‌کند. به این ترتیب استفاده‌کننده از رابط، فقط از توابعی که مد نظر دارد اطلاع خواهد داشت. به چنین رابط‌های کوچک شده‌ای نام رابط نقش نیز گفته می‌شود.Role Interface یکی از اهداف ISP ایجاد گسستگی در سیستم است به طریقی که اصلاح کلی، ایجاد تغییر و انتشار مجدد کدها آسان‌تر شود. اصل ISP شبیه به «اصل انسجام بالا» در مجموعه اصول GRASP است.

 اهمیت ISP در طراحی شیءگرا 
در طراحی شیءگرا، رابط‌ها لایه‌هایی از انتزاع ارائه می‌دهند که کد را ساده‌تر کرده و از درهم‌تنیدگی وابستگی‌ها جلوگیری می‌کند. به عقیدهٔ بسیاری از متخصصین نرم‌افزار که «مانیفست برای ساخت و تولید نرم‌افزار» را امضا کرده‌اند، نوشتن نرم‌افزارهای خوش‌ساخت و واضح تقریباً به اندازهٔ کارکرد صحیح نرم‌افزار اهمیت دارد.Manifesto of Software Craftsmanship استفاده از رابط‌ها برای توصیف بیشتر اهداف نرم‌افزار غالباً ایده خوبی است. 

ممکن است یک سیستم در سطوح مختلف طوری درهم‌تنیده شود که امکان ایجاد تغییر در یک لایه بدون تغییرات دیگر در جاهای نامربوط ممکن نباشد.Martin, Robert (2002). Agile Software Development: Principles, Patterns, and Practices. Pearson Education. استفاده از رابط یا کلاس انتزاعی می‌تواند از بروز این عارضه جلوگیری کند. 

 سرچشمه 
اصل ISP برای اولین بار توسط رابرت سی مارتین هنگام مشاوره برای زیراکس تنظیم و استفاده شد. زیراکس یک سیستم چاپگر جدید ایجاد کرده بود که می‌توانست کارهای مختلفی از قبیل صحافی، ارسال و دریافت نمابر را انجام دهد. نرم‌افزار این سیستم از پایین به بالا ساخته شده بود. با بزرگتر شدن نرم‌افزار، ایجاد تغییرات سخت‌تر و سخت‌تر شد، به طوری که حتی کوچکترین تغییر نیازمند اجرای چرخهٔ بازتولیدِ یک ساعته بود. این امر روند توسعه را تقریباً ناممکن کرده بود. 

مشکل طراحی این بود که تقریباً همهٔ وظایف از یک کلاس استفاده می‌کردند. هر زمانی که یک کار چاپ یا یک کار صحافی نیاز به اجرا داشت، یک فراخوانی از کلاس Job انجام می‌شد. این وضعیت منجر به یک کلاس «فربه» با تعداد زیادی از توابع خاص برای سرویس‌دهی به انواع مختلف کاربرانش شده بود. به دلیل این طراحی، یک وظیفهٔ صحافی علی‌رغم این که از هیچ‌کدام از توابع چاپ استفاده نمی‌کرد از تمام توابع وظیفهٔ چاپ اطلاع داشت. 

راه حل پیشنهاد شده توسط مارتین از آنچه امروزه با نام «اصل تفکیک رابط» شناخته می‌شود استفاده می‌کرد. این اصل در طراحی نرم‌افزار Xerox اعمال شد به‌طوری که یک لایهٔ رابط بین کلاس Job و مشتری‌های آن با استفاده از اصل وارونگی وابستگی اضافه شد. به جای داشتن یک کلاس Job بزرگ، یک رابط Staple Job و یک رابط Print Job ایجاد شد که به ترتیب توسط کلاس‌های Staple (برای صحافی) یا Print (برای چاپ) استفاده می‌شد. بنابراین، برای هر نوع وظیفه، یک رابط (interface) ایجاد شد که توسط همهٔ کلاس‌های وظیفه پیاده‌سازی شده بود. 

 نقض متداول 
یک نقض متداولِ اصل تفکیک رابط در «توسعهٔ نرم‌افزار چابک» ارائه شده است: اصول، الگوها و روش‌هاMartin, Robert (2002). Agile Software Development: Principles, Patterns, and Practices. Pearson Education. در مثال «تراکنش ATM» و همچنین در مقاله‌ای که توسط رابرت سی مارتین به طور خاص دربارهٔ ISP نوشته شده است.Robert C. Martin,The Interface Segregation Principle, C++ Report, June 1996 در این مثال رابط کاربری برای یک دستگاه خودپرداز بررسی شده است. این رابط شامل کلیه درخواست‌ها مانند درخواست افزایش سپرده یا درخواست برداشت می‌شود و در مورد این که چگونه باید این رابط باید در رابط‌های خاص‌تر تفکیک شود بحث شده است. 

 جستارهای وابسته 
 حرف I در SOLID - به معنای اصل تفکیک رابط است.

 منابع 

 پیوند به بیرون 
 اصول OOD – توضیحات و پیوند به مقالات مفصل در مورد SOLID.

رده:اصول برنامه‌نویسی
رده:برنامه‌نویسی شیءگرا
رده:طراحی نرم‌افزار