CodeShot
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 به «هر کلاس فقط یک متد داشته باشد».