اصل Single Responsibility به زبان ساده!

پویان سلمانی
1402/06/07

در دنیای پیچیده و گستردهٔ برنامهنویسی، ایجاد کدهای قابل نگهداری، تغییرپذیر، و با کیفیت بالا، همواره یک چالش بزرگ برای توسعهدهندگان بوده است. یکی از ابزارهای کارآمد برای بهبود کیفیت کد و تسهیل ایجاد تغییرات، اصل تک وظیفگی یا یگانگی مسئولیت یا به اختصار SRP (Single Responsibility Principle) است. این اصل، یکی از اصول SOLID در برنامهنویسی شیگرا، توسط رابرت مارتین ارائه شده است.
چرا به Single Responsibility نیاز داریم؟

تصور کنید یک کلاس در برنامهیتان دارید که مسئولیتهای مختلفی از جمله محاسبات، ذخیرهسازی دادهها، و ارتباط با پایگاه داده را بر عهده دارد. اینجاست که مشکلات آغاز میشوند. هر تغییر در یکی از این مسئولیتها ممکن است تبدیل به لایهلایه تغییرات در کد شود و به دنبال آن منجر به از دست دادن تمیزی و قابلیتخوانایی کد شود. همچنین این تغییرات میتواند اثرات جانبی ناخواستهای بر رفتار کلاس ایجاد کند.
Single Responsibility به چه معناست؟
اصل یگانگی مسئولیت بیان میکند که هر کلاس یا ماژول باید فقط یک مسئولیت داشته باشد. به عبارت دیگر، یک کلاس باید فقط یک دلیل برای تغییر داشته باشد. این به معنای تقسیم کلاسها به گونهای است که به هر کلاس تنها یک مسئولیت واگذار شود. این تقسیم واضح، باعث افزایش قابلیتخوانایی، نگهداری، و تغییرپذیری کد میشود.
مزایای اصل یگانگی مسئولیت
- قابلیت نگهداری بهتر : وقتی هر کلاس تنها یک مسئولیت دارد، به راحتی میتوانید تغییرات مرتبط با آن مسئولیت را بدون تداخل با بخش های دیگر کد انجام دهید.
- تغییرپذیری بالا : اگر نیاز به اصلاح یا توسعه یک بخش خاص دارید، تأثیر این تغییرات تنها بر روی یک کلاس محدود میشود و سایر بخشها تحت تأثیر قرار نمیگیرند.
- قابلیت تستپذیری : با تمرکز بر یک مسئولیت واحد، امکان تست کردن کد بهطور جداگانه برای هر مسئولیت آسانتر میشود.

فرض کنید شما یک برنامهای برای مدیریت سفارشات آنلاین دارید. مهم ترین کلاس های ما در این مثال دو کلاس مشتریان و سفارشات خواهد بود. سپس از اصل SRP برای جداسازی وظایف استفاده می کنیم.
ابتدا، کلاس مشتریها را ایجاد میکنیم:
class Customer { public string Name { get; set; } public string Email { get; set; } }
سپس کلاس سفارشات را ایجاد می کنیم
class Order { public int OrderId { get; set; } public decimal TotalAmount { get; set; } }
سپس برای محاسبه قیمت کلی سفارشات، یک کلاس مستقل بنام OrderCalculator ایجاد میکنیم:
class OrderCalculator { public decimal CalculateTotalOrderAmount(List <Order> orders) { decimal totalAmount = 0; foreach (var order in orders) { totalAmount += order.TotalAmount; } return totalAmount; } }
حالا، هر کلاس تنها به یک مسئولیت اختصاص دارد. کلاس Customer فقط مشخصات مشتریان را نگهداری میکند، کلاس Order فقط اطلاعات سفارشات را دارد، و کلاس OrderCalculator فقط برای محاسبه قیمت کلی سفارشات استفاده میشود.
این مثال نشان میدهد که با تجزیه و تحلیل وظایف و جداسازی آنها به کلاسهای جداگانه، اصل Single Responsibility Principle رعایت شده و کد بهبود قابلیتخوانایی و تغییرپذیری را خواهد داشت.
اصل Single Responsibility یکی از اصول مهم در برنامهنویسی شیگرا است که به توسعهدهندگان کمک میکند کدهایی با کیفیت و قابلیت تغییرپذیری بالا ایجاد کنند. با تمرکز هر کلاس بر یک مسئولیت واحد، انعطافپذیری و نگهداری کد بهبود مییابد و فرآیند توسعه بهبود مییابد.
khosh be halet