اصول SOLID
اصول SOLID
بخشی از آموزش جامع C# و .NET 10
محتوای درس اصول SOLID
SOLID مجموعهای از اصول طراحی برای کاهش coupling و افزایش قابلیت تغییر است. این اصول قانون مطلق نیستند و باید متناسب با پیچیدگی واقعی سیستم به کار روند.
۱. SRP
Single Responsibility Principle میگوید یک Module باید یک دلیل اصلی برای تغییر داشته باشد.
مثال
class PriceCalculator{public decimal Total(decimal p,int q)=>p*q;}در این مثال، مفهوم «SRP» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۲. OCP
Open/Closed Principle بر توسعه رفتار از طریق Extension بدون تغییر مکرر کد پایدار تأکید دارد.
مثال
interface IDiscount{decimal Apply(decimal x);}
class Vip:IDiscount{public decimal Apply(decimal x)=>x*.85m;}در این مثال، مفهوم «OCP» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۳. LSP
Liskov Substitution میگوید Type مشتقشده باید بتواند بدون شکستن قرارداد جای Type پایه استفاده شود.
مثال
interface IShape{double Area();}
class Circle:IShape{public double Area()=>Math.PI;}در این مثال، مفهوم «LSP» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۴. ISP
Interface Segregation استفاده از Interfaceهای کوچک و متناسب با نیاز مصرفکننده را ترجیح میدهد.
مثال
interface IRead{string Read();}
interface IWrite{void Write(string x);}در این مثال، مفهوم «ISP» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۵. DIP
Dependency Inversion وابستگی لایههای سطح بالا به Abstraction را بهجای Concrete Implementation تشویق میکند.
مثال
class Service{private readonly ILogger _l;public Service(ILogger l)=>_l=l;}در این مثال، مفهوم «DIP» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۶. تعادل
بهکارگیری افراطی SOLID در پروژه کوچک میتواند Abstractionهای غیرضروری بسازد؛ هدف کاهش هزینه تغییر است.
مثال
// Introduce abstractions only around real change points.
Console.WriteLine("Prefer simple design first");در این مثال، مفهوم «تعادل» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۷. مثالهای عملی
public class OrderService
{
private readonly IPaymentGateway _paymentGateway;
public OrderService(IPaymentGateway paymentGateway)
{
_paymentGateway = paymentGateway;
}
}این نمونه عملی چند مفهوم فصل را در کنار هم قرار میدهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.
۸. خطاهای رایج
• ساخت Interface برای هر Class بدون نیاز
• برداشت SRP به معنی یک متد برای هر Class
• استفاده از SOLID بهعنوان هدف مستقل از نیاز سیستم
۹. نکات اجرایی
• نامها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.
• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.
• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.
۱۰. تمرین عملی
یک OrderService وابسته مستقیم به PaymentService را بازطراحی کنید تا از IPaymentGateway استفاده کند و پیادهسازی قابل جایگزینی باشد.
۱۱. جمعبندی
در این فصل، مبانی «اصول SOLID» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصلهای بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم میکند.