اصول SOLID در برنامه نویسی - اصل S
اصول SOLID در برنامه نویسی
اصل مسئولیت واحد (Single Responsibility Principle)
ابتدا لازم به ذکر است که برای اینکه دقیقتر به این موضوع بپردازیم و مثالهای بیشتری بزنیم، هر کدام از اصلها را در یک مقاله توضیح می دهیم.
اصل مسئولیت واحد یا Single Responsibility Principle (SRP) یکی از پنج اصل SOLID در برنامهنویسی شیءگرا است که توسط رابرت مارتین (Uncle Bob) معرفی شده است. این اصل بیان میکند که هر کلاس باید تنها یک دلیل برای تغییر داشته باشد، به این معنا که هر کلاس باید تنها یک مسئولیت مشخص داشته باشد و تمام متدها و ویژگیهای آن کلاس در راستای انجام همان مسئولیت باشند.
این اصل به ما کمک میکند تا کدهایی تمیز، قابل نگهداری و قابل تست بنویسیم. در این مقاله، به بررسی این اصل با مثالهای کاربردی در زبان برنامهنویسی C# میپردازیم و اشارهای به آموزشهای مدرس بهمن آبادی در دوره جامع برنامه نویسی وبخواهیم داشت که این مفاهیم را بهصورت کامل توضیح داده است.
مفهوم اصل مسئولیت واحد
اصل SRP به این معناست که یک کلاس باید تنها یک کار یا مسئولیت را انجام دهد. اگر یک کلاس بیش از یک مسئولیت داشته باشد، تغییرات در یکی از مسئولیتها ممکن است باعث ایجاد مشکل در مسئولیتهای دیگر شود. این امر کد را شکنندهتر کرده و نگهداری آن را دشوار میکند.
برای مثال، فرض کنید کلاسی دارید که هم وظیفه ذخیرهسازی اطلاعات کاربر را بر عهده دارد و هم وظیفه ارسال ایمیل به کاربر. اگر در آینده نیاز به تغییر منطق ارسال ایمیل باشد، ممکن است بهطور ناخواسته منطق ذخیرهسازی اطلاعات نیز تحت تأثیر قرار گیرد.
مثال نقض اصل SRP
بیایید با یک مثال شروع کنیم که اصل SRP را نقض میکند:
مشکل این کد چیست؟
کلاس UserService در اینجا دو مسئولیت دارد:
ثبت کاربر (ذخیرهسازی اطلاعات در دیتابیس).
ارسال ایمیل خوشآمدگویی.
اگر در آینده بخواهیم منطق ارسال ایمیل را تغییر دهیم (مثلاً از SMTP به یک سرویس دیگر مثل SendGrid مهاجرت کنیم)، باید کلاس UserService را تغییر دهیم. این تغییر ممکن است روی منطق ثبت کاربر تأثیر بگذارد، حتی اگر قصد تغییر آن را نداشته باشیم. این نقض اصل SRP است.
اصلاح کد با رعایت اصل SRP
برای رعایت اصل SRP، باید مسئولیتها را از هم جدا کنیم. هر کلاس باید تنها یک مسئولیت داشته باشد. در اینجا، میتوانیم دو کلاس مجزا ایجاد کنیم: یکی برای مدیریت کاربر و دیگری برای ارسال ایمیل.
توضیحات کد اصلاحشده:
- UserRepository: این کلاس تنها مسئول ذخیرهسازی اطلاعات کاربر است.
- EmailService: این کلاس تنها مسئول ارسال ایمیل است.
- UserService: این کلاس بهعنوان یک هماهنگکننده (Orchestrator) عمل میکند و از دو کلاس دیگر برای انجام فرآیند ثبتنام استفاده میکند.
اکنون اگر نیاز به تغییر منطق ارسال ایمیل باشد، تنها کلاس EmailService تغییر میکند و کلاس UserRepository دستنخورده باقی میماند. این ساختار کد را ماژولارتر و قابل نگهداریتر میکند.
مثال پیشرفتهتر: مدیریت سفارشات
فرض کنید در یک سیستم تجارت الکترونیک، کلاسی برای مدیریت سفارشات داریم. بیایید ابتدا نسخهای را ببینیم که اصل SRP را نقض میکند:
مشکل این کد:
کلاس Order سه مسئولیت مجزا دارد:
ذخیرهسازی سفارش.
محاسبه مالیات.
ارسال اعلان به مشتری.
این نقض اصل SRP است، زیرا تغییرات در هر یک از این مسئولیتها (مثلاً تغییر فرمول مالیات یا روش ارسال اعلان) باعث تغییر کلاس Order میشود.
اصلاح کد:
مزایای کد اصلاحشده:
ماژولاریتی: هر کلاس تنها یک مسئولیت دارد.
قابلیت تست: تست هر کلاس بهصورت جداگانه آسانتر است.
انعطافپذیری: افزودن قابلیتهای جدید (مثلاً روشهای جدید محاسبه مالیات) بدون تغییر سایر کلاسها ممکن است.
چرا اصل SRP مهم است؟
نگهداری آسانتر: با جداسازی مسئولیتها، تغییرات در یک بخش از سیستم تأثیری بر بخشهای دیگر ندارد.
تستپذیری بهتر: کلاسهایی که تنها یک مسئولیت دارند، راحتتر تست میشوند.
خوانایی بالاتر: کدهایی که مسئولیتهای مشخصی دارند، برای توسعهدهندگان جدید قابلفهمتر هستند.
کاهش پیچیدگی: جداسازی مسئولیتها باعث میشود هر کلاس سادهتر و متمرکزتر باشد.
آموزشهای مهندس بهمن آبادی
مدرس بهمن آبادی در دوره جامع برنامهنویسی وب خود، بهصورت مفصل به اصول SOLID و بهویژه اصل مسئولیت واحد پرداخته است. ایشان با مثالهای کاربردی و پروژههای واقعی، نشان دادهاند که چگونه استفاده از این اصل میتواند کیفیت کد را بهبود بخشد و توسعه نرمافزار را سادهتر کند. در این دوره، مباحثی مانند طراحی کلاسهای ماژولار، استفاده از الگوهای طراحی (Design Patterns) و پیادهسازی اصول SOLID در پروژههای وب با زبانهایی مثل C# بهصورت عملی آموزش داده شده است.
اگر به دنبال یادگیری عمیق این مفاهیم هستید، توصیه میشود به دورههای ایشان مراجعه کنید که با زبانی ساده و مثالهای واقعی، این اصول را توضیح دادهاند. (مشاهده سرفصلهای دوره و نظرات دانشجویان)