اصول SOLID در برنامه نویسی شی گرا چیست؟
آشنایی با اصول پنجگانه SOLID در برنامهنویسی شئگرا
سالید (SOLID) مخفف پنج کلمه از اصول پنجگانه اولیه طراحی شئگرا است که وقتی این اصول دست به دست هم میدهند، برنامه نویسی را را قابل درکتر، انعطاف پذیرتر و قابل نگهداریتر میکنند و به موجب آن، اضافه کردن قابلیتهای جدید یا دیباگ کردن برنامه هم آسانتر میشود.
رابرت سیسیل مارتین معروف به عمو باب (uncle bob) کسی بود که برای اولین بار اصول SOLID را مطرح کرد در تمام زبان های برنامهنویسی شیگرا مانند PHP قابل پیاده سازی است و دانستن آن برای هر برنامهنویسی امری مهم است زیرا میتواند شیوه نوشتن کدهای شما را کاملاً تغییر دهد.
پس ممکن است قبل از یادگیری اصول سالید این سوال در ذهن شما باشد که چرا باید این اصول را یاد بگیریم؟ برای رسیدن به پاسخ این سوال، پیشنهاد میکنم این مقاله را بخوانید: «چرا باید اصول SOLID را یاد بگیریم؟»
شاید هم این سوال در ذهن شما باشد که اگر از اصول سالید استفاده نکنید، چه اتفاقی رخ خواهد داد؟ برای رسیدن به پاسخ این سوال هم پیشنهاد میکنم این مقاله را بخوانید: «اگر از اصول SOLID استفاده نکنیم، چه اتفاقی رخ خواهد داد؟»
اصول SOLID بر پنج اصل زیر بنا شده است:
- Single Responsibility Principle
- Open-Closed Principle
- Liskov Substitution Principle
- Interface Segregation Principle
- Dependency Inversion Principle
حرف اول | مخفف | مفهوم |
---|---|---|
S | SRP | اصل تک مسئولیتی یک کلاس باید تنها یک وظیفه داشته باشد. (یک کلاس باید تنها یک دلیل برای تغییر داشته باشد و نه بیشتر) |
O | OCP | اصل باز ـ بسته اجزای نرمافزار باید نسبت به توسعه باز (یعنی پذیرای توسعه باشد) و نسبت به اصلاح بسته باشند (یعنی پذیرای اصلاح نباشد). (یعنی مثلاً برای افزودن یک ویژگی جدید به نرمافزار نیاز نباشد که بعضی از قسمتهای کد را بازنویسی کرد، بلکه بتوان آن ویژگی را مانند افزونه به راحتی به نرمافزار افزود) |
L | LSP | اصل جایگزینی لیسکوف اشیاءِ یک برنامه که از یک کلاس والد هستند، باید به راحتی و بدون نیاز به تغییر در برنامه، قابل جایگزینی با یکدیگر باشند. |
I | ISP | اصل تفکیک اینترفیسها استفاده از چند رابط که هر کدام، فقط یک وظیفه را بر عهده دارد بهتر از استفاده از یک رابط چند منظوره است. |
D | DIP | اصل وارونگی وابستگی بهتر است که برنامه به تجرید (abstraction) وابسته باشد نه پیادهسازی |
امروز قصد دارم این پنج اصل را برای شما عزیزان به صورت کامل توضیح بدهم. پس تا آخر این مقاله با من همراه باشید.
1. اصل تک مسئولیتی (Single Responsibility Principle)
اصل تک مسئولیتی (SRP) بیان میکند که یک کلاس باید تنها یک دلیل برای تغییر داشته باشد، به این معنی که باید فقط یک مسئولیت خاص و مشخص داشته باشد.
در این صورت، این کلاس کوچکتر و متمرکزتر میشود که موجب کاهش اتصال، بهبود قابلیت نگهداری، درک بهتر کلاس و آسانتر شدن اصلاح کدهای آن میشود.
آموزش اصل تک مسئولیتی در اصول سالید
2. اصل باز – بسته (Open/Closed Principle)
اصل باز – بسته (OCP) بیان میکند که موجودیتهای برنامهی ما (کلاسها، ماژولها، توابع و غیره) باید برای توسعه باز باشند اما برای تغییر دادن بسته باشند.
این بدان معنی است که رفتارِ این موجودیتها میتواند از طریق ارث (inheritance) یا ترکیب (composition) بدون تغییر کد منبع آنها گسترش یابد. OCP به بهبود قابلیت نگهداری و انعطافپذیری کمک میکند، زیرا اجازه میدهد تا بدون هیچ مشکلی، ویژگیهای جدید را به آن اضافه کنیم. همچنین به کاهش ایجاد مشکلات مختلف در هنگام ایجاد تغییرات در سیستم کمک میکند، زیرا کد فعلی دست نخورده باقی میماند.
آموزش اصل باز – بسته در اصول سالید
3. اصل جایگزینی لیسکوف (Liskov Substitution Principle)
اصل جایگزینی لیسکوف (LSP) بیان میکند که اشیاء یک سوپرکلاس باید با اشیاء یک زیر کلاس بدون تغییر در صحت برنامه قابل تعویض باشند.
به عبارت دیگر اگر B یک زیرکلاس از سوپرکلاس A باشد، آبجکتهای نوع A باید بتوانند بدون تغییر دادن کد برنامه، با آبجکتهای نوع B جایگزین شوند. (به بیان سادهتر کلاسهای فرزند نباید رفتار و ویژگیهای کلاس والد را تغییر بدهند)
این بدان معناست که اگر برنامهای برای کار با اشیاء از یک کلاس پایه خاص نوشته شده است، باید با اشیاء هر کلاس مشتق شده بدون تغییر کار کند. LSP به ارتقای انعطافپذیری و قابلیت نگهداری کمک میکند، زیرا به زیرکلاسها (Subclasses) اجازه میدهد تا کلاس پایه خود را جایگزین کنند و رفتار و عملکرد جدیدی را در عین حفظ کد موجود ارائه دهد. این اصل ارتباط نزدیکی با مفهوم چندشکلی (Polymorphism) در برنامه نویسی شیگرا دارد.
آموزش اصل جایگزینی لیسکوف در سالید
4. اصل تفکیک رابطها (Interface Segregation Principle)
اصل جداسازی رابط (ISP) بیان میکند که یک کلاس نباید مجبور به پیادهسازی رابطهایی شود که استفاده نمیکند.
به عبارت دیگر، رابطهایی (interfaces) که یک کلاس پیاده سازی میکند باید متناسب با نیازهای خاص آن کلاس باشد. این به کاهش کوپلینگ، افزایش انعطافپذیری و بهبود قابلیت نگهداری با متمرکزتر کردن رابط کلاس و خاص کردن نیازهای آن کلاس کمک میکند. ISP همچنین به جلوگیری از اجبار کلاسها به پیادهسازی روشهایی که قابل اجرا یا مرتبط با رفتار آنها نیستند کمک می کند. این منجر میشود که رابطها کوچکتر و منسجمتر شوند و درک و اصلاح کدها آسانتر شود.
آموزش اصل تفکیک رابطها در سالید
5. اصل وارونگی وابستگی (Dependency Inversion Principle)
اصل وارونگی وابستگی (DIP) بیان میکند که ماژولهای سطح بالا نباید به ماژولهای سطح پایین وابستگی داشته باشند، اما هر دو باید به انتزاعها (Abstractions) بستگی داشته باشند. موارد انتزاعی نباید به جزئیات وابسته باشند. جزییات باید وابسته به انتزاع باشند.
این بدان معناست که کدها باید به انتزاعات بستگی داشته باشند، نه به موارد پیادهسازی (concretions). هدف از DIP مستقل کردن کد، انعطاف پذیرتر و قابل نگهداریتر کردن آن است. با معکوس کردن جریان عادی وابستگیها، به طوری که کدهای سطح بالا به انتزاعها بستگی دارد و کدهای سطح پایین آن انتزاعها را پیادهسازی میکنند، DIP به ترویج جداسازی نگرانیها کمک میکند و ما را تشویق میکند که کدهای ماژولار و قابل استفاده مجدد را بنویسیم. این منجر به سیستمی میشود که تغییر و تکامل آن آسانتر است، زیرا تغییرات کد سطح پایین بر کد سطح بالا تأثیر نمیگذارد و بالعکس.