Midسختی 2 از ۵· در 93٪ مصاحبههای این حوزه پرسیده شده
اصل Single Responsibility به چه معناست و مثال بزنید؟
☆نشان کردنپاسخ کوتاه
هر کلاس باید فقط یک مسئولیت/دلیل برای تغییر داشته باشد؛ مثلاً کلاسی که هم گزارش میسازد و هم آن را چاپ میکند، دو مسئولیت دارد.
پاسخ کامل
اگر یک کلاس InvoiceService هم محاسبهٔ مبلغ فاکتور را انجام دهد و هم آن را در دیتابیس ذخیره کند و هم ایمیل بفرستد، هر تغییر در منطق ایمیل باعث تغییر کلاسی میشود که ربطی به ایمیل ندارد. باید این مسئولیتها به کلاسهای جدا (InvoiceCalculator, InvoiceRepository, EmailSender) تقسیم شوند.
مثال کد
// بد: چند مسئولیت در یک کلاس
class InvoiceService
{
public decimal Calculate(Invoice i) { /* ... */ return 0; }
public void SaveToDb(Invoice i) { /* ... */ }
public void SendEmail(Invoice i) { /* ... */ }
}
نکته مهم
"یک دلیل برای تغییر" معیار بهتری از "یک متد" است؛ یک کلاس میتواند چند متد کوچک مرتبط با یک مسئولیت داشته باشد.
اشتباه رایج
❌ تفسیر اشتباه Single Responsibility به «هر کلاس فقط یک متد داشته باشد».
