زندگی روزمره بسیاری از ما به وبسایتها گره خورده است، از وبسایت فروشگاهی گرفته تا وبسایتهای آموزشی و بانکی و غیره. تمام این وبسایتها با هدف رفع نیاز کاربر و ایجاد تجربه کاربر مثبت ایجاد شدهاند. و تجربه کاربر مثبت در نهایت به نفع شرکت، سازمان یا کسبوکار است.
اما در پشتصحنه این وبسایتها چه میگذرد؟ چه اتفاقی در کدهای جاوا اسکریپت وبسایت میافتد که باعث میشود وبسایت کاراتر شود؟ برنامهنویسان و توسعهدهندگان وب باید از چه اصولی پیروی کنند تا وبسایت نهایی هم از نظر فنی و هم کاربری بدون مشکل کار کند؟
در این مقاله به معرفی اصول SOLID میپردازیم. اصولی که برنامهنویس و توسعهدهنده سایت و نرمافزار با رعایت آنها، محصولی قابل توسعه، قابل نگهداری و به طور کلی قابل فهم طراحی کند.
بیشتر بخوانید:
“راهنمای جامع آموزش زبان برنامه نویسی جاوا اسکریپت (۹ مرحله)“
آنچه در این نوشته خواهیم داشت
SOLID چیست؟
در برنامهنویسی مفهوم SOLID به مجموعهای از اصول و قواعد طراحی نرمافزار اشاره دارد. این اصول با هدف ساخت نرمافزارهای قابل نگهداری، قابل توسعه، و قابل فهم تعریف شدهاند.
کلمه SOLID مخفف پنج مفهوم زیر است:
S: Single Responsibility Principle
O: Open-Closed Principle
L: Liskov Substitution Principle
I: Interface Segregation Principle
D: Dependency Inversion Principle
اصول SOLID به برنامهنویسان کمک میکند تا محصول نهایی (وبسایت، اپلیکیشن یا نرمافزار) قابلیت نگهداری، گسترشپذیری و تستپذیری داشته باشد و خوانایی آن راحتتر باشد. به عبارت دیگر برنامهنویس و توسعهدهنده با رعایت این اصول برنامههایی مینویسد که بهتر قابل مدیریتاند.
همچنین، در آینده نیازمندیهای جدید را به راحتی میتوان به آن اضافه کرد. بنابراین، اصول SOLID مستقل از زبانهای برنامهنویسی هستند و در تمامی زبانهای برنامهنویسی و شی گرا مانند C، C#، Java، Java Script، Python و غیره قابل استفادهاند.
نحوه اعمال و پیادهسازی این اصول ممکن است بسته به خصوصیات و ویژگیهای هر زبان برنامهنویسی کمی متفاوت باشد. اما اهداف و مفهوم اصول SOLID برای همه زبانهای برنامهنویسی یکسان است.
در ادامه به معرفی پنج اصل SOLID خواهیم پرداخت.
بیشتر بخوانید: “جاوا یا جاوا اسکریپت؟“
۱. Single Responsibility Principle (اصل تکمسئولیتی)
اصل اول SOLID به عنوان اصل تکمسئولیتی شناخته میشود. این اصل میگوید که هر قسمت از کد باید فقط مسئولیت یک وظیفه را داشته باشد، نه بیشتر. یک کد از بخشهای مختلفی تشکیل شده است. هر بخش یک و فقط یک مسئولیت خاص را بر عهده دارد. و با کنار هم قرار گرفتن این بخشها، کد نهایی سادهتر و مرتبتر خواهد بود و تغییر آن در آینده راحتتر انجام خواهد شد.
فرض کنید که میخواهید یک کلاس (Class) ساده برای مدیریت فروش یک فروشگاه آنلاین بنویسید. کلاسی به نام `OrderManager` دارید که وظیفهاش مدیریت سفارشها است. با استفاده از اصل تکمسئولیتی، میتوانید کلاس `OrderManager` را به چند کلاس جداگانه مانند `OrderValidator` برای اعتبارسنجی سفارشها، `OrderProcessor` برای پردازش سفارشها و `OrderNotifier` برای اطلاع رسانی درباره سفارشها تقسیم کنید.
با استفاده از اصل Single Responsibility Principle در واقع هر کلاس مسئولیت خاص خود را دارد. و تغییر در یک کلاس تأثیر کم و محدودی بر روی سایر کلاسها دارد.
اگر ورودی یکی از توابع تغییر کند، بقیه کلاسها به طور مستقل تحت تأثیر قرار نمیگیرند. مگر اینکه تغییری در ساختار یا عملکرد کلی برنامه ایجاد شود. مثلا، اگر ساختار دادههای سفارش تغییر کند، احتمالاً نیاز به تغییر در کلاس `OrderValidator` برای اعتبارسنجی دادههای جدید وجود دارد. اما این تغییر تأثیری بر روی کلاسهای دیگر مانند `OrderProcessor` یا `OrderNotifier` نخواهد گذاشت.
با این تقسیمبندی، هر کلاس مسئولیت خاص خود را دارد. این باعث میشود کدها بهتر قابل تعمیم و تغییر باشند و همچنین قابلیت تست و نگهداری آن راحتتر باشد.
۲. Open-Closed Principle (اصل باز-بسته)
اصل دوم از SOLID میگوید که برنامه باید برای توسعه باز باشد. یعنی بشود عملکرد آن را تغییر داد و ویژگیهای جدیدی به آن اضافه کرد. اما باید برای تغییرات خارجی بسته بماند. تغییرات خارجی تغییراتی هستند که در برنامه اعمال میشوند و منجر به تغییر رفتار برنامه در سمت کاربر یا سایر سیستمها میشوند.
برای مثال، فرض کنید شما یک برنامه مدیریت فروش دارید که قابلیت افزودن محصولات جدید به سیستم را دارد. اگر اصل باز بودن/بسته بودن را رعایت کنید، برنامه باید به راحتی قابلیت اضافه کردن محصولات جدید را داشته باشد. به عبارت دیگر، برنامه باید باز باشد تا بتوانیم به راحتی تغییرات را در آن اعمال کنیم و ویژگیهای جدیدی را به آن اضافه کنیم.
همچنین، برنامه باید برای تغییرات خارجی بسته بماند. به این معنی که تغییراتی که در برنامه اعمال میکنیم، نباید تأثیرات منفی و غیرمنتظرهای بر دیگر بخشهای برنامه بگذارد.
با رعایت اصل باز بودن/بسته بودن، برنامه قابل توسعه و انعطافپذیر خواهد بود. و در عین حال پایداری و عملکرد صحیح خود را حفظ خواهد کرد.
۳. Liskov Substitution Principle (اصل جایگزینی لیسکوف)
اصل جایگزینی لیسکوف میگوید که آبجکتهای هر کلاس فرزند که از یک کلاس والد ارثبری کرده باشد، باید با آبجکتهای کلاس والد قابل جایگزین باشد. یعنی بتوان آن را به جای کلاس والد استفاده کرد بدون اینکه خطا یا تغییری در عملکرد برنامه ایجاد شود.
فرض کنید برنامهای برای مدیریت حیوانات خانگی دارید. در این برنامه، شما دو کلاس دارید: کلاس “Pet” و کلاس “Dog” که از کلاس “Pet” به ارث برده شده است.
اگر تابعی برای غذا خوردن تحت عنوان ()eat داشته باشید که یک شیء از کلاس “Pet” را به عنوان ورودی میگیرد و عملیات غذاخوردن را بر روی آن اجرا میکند، با رعایت اصل Liskov، باید بتوانید بدون هیچ مشکلی از یک شیء از کلاس “Dog” نیز استفاده کنید.
۴. Interface Segregation Principle (اصل جداسازی اینترفیسها)
اصل چهارم SOLID میگوید رابطها (Interfaces) باید به گونهای طراحی شوند که کلاسها به جای اینکه به تمام رابطها وابسته باشند، فقط به آن بخشی از رابط که نیاز است، وابسته باشند.
به طور کلی در برنامهنویسی، رابط یا Interface به مجموعهای از قوانین و مشخصاتی گفته میشود که یک کلاس یا شیء باید دنبال کند تا وظایف خود را انجام دهد.
رابطها مانند یک نوع قرارداد بین کلاسها عمل میکنند. آنها تعیین میکنند که چه متدها و عملیاتی باید در یک کلاس موجود باشد و چه متغیرها و ویژگیهایی باید در آن تعریف شوند.
با توجه به تعریف Interface، اصل چهارم میگوید که باید رابطها را جداگانه و با تمرکز بر نیازمندیهای هر کلاس طراحی کنیم. این بدان معناست که هر کلاس فقط به رابطهایی که برای انجام وظایف خود نیاز دارد، وابسته است و بقیه بخشها از این رابطها استفاده نمیکنند.
این باعث افزایش سازگاری، کاهش وابستگی عیرضروری و افزایش انعطافپذیری سیستم میشود.
۵. Dependency Inversion Principle (اصل وارونگی وابستگی)
شاید درک اصل پنجم کمی دشوارتر از اصول قبل به نظر برسد. به طور ساده، برنامهنویس و توسعهدهنده باید تمام تلاش خود را برای به حداقل رساندن وابستگیها میان کلاسها، ماژولها و آبجکتهای سطح بالا با ماژولهای سطح پایین انجام دهد.
این کار باعث میشود که کلاسها به صورت مستقل از یکدیگر قابل استفاده و توسعه باشند. به عبارت دیگر، هدف اصل وارونگی وابستگی این است که برنامهنویس به گونهای کدزنی کند که تغییرات در یک بخش از کد تأثیر کمتری روی بخشهای دیگر داشته باشد.
بیشتر بخوانید: “مهمترین مهارتها برای برنامهنویسان وب و اپلیکیشن (۲۰۲۳)“
جمعبندی و نتیجهگیری
اصول پنجگانهٔ SOLID مجموعهای از اصول مهم در برنامهنویسیاند که به برنامهنویس و توسعهدهنده کمک میکنند تا برنامهای قابل توسعه، قابل نگهداری و قابل فهم را طراحی کند.
هر یک از این اصول با هدفهای خاصی که دارند، برنامهنویس را راهنمایی میکنند چگونه کلاسها، ماژولها و آبجکتها را سازماندهی کند تا برنامهای با بازدهی بالا و منعطف بنویسد. همچنین، یکی از مزایای مهم رعایت اصول SOLID قابلیت اضافه کردن و تغییر دادن بخشهای مختلف برنامه با حداقل تأثیر بر سایر بخشهاست. این به برنامهنویس اجازه میدهد تا به راحتی و با اطمینان بیشتر، قابلیتها را گسترش و بهبود بخشهای موجود را انجام دهد.
این اصول در ابتدا ممکن است کمی دشوار به نظر برسند. اما با تمرین میشود بر آن مسلط شد. باید توجه داشت که SOLID فقط مجموعهای از اصول است. و این برنامهنویس است که مسئولیت پیادهسازی یا رعایت آنها را در برنامهنویسی دارد. در نتیجه قبل از هر چیز برنامهنویس باید مهارت کامل برنامهنویسی و نحوه پیادهسازی مفاهیم برنامهنویسی را داشته باشد.
در سرفصلهای دوره آموزش جاوا اسکریپت و برنامهنویسی پایتون تمامی مفاهیم و مهارتهایی که مهارتآموزان باید به عنوان یک متخصص برنامهنویسی کسب کنند، تعریف شده است.