فصل 37 از 40 درس 1 از 1

اصول 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» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.