برنامه نویسی و طراحی وب

اصول 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
حرف اولمخففمفهوم
SSRPاصل تک مسئولیتی
یک کلاس باید تنها یک وظیفه داشته باشد. (یک کلاس باید تنها یک دلیل برای تغییر داشته باشد و نه بیشتر)
OOCPاصل باز ـ بسته
اجزای نرم‌افزار باید نسبت به توسعه باز (یعنی پذیرای توسعه باشد) و نسبت به اصلاح بسته باشند (یعنی پذیرای اصلاح نباشد). (یعنی مثلاً برای افزودن یک ویژگی جدید به نرم‌افزار نیاز نباشد که بعضی از قسمت‌های کد را بازنویسی کرد، بلکه بتوان آن ویژگی را مانند افزونه به راحتی به نرم‌افزار افزود)
LLSPاصل جایگزینی لیسکوف
اشیاءِ یک برنامه که از یک کلاس والد هستند، باید به راحتی و بدون نیاز به تغییر در برنامه، قابل جایگزینی با یکدیگر باشند.
IISPاصل تفکیک اینترفیس‌ها
استفاده از چند رابط که هر کدام، فقط یک وظیفه را بر عهده دارد بهتر از استفاده از یک رابط چند منظوره است.
DDIPاصل وارونگی وابستگی
بهتر است که برنامه به تجرید (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 به ترویج جداسازی نگرانی‌ها کمک می‌کند و ما را تشویق می‌کند که کدهای ماژولار و قابل استفاده مجدد را بنویسیم. این منجر به سیستمی می‌شود که تغییر و تکامل آن آسان‌تر است، زیرا تغییرات کد سطح پایین بر کد سطح بالا تأثیر نمی‌گذارد و بالعکس.

آموزش اصل وارونگی وابستگی در سالید

سیدرضا بازیار

من مهندس فناوری اطلاعات و توسعه دهنده Back end هستم. حس کنجکاوی، تمایل به کشف دنیاهای جدید و علاقه زیادی به حل چالش‌های گوناگون در زمینه‌های مختلف داشتم باعث شد وارد حرفه‌ی پرچالش و عمیق برنامه‌نویسی بشوم و هر روز بیشتر در این دنیای بزرگ غرق می‌شوم. در حال حاضر با مهارت هایی نرم مانند کار تیمی، قدرت مذاکره، خوش برخوردی، پرورش ایده و مهارت های سخت مانند PHP, OOP, Clean Code, Design Patterns و ... با علاقه مشغول به فعالیت در جامعه متن‌باز هستم. معتقدم هر روز بیشتر از دیروز، عمده کارهای انسان‌ها توسط ربات‌ها انجام خواهد شد، به همین دلیل سعی میکنم اسکریپت‌های زیادی با PHP ، Shell Scripting و Bash Scripting بنویسم و سعی می‌کنم کارهایی که برای انسان‌ها سخت و زمانبر هستند،‌ با ربات‌ها در سریعترین زمان و کمترین هزینه ممکن انجام بدهم. در این مسیر با زبان‌های برنامه نویسی مانند C++ و پایتون هم کمی کار کرده‌ام و با سیستم های مدیریت محتوای زیادی مانند وردپرس، جوملا، ویبولتین و... هم به صورت حرفه‌ای درگیر بوده‌ام. گهگاهی سعی میکنم ربات‌هایی طراحی کنم که اطلاعات عظیمی را از طریق اسکرپینگ به دیتابیس های مختلف منتقل میکنند و از طریق API در پلتفرم های مختلف پردازش می‌شوند. در 10 سال گذشته سابقه زیادی در طراحی سایت و فروشگاه‌های اینترنتی، سئو و بهینه سازی، تست امنیت وب‌سایت‌ها، دیجیتال مارکتینگ و... داشته‌ام. خوشحال میشم بتونم تجربیات خودم رو از طریق این وبلاگ در اختیار همه شما عزیزان قرار بدهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *