اصول SOLID یکی از اصول در برنامه نویسی شی گراست که توسط Robert C Martin مطرح شد.
رعایت اصول SOLID توسعه و نگهداری نرم افزار را راحت تر و منعطف تر میکند.
قرار نیست همه جا از همه این اصول استفاده کنیم. معمولا در ابتدای راه برنامه نویسی نیاز به رعایت این 5 اصل در برنامههای خودمان نداریم. اما آشنایی با آن ها برای پیشرفت مهارت های خودمان ضروری است.
اصل Single Responsibility
یک کلاس (Class) فقط باید یک کار انجام دهد.
این اصل می گوید هر کلاس ما در نرم افزار نباید مسئول انجام چندین کار مختلف باشد. وقتی نرم افزار رشد میکند و دیگر یک برنامه کوچک به حساب نمی آید، کلاس ها آنقدر بزرگ میشوند که برای تغییر در یک فیچر باید زمان قابل توجهی صرف جستجو درون یک کلاس کنیم.
با رعایت اصل single responsibility هم پیچیدگی را کاهش دادهایم و هم سرعت توسعه نرم افزار را.
اصل Open/Closed
کلاس ها برای توسعه باید باز باشند ولی برای ویرایش بسته.
طبق این اصل می توانید یک کلاس را extend کنید ودر کلاس فرزند، متد های جدید بسازید، property های جدید اضافه کنید، اما نباید به کلاس اصلی دست بزنید.
البته این برای کلاسهایی است که دارند به درستی کار خودشان را در نرم افزار انجام میدهند. اگر کلاسی داریم که باگ دارد قطعا باید آن را برطرف کنیم.
اصل Liskov Subtitution
کلاس فرزند باید با رفتار کلاس والد سازگاری داشته باشد.
اگر یک کلاس را extend میکنیم و یک متد از کلاس والد را در کلاس فرزند جایگزین میکنیم نباید رفتار متد به طور کامل تغییر کند
اصل Interface Segregation
Interface باید به گونه ای نوشته شود که کلاس هایی که به آن وابسته اند مجبور نباشند متدهایی را پیاده سازی کنند که از آنها استفاده نمیکنند.
این اصل توصیه میکند که interface ها تا جای ممکن کوچک باشند. یک اینترفیس با چندین متد را می توان به اینترفیس های کوچکتر با تعداد متد کمتر تقسیم کرد تا کلاس ها مجبور نباشند متدهای اضافی داشته باشند.
اگر زمانی رسید که یک کلاس نیاز به همه این متدها داشت می تواند چندین اینترفیس را implement کند.
اصل Dependency Inversion
کلاس های سطح بالا نباید به کلاس های سطح پایین وابسته باشند. هر دو این کلاس ها باید به abstraction ها وابسته باشند.
قبل از ادامه باید تعریف سه چیز را مشخص کنیم:
- کلاس سطح بالا (High Level Class)
- کلاس سطح پایین (Low Level Class)
- abstraction
کلاس سطح پایین
کلاس هایی هستند که کارهای اولیه در نرم افزار مثل اتصال به دیتابیس یا کار با فضای ذخیره سازی را انجام میدهند.
کلاس سطح بالا
منطق اصلی نرم افزار و کارهای پیچیدهتر در این کلاس ها انجام میشوند.
abstraction
در برنامه نویسی شی گرا منظور از abstraction، کلاس هایی هستند که کلیت نحوه نوشتن کلاسهای اصلی را مشخص می کنند. مثل Interface که فقط اسم متدها و اسم property ها در آن تعریف می شود. نحوه پیاده سازی این متدها به عهده کلاسهایی است که از این اینترفیس تبعیت میکنند.
اصل Dependency Inversion می گوید کلاسی که قرار است کار خواندن و نوشتن در دیتابیس را انجام دهد(کلاس سطح پایین) نباید برای کلاسی که قرار است سفارش کاربر را دریافت کند و در دیتابیس ثبت کند(کلاس سطح بالا) وابستگی ایجاد کند.
اگر روش اتصال به دیتابیس در کلاس سطح پایین عوض شد کلاس سطح بالا باید کار خودش را بدون نیاز به تغییر به درستی ادامه دهد.
این مطلب را به مرور با مثالها و توضیحات بیشتر آپدیت میکنم.