اصول SOLID در برنامه نویسی - اصل I
اصول SOLID در برنامه نویسی - اصل I
اصل جداسازی رابط (Interface Segregation Principle) در SOLID
مقدمه
اصل جداسازی رابط (ISP) یکی از پنج اصل SOLID است که بر طراحی رابطهای کوچک و هدفمند تأکید دارد. این اصل تضمین میکند که کلاسها فقط متدهایی را پیادهسازی کنند که واقعاً به آنها نیاز دارند، و از پیادهسازی متدهای غیرضروری که میتوانند کد را پیچیده یا شکننده کنند، جلوگیری میکند.
مهندس بهمن آبادی در دوره جامع برنامهنویسی وب خود، این اصل را بهعنوان یکی از پایههای طراحی شیءگرا معرفی میکند و با مثالهایی از پروژههای وب، نشان میدهد که چگونه ISP میتواند کد را تمیزتر و قابلنگهداریتر کند.
مفهوم اصل ISP
ISP بیان میکند که:
- رابطها باید کوچک و متمرکز بر یک مسئولیت خاص باشند.
- کلاینتها (کلاسهایی که رابط را پیادهسازی میکنند) نباید مجبور به پیادهسازی متدهایی شوند که استفاده نمیکنند.
- به جای یک رابط بزرگ و کلی (Fat Interface)، باید چندین رابط کوچک و تخصصی طراحی کنیم.
این اصل از اصل Single Responsibility Principle (SRP) الهام گرفته شده و به ما کمک میکند تا از پیچیدگی غیرضروری در طراحی کلاسها جلوگیری کنیم. نقض ISP میتواند منجر به کدهایی شود که:
پر از متدهای غیرضروری هستند.
نگهداری و تست آنها دشوار است.
تغییرات در رابط باعث تأثیرات ناخواسته در کلاسهای غیرمرتبط میشود.
نقض اصل ISP در C#
برای درک بهتر، ابتدا یک مثال از نقض ISP ارائه میدهیم:
مثال 1: نقض ISP
فرض کنید سیستمی برای مدیریت دستگاههای الکترونیکی داریم که از یک رابط بزرگ استفاده میکند:
مشکل این کد:
رابط IDevice بیش از حد بزرگ است و شامل متدهایی (مانند Print، Scan و Fax) است که همه دستگاهها از آنها استفاده نمیکنند.
کلاس Printer مجبور به پیادهسازی متدهای Scan و Fax شده که نیازی به آنها ندارد و پرتاب خطا میکند.
کلاس Scanner نیز به همین ترتیب مجبور به پیادهسازی متد Print و Fax است.
این نقض ISP است، زیرا کلاسها متدهای غیرضروری را پیادهسازی میکنند که باعث پیچیدگی و شکنندگی کد میشود.
مهندس بهمن آبادی در دوره جامع برنامهنویسی وب خود به این نکته اشاره میکند که رابطهای بزرگ و کلی در پروژههای وب، مانند APIهایی که چندین نوع سرویس را مدیریت میکنند، میتوانند مشکلات مشابهی ایجاد کنند. او توصیه میکند که رابطها را به بخشهای کوچکتر تقسیم کنیم تا هر کلاس فقط مسئولیتهای مرتبط را بر عهده بگیرد.
رعایت اصل ISP در C#
برای رفع مشکل، رابطها را به بخشهای کوچکتر و تخصصی تقسیم میکنیم:
مثال 2: رعایت ISP
رابطها را بر اساس قابلیتهای خاص دستگاهها جدا میکنیم:
مزایای این کد:
هر رابط تنها یک مسئولیت خاص (مانند روشن/خاموش کردن، چاپ، اسکن یا فکس) را تعریف میکند.
کلاس Printer فقط رابطهای ITurnable و IPrintable را پیادهسازی میکند و نیازی به متدهای غیرضروری ندارد.
کلاس Scanner فقط رابطهای ITurnable و IScannable را پیادهسازی میکند.
کلاس MultiFunctionDevice میتواند چندین رابط را پیادهسازی کند تا قابلیتهای ترکیبی را ارائه دهد.
این طراحی ISP را رعایت میکند، زیرا هیچ کلاسی مجبور به پیادهسازی متدهای غیرمرتبط نیست.
مهندس بهمن آبادی در دوره جامع برنامهنویسی وب خود، این رویکرد را با مثالهایی از پروژههای وب نشان میدهد. او توضیح میدهد که در توسعه APIهای وب، رابطهای کوچک و تخصصی میتوانند به ماژولار شدن کد و کاهش وابستگیهای غیرضروری کمک کنند.
مثال عملی دیگر: سیستم مدیریت کاربران
فرض کنید سیستمی برای مدیریت کاربران در یک برنامه وب داریم. بدون رعایت ISP، ممکن است رابط زیر را داشته باشیم:
نقض ISP در سیستم مدیریت کاربران
مشکل: کلاس BasicUserManager مجبور به پیادهسازی متدهای SendEmail و LogUserActivity شده که نیازی به آنها ندارد، و این نقض ISP است.
رعایت ISP در سیستم مدیریت کاربران
رابطها را به بخشهای کوچکتر تقسیم میکنیم:
مزایا:
کلاس BasicUserManager فقط رابطهای مرتبط (IUserCreator و IUserDeleter) را پیادهسازی میکند.
کلاس AdvancedUserManager میتواند رابطهای اضافی را برای قابلیتهای بیشتر پیادهسازی کند.
این طراحی ISP را رعایت میکند و کد را ماژولارتر و قابلتستتر میکند.
مهندس بهمن آبادی در دوره خود، مثالهایی مشابه این را در زمینه توسعه وب، مانند مدیریت کاربران در APIها، ارائه میدهد. او نشان میدهد که چگونه جداسازی رابطها میتواند در پروژههای بزرگ وب، مانند سیستمهای مدیریت محتوا به بهبود ساختار کد کمک کند.
دوره جامع برنامهنویسی وب مهندس بهمن آبادی
مهندس بهمن آبادی در دوره جامع برنامهنویسی وب خود، اصل ISP را بهعنوان یکی از اصول کلیدی طراحی شیءگرا معرفی میکند. او با مثالهایی از پروژههای وب، مانند طراحی APIها برای مدیریت کاربران یا سرویسهای مختلف، نشان میدهد که چگونه رابطهای کوچک و تخصصی میتوانند کد را سادهتر و انعطافپذیرتر کنند. او به دانشجویان توصیه میکند:
رابطها را بر اساس مسئولیتهای خاص طراحی کنند.
از رابطهای بزرگ و کلی که کلاسها را مجبور به پیادهسازی متدهای غیرضروری میکنند، اجتناب کنند.
از الگوهای طراحی مانند Strategy یا Facade برای ترکیب رابطهای کوچک استفاده کنند.
برای مثال، او ممکن است سناریویی مشابه سیستم مدیریت کاربران بالا را در دوره خود بررسی کند و نشان دهد که چگونه با استفاده از رابطهای کوچک، میتوان APIهایی طراحی کرد که بهراحتی گسترش یابند و ISP را رعایت کنند.
نتیجهگیری
اصل جداسازی رابط (ISP) یکی از اصول مهم SOLID است که به ما کمک میکند رابطهای کوچک و متمرکز طراحی کنیم تا کلاسها فقط متدهای مورد نیاز خود را پیادهسازی کنند. با استفاده از رابطهای تخصصی، میتوانیم از پیچیدگی غیرضروری جلوگیری کنیم و کدهایی قابلنگهداری و تستپذیر بنویسیم.
مهندس بهمن آبادی در دوره جامع برنامهنویسی وب خود، این اصل را با مثالهای کاربردی و مرتبط با توسعه وب توضیح داده است. او با تأکید بر استفاده از رابطهای کوچک و الگوهای طراحی، به دانشجویان نشان میدهد که چگونه میتوانند سیستمهای مقیاسپذیر و تمیز طراحی کنند. اگر به دنبال یادگیری عمیق اصول SOLID و کاربرد آنها در پروژههای واقعی هستید، دورههای ایشان و مطالعه مثالهای بالا میتوانند نقطه شروع عالی باشند.
منابع:
(SOLID Principles in C#: Interface Segregation Principle with Examples)
(Clean Code and Design Patterns in .NET)