CodeShot

Single Responsibility Principle (SRP) در مقابل Open/Closed Principle (OCP)

SRP می‌گوید هر کلاس باید فقط یک دلیل برای تغییر داشته باشد، یعنی فقط یک مسئولیت مشخص را بر عهده بگیرد؛ OCP می‌گوید کلاس‌ها باید برای توسعه باز و برای تغییر بسته باشند، یعنی بتوان رفتار جدید اضافه کرد بدون این‌که کد موجود و تست‌شده را تغییر داد.

ویژگیSingle Responsibility Principle (SRP)Open/Closed Principle (OCP)
تمرکز اصلیتعداد مسئولیت یک کلاسافزودن رفتار بدون تغییر کد قبلی
ابزار رایج پیاده‌سازیتفکیک کلاس‌هاInterface و Polymorphism
نقض رایجکلاس خدای همه‌کارهتغییر مکرر کد قدیمی برای رفتار جدید

کِی از Single Responsibility Principle (SRP) استفاده کنیم؟

وقتی یک کلاس چند دلیل مختلف برای تغییر دارد (مثلاً هم منطق کسب‌وکار و هم فرمت گزارش را در خود دارد)، باید آن را به چند کلاس با مسئولیت واحد تقسیم کنید.

کِی از Open/Closed Principle (OCP) استفاده کنیم؟

وقتی نیاز دارید رفتار جدیدی اضافه کنید (مثل یک نوع تخفیف جدید) بدون این‌که مجبور شوید کد کلاس‌های موجود و تست‌شده را تغییر دهید؛ معمولاً با Interface و Polymorphism پیاده‌سازی می‌شود.

مثال Single Responsibility Principle (SRP)

// SRP: هر کلاس فقط یک مسئولیت
class OrderCalculator { public decimal Total(Order o) {...} }
class OrderPrinter { public string Print(Order o) {...} }

مثال Open/Closed Principle (OCP)

// OCP: افزودن رفتار جدید بدون تغییر کد قبلی
interface IDiscount { decimal Apply(decimal price); }
class BlackFridayDiscount : IDiscount { ... } // جدید، بدون تغییر قبلی‌ها

اشتباه رایج

اشتباه رایج فکر کردن این است که SRP و OCP یک چیز هستند؛ SRP درباره تعداد مسئولیت‌های یک کلاس است، در حالی که OCP درباره امکان افزودن رفتار جدید بدون دستکاری کد قدیمی است؛ یک کلاس می‌تواند SRP را رعایت کند اما همچنان OCP را نقض کند.

جمع‌بندی

با SRP هر کلاس را تک‌مسئولیتی نگه دارید و با OCP طوری طراحی کنید که افزودن رفتار جدید نیازمند تغییر کد قبلی نباشد؛ این دو اصل معمولاً با هم و مکمل یکدیگر به‌کار می‌روند.