در دنیای توسعه نرمافزار، ایجاد کدی قابل نگهداری، انعطافپذیر و مقیاسپذیر چالشی مداوم است. با افزایش پیچیدگی برنامهها، توسعهدهندگان به اصول طراحی قوی نیاز دارند تا کار آنها را هدایت کند. اینجاست که اصول SOLID وارد عمل میشوند. SOLID کلمهای مخفف است که پنج اصل بنیادی برنامهنویسی و طراحی شیءگرا را راهنمایی میکند.
اصول SOLID برای اولین بار توسط دانشمند معروف کامپیوتر رابرت جی مارتین (با نام مستعار عمو باب) در مقاله خود در سال 2000 معرفی شد. اما مخفف SOLID بعدها توسط مایکل فیرز معرفی شد. عمو باب همچنین نویسنده کتاب های پرفروش Clean Code و Clean Architecture است و یکی از شرکت کنندگان “Agile Alliance” است.
در این مقاله، به بررسی SOLID چیست، پنج اصل SOLID در توسعه نرمافزار و نحوه پیادهسازی این اصول در پروژههای شیگرا میپردازیم. همچنین خواهید دید که این اصول چگونه میتوانند به بهبود کیفیت کد کمک کنند و کدنویسی شیگرا با SOLID را به رویکردی شفافتر و کارآمدتر برای طراحی نرمافزار تبدیل میکنند.
SOLID چیست؟
SOLID در واقع مخفف پنج اصل است که راهنمایی برای طراحی نرمافزار شیگرا ارائه میدهند. هدف این اصول ایجاد نرمافزارهایی است که ماژولار، قابل گسترش و قابل نگهداری باشند. این اصول به شکستن سیستمهای پیچیده به اجزای کوچکتر و مدیریتپذیرتر کمک میکنند و اطمینان میدهند که هر جزء وظیفه خاص خود را دارد.
SOLID مخفف موارد زیر میباشد:
- Single Responsibility Principle (اصل مسئولیت واحد)
- Open/Closed Principle (اصل باز/بسته)
- Liskov Substitution Principle (اصل جایگزینی لیسکوف)
- Interface Segregation Principle (اصل تفکیک رابط)
- Dependency Inversion Principle (اصل وارونگی وابستگی)
این اصول ستون فقرات یک طراحی شیگرای خوب هستند و به عنوان بهترین روشها در مهندسی نرمافزار شناخته میشوند. رعایت آنها منجر به کدهای تمیزتر و قابل نگهداریتر میشود که میتوانند با رشد سیستم توسعه یابند.
اصول پنجگانه SOLID در توسعه نرمافزار
همانطور که گفته شد 5 اصل SOLID به بهبود طراحی شی گرا کمک میکند. پس بیایید به بررسی هر کدام از این اصول و اینکه چگونه به طراحی بهتر نرمافزار کمک میکنند بپردازیم:
- اصل مسئولیت واحد: اصل مسئولیت واحد بیان می کند که یک کلاس باید یک کار را انجام دهد و بنابراین باید تنها یک دلیل برای تغییر داشته باشد. برای بیان این اصل به صورت فنی تر: فقط یک تغییر بالقوه (منطق پایگاه داده، منطق ورود به سیستم و غیره) در مشخصات نرم افزار باید بتواند بر مشخصات کلاس تأثیر بگذارد.
این بدان معنی است که اگر یک کلاس یک محفظه داده است، مانند یک کلاس Book یا یک کلاس Student، و دارای فیلدهایی در رابطه با آن موجودیت است، تنها زمانی باید تغییر کند که مدل داده را تغییر دهیم.
به طور مثال فرض کنید کلاسی به نام User دارید که هم دادههای کاربر را مدیریت میکند و هم عملیات احراز هویت را انجام میدهد. طبق SRP ، بهتر است این کلاس را به دو کلاس مجزا، یکی برای مدیریت اطلاعات کاربر و دیگری برای انجام احراز هویت تقسیم کنید. زیرا باعث میشود هر کلاس متمرکزتر و نگهداری آن آسانتر باشد.
- اصل باز/بسته (OCP): موجودات نرم افزاری (کلاس ها، ماژول ها، توابع و غیره) باید برای توسعه باز باشند، اما برای اصلاح بسته باشند. تأثیر اصل باز/بسته بر طراحی نسبتاً ساده است. توسعهدهندگان باید بتوانند ویژگیهای جدیدی را به یک پایگاه کد اضافه کنند در حالی که کد موجود را دست نخورده باقی میگذارند.
به طور مثال تصور کنید سیستمی دارید که انواع مختلف پرداختها مثلاً کارت اعتباری، را پردازش میکند. به جای تغییر کلاس پرداخت اصلی برای اضافه کردن روشهای جدید، میتوانید با افزودن زیرکلاسها برای هر روش پرداخت، سیستم را گسترش دهید.
- اصل جایگزینی لیسکوف :(LSP) اصل جایگزینی لیسکوف بیان میکند که اشیاء یک کلاس پایه باید بتوانند با اشیاء زیرکلاسهای آن جایگزین شوند بدون اینکه بر صحت برنامه تأثیر بگذارد. به عبارت دیگر، یک زیرکلاس باید بتواند جایگزین کلاس پایه خود شود، بدون اینکه رفتار غیرمنتظره ایجاد کند.
به عنوان مثال در نظر بگیرید کلاسی به نام Bird دارید که دارای متدی به نام fly است. کلاس Penguin ممکن است از Bird ارث ببرد، اما پنگوئنها نمیتوانند پرواز کنند. این نقض LSP است زیرا Penguin نمیتواند بدون شکستن منطق برنامه جایگزین Bird شود.
برای رعایت LSP، باید اطمینان حاصل کنید که کلاسهای مشتق شده رفتار کلاس والد را نقص نمیکنند. یک رویکرد بهتر این است که رفتار پرواز را از کلاس Bird جدا کنید.
- اصل تفکیک رابط (ISP): اصل جداسازی رابط بیان میکند که نباید اجباری به وابستگی مشتریان به رابطهایی باشند که از آنها استفاده نمیکنند. به عبارت دیگر، بهتر است به جای چند رابط بزرگ و عمومی، چندین رابط کوچک و خاص داشته باشیم.
فرض کنیدرابطی به نام Machine دارید که شامل متدهایی برای چاپ، اسکن و فکس کردن است. کلاس Printer نیازی به پیادهسازی متد scan() یا fax() ندارد و این نقض ISP است.
مطلب پیشنهادی: بهترین ویرایشگرهای کد که در 2024 باید بشناسید
برای رعایت ISP، باید رابط را به قسمتهای کوچکتر و خاصتر تقسیم کنید.
- اصل وارونگی وابستگی (DIP): اصل وارونگی وابستگی شامل دو قاعده است: اول اینکه ماژولهای سطح بالا نباید به ماژولهای سطح پایین وابسته باشند؛ هر دو باید به انتزاعها وابسته باشند. دوم، انتزاعها نباید به جزئیات وابسته باشند، بلکه جزئیات باید به انتزاعها وابسته شوند. این انتزاعها مانند چسبی عمل میکنند که ماژولهای مختلف را به هم متصل میکنند و به آنها انعطافپذیری میدهند تا بدون تأثیر بر یکدیگر تغییر کنند. از نمونههای این انتزاعات میتوان به دروازههای API در معماری میکروسرویسها اشاره کرد.
در مثال زیر کلاسی به نام Database است که به یک پیادهسازی خاص از MySQL وابسته است. برای رعایت DIP، لازم است کلاس Database به یک رابط کلیتر وابسته باشد تا بتوانید انعطافپذیری بیشتری در تغییر ارائهدهندههای پایگاه داده داشته باشید.
بهترین روشهای کدنویسی با SOLID
پیروی از اصول SOLID به توسعهدهندگان کمک میکند تا سیستمهایی ایجاد کنند که قابل نگهداری و انعطافپذیرتر باشند. برای موفقیت در این زمینه لازم است:
- کلاسها را بر یک مسئولیت واحد متمرکز کنید.
- رفتار را بدون تغییر در کد موجود گسترش دهید.
- اطمینان حاصل کنید که زیرکلاسها قواعد کلاس والد را نقض نمیکنند.
- از رابطهای کوچک و خاص استفاده کنید.
- به انتزاعها به جای پیادهسازیهای خاص تکیه کنید.
سخن پایانی
اصول SOLID، مانند چراغی در مسیر توسعه نرمافزار عمل میکنند و به توسعهدهندگان کمک میکنند تا با چالشهای پیچیدگی و تغییرات مداوم نرمافزار به شیوهای هوشمندانه برخورد کنند. با رعایت این اصول، میتوانید کدی بنویسید که نه تنها تمیز و منظم باشد، بلکه قابلیت توسعه، انعطافپذیری و مقیاسپذیری بالایی نیز داشته باشد. کدنویسی شیگرا با SOLID به شما این امکان را میدهد که نرمافزاری طراحی کنید که نه تنها در حال حاضر کارآمد است، بلکه در آینده نیز با تغییرات و نیازهای جدید بهخوبی سازگار میشود.
با بهکارگیری این اصول در پروژههای خود، نه تنها کیفیت و عملکرد نرمافزار را بهبود میبخشید، بلکه با ساختاری مقاوم و مدولار روبرو خواهید شد که با گذشت زمان فرسوده نمیشود. در نهایت، اصول SOLID در طراحی شیگرا، یک ابزار ارزشمند در جعبه ابزار هر توسعهدهنده حرفهای و مسیری به سوی طراحی نرمافزارهای پایدار و موفق میباشد.