برنامه نویسی

SOLID: اصل باز-بسته در سی شارپ

Summarize this content to 400 words in Persian Lang

مقدمه

می‌گوید، “موجودات نرم‌افزاری (کلاس‌ها، ماژول‌ها، توابع و غیره) باید برای توسعه باز باشند، اما برای اصلاح بسته باشند.

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

در این مقاله با مثال های کاربردی به نحوه پیاده سازی OCP در سی شارپ می پردازیم.

چرا اصل باز-بسته؟

هنگامی که کد “باز برای توسعه” است، می توان آن را به راحتی برای افزودن ویژگی های جدید بدون ایجاد مزاحمت در کد موجود تنظیم کرد. با این حال، “بسته بودن برای اصلاح” کد را از عوارض جانبی ناخواسته ای که می تواند از تغییر منطق اصلی ناشی شود محافظت می کند. این رویکرد پایداری نرم افزار را بهبود می بخشد و تست و نگهداری را آسان تر می کند.

بیایید نگاهی به چند مثال بیاندازیم تا بفهمیم OCP چگونه کار می کند و چگونه آن را در سی شارپ پیاده سازی کنیم.

یک مثال غیر سازگار با OCP

تصور کنید ما در حال ساختن یک سیستم پردازش پرداخت هستیم. در اینجا یک کلاس ساده وجود دارد که پرداخت ها را بر اساس روش های مختلف پرداخت پردازش می کند:

کد بد ❌

public class PaymentProcessor
{
public void ProcessPayment(string paymentMethod)
{
if (paymentMethod == “CreditCard”)
{
// Process credit card payment
Console.WriteLine(“Processing credit card payment…”);
}
else if (paymentMethod == “PayPal”)
{
// Process PayPal payment
Console.WriteLine(“Processing PayPal payment…”);
}
else if (paymentMethod == “Bitcoin”)
{
// Process Bitcoin payment
Console.WriteLine(“Processing Bitcoin payment…”);
}
else
{
throw new ArgumentException(“Invalid payment method.”);
}
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در حالی که این کد کار می کند، OCP را نقض می کند زیرا هر بار که یک روش پرداخت جدید اضافه می کنیم (مانند GooglePay یا ApplePay، ما باید آن را اصلاح کنیم ProcessPayment روش این رویکرد مستعد خطا است و می تواند منجر به ایجاد کد شکننده با رشد برنامه شود.

Refactoring برای پیروی از اصل باز-بسته

برای تغییر این کد برای پیروی از اصل باز-بسته، می‌توانیم از چندشکلی استفاده کنیم. ما یک رابط به نام ایجاد خواهیم کرد IPaymentMethod با یک ProcessPayment روش هر نوع پرداخت کلاس مخصوص به خود را دارد که این رابط را پیاده سازی می کند.

مرحله 1: تعریف یک رابط

ما با تعریف یک شروع می کنیم IPaymentMethod رابط:

public interface IPaymentMethod
{
void ProcessPayment();
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 2: اجرای کلاس های بتن برای هر روش پرداخت

در مرحله بعد، برای هر نوع پرداختی که پیاده سازی می شود، کلاس های جداگانه ایجاد می کنیم IPaymentMethod:

public class CreditCardPayment : IPaymentMethod
{
public void ProcessPayment()
{
Console.WriteLine(“Processing credit card payment…”);
}
}

public class PayPalPayment : IPaymentMethod
{
public void ProcessPayment()
{
Console.WriteLine(“Processing PayPal payment…”);
}
}

public class BitcoinPayment : IPaymentMethod
{
public void ProcessPayment()
{
Console.WriteLine(“Processing Bitcoin payment…”);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: کلاس PaymentProcessor را تغییر دهید

اکنون، به جای رسیدگی مستقیم به انواع پرداخت، PaymentProcessor استفاده خواهد کرد IPaymentMethod رابط. این باعث می شود کلاس برای توسعه باز باشد اما برای اصلاح بسته شود.

public class PaymentProcessor
{
public void ProcessPayment(IPaymentMethod paymentMethod)
{
paymentMethod.ProcessPayment();
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با استفاده از کد Refactored

بیایید نحوه استفاده از این کد بازسازی شده را ببینیم:

کد خوب✅

class Program
{
static void Main()
{
PaymentProcessor paymentProcessor = new PaymentProcessor();

IPaymentMethod creditCardPayment = new CreditCardPayment();
IPaymentMethod paypalPayment = new PayPalPayment();
IPaymentMethod bitcoinPayment = new BitcoinPayment();

paymentProcessor.ProcessPayment(creditCardPayment);
paymentProcessor.ProcessPayment(paypalPayment);
paymentProcessor.ProcessPayment(bitcoinPayment);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این ساختار، اضافه کردن یک نوع پرداخت جدید (به عنوان مثال، GooglePayPayment) فقط نیاز به ایجاد یک کلاس جدید دارد که پیاده سازی کند IPaymentMethod، بدون تغییر PaymentProcessor.

مزایای پیروی از OCP

انعطاف پذیری بهبود یافته: قابلیت‌های جدید را می‌توان بدون تغییر کد موجود اضافه کرد و پایگاه کد را سازگارتر کرد.
خطاهای کاهش یافته: با کلاس‌های جداگانه برای هر روش پرداخت، خطاها کمتر به بخش‌های نامرتبط کد منتشر می‌شوند.
قابلیت نگهداری پیشرفته: درک کد آسان‌تر است و وظایف نگهداری قابل مدیریت‌تر است.
تست تسهیل شده: هر کلاس نوع پرداخت را می توان به طور مستقل آزمایش کرد و فرآیند آزمایش را ساده می کند.

نتیجه گیری

اصل باز-بسته طراحی کدی را تشویق می‌کند که با تغییر سازگار باشد و در برابر شکستگی مقاوم باشد. در این مقاله نحوه پیاده سازی OCP در سی شارپ را با مثال هایی از جمله پردازش پرداخت و ثبت گزارش توضیح داده ایم. با استفاده از رابط‌ها و چندشکلی، می‌توانید کد خود را برای توسعه باز و برای اصلاح بسته کنید – که منجر به یک پایگاه کد قوی‌تر، انعطاف‌پذیرتر و قابل نگهداری می‌شود.

یک تشکر بزرگ از شما، رفیق! برای خواندن و حمایت. 💜 💖 💛

مقدمه

می‌گوید، “موجودات نرم‌افزاری (کلاس‌ها، ماژول‌ها، توابع و غیره) باید برای توسعه باز باشند، اما برای اصلاح بسته باشند.

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

در این مقاله با مثال های کاربردی به نحوه پیاده سازی OCP در سی شارپ می پردازیم.

چرا اصل باز-بسته؟

هنگامی که کد “باز برای توسعه” است، می توان آن را به راحتی برای افزودن ویژگی های جدید بدون ایجاد مزاحمت در کد موجود تنظیم کرد. با این حال، “بسته بودن برای اصلاح” کد را از عوارض جانبی ناخواسته ای که می تواند از تغییر منطق اصلی ناشی شود محافظت می کند. این رویکرد پایداری نرم افزار را بهبود می بخشد و تست و نگهداری را آسان تر می کند.

باز بسته

بیایید نگاهی به چند مثال بیاندازیم تا بفهمیم OCP چگونه کار می کند و چگونه آن را در سی شارپ پیاده سازی کنیم.

یک مثال غیر سازگار با OCP

تصور کنید ما در حال ساختن یک سیستم پردازش پرداخت هستیم. در اینجا یک کلاس ساده وجود دارد که پرداخت ها را بر اساس روش های مختلف پرداخت پردازش می کند:

کد بد ❌

public class PaymentProcessor
{
    public void ProcessPayment(string paymentMethod)
    {
        if (paymentMethod == "CreditCard")
        {
            // Process credit card payment
            Console.WriteLine("Processing credit card payment...");
        }
        else if (paymentMethod == "PayPal")
        {
            // Process PayPal payment
            Console.WriteLine("Processing PayPal payment...");
        }
        else if (paymentMethod == "Bitcoin")
        {
            // Process Bitcoin payment
            Console.WriteLine("Processing Bitcoin payment...");
        }
        else
        {
            throw new ArgumentException("Invalid payment method.");
        }
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در حالی که این کد کار می کند، OCP را نقض می کند زیرا هر بار که یک روش پرداخت جدید اضافه می کنیم (مانند GooglePay یا ApplePay، ما باید آن را اصلاح کنیم ProcessPayment روش این رویکرد مستعد خطا است و می تواند منجر به ایجاد کد شکننده با رشد برنامه شود.

Refactoring برای پیروی از اصل باز-بسته

برای تغییر این کد برای پیروی از اصل باز-بسته، می‌توانیم از چندشکلی استفاده کنیم. ما یک رابط به نام ایجاد خواهیم کرد IPaymentMethod با یک ProcessPayment روش هر نوع پرداخت کلاس مخصوص به خود را دارد که این رابط را پیاده سازی می کند.

مرحله 1: تعریف یک رابط

ما با تعریف یک شروع می کنیم IPaymentMethod رابط:

public interface IPaymentMethod
{
    void ProcessPayment();
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 2: اجرای کلاس های بتن برای هر روش پرداخت

در مرحله بعد، برای هر نوع پرداختی که پیاده سازی می شود، کلاس های جداگانه ایجاد می کنیم IPaymentMethod:

public class CreditCardPayment : IPaymentMethod
{
    public void ProcessPayment()
    {
        Console.WriteLine("Processing credit card payment...");
    }
}

public class PayPalPayment : IPaymentMethod
{
    public void ProcessPayment()
    {
        Console.WriteLine("Processing PayPal payment...");
    }
}

public class BitcoinPayment : IPaymentMethod
{
    public void ProcessPayment()
    {
        Console.WriteLine("Processing Bitcoin payment...");
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: کلاس PaymentProcessor را تغییر دهید

اکنون، به جای رسیدگی مستقیم به انواع پرداخت، PaymentProcessor استفاده خواهد کرد IPaymentMethod رابط. این باعث می شود کلاس برای توسعه باز باشد اما برای اصلاح بسته شود.

public class PaymentProcessor
{
    public void ProcessPayment(IPaymentMethod paymentMethod)
    {
        paymentMethod.ProcessPayment();
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با استفاده از کد Refactored

بیایید نحوه استفاده از این کد بازسازی شده را ببینیم:

کد خوب✅

class Program
{
    static void Main()
    {
        PaymentProcessor paymentProcessor = new PaymentProcessor();

        IPaymentMethod creditCardPayment = new CreditCardPayment();
        IPaymentMethod paypalPayment = new PayPalPayment();
        IPaymentMethod bitcoinPayment = new BitcoinPayment();

        paymentProcessor.ProcessPayment(creditCardPayment);
        paymentProcessor.ProcessPayment(paypalPayment);
        paymentProcessor.ProcessPayment(bitcoinPayment);
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این ساختار، اضافه کردن یک نوع پرداخت جدید (به عنوان مثال، GooglePayPayment) فقط نیاز به ایجاد یک کلاس جدید دارد که پیاده سازی کند IPaymentMethod، بدون تغییر PaymentProcessor.

مزایای پیروی از OCP

  1. انعطاف پذیری بهبود یافته: قابلیت‌های جدید را می‌توان بدون تغییر کد موجود اضافه کرد و پایگاه کد را سازگارتر کرد.

  2. خطاهای کاهش یافته: با کلاس‌های جداگانه برای هر روش پرداخت، خطاها کمتر به بخش‌های نامرتبط کد منتشر می‌شوند.

  3. قابلیت نگهداری پیشرفته: درک کد آسان‌تر است و وظایف نگهداری قابل مدیریت‌تر است.

  4. تست تسهیل شده: هر کلاس نوع پرداخت را می توان به طور مستقل آزمایش کرد و فرآیند آزمایش را ساده می کند.

نتیجه گیری

اصل باز-بسته طراحی کدی را تشویق می‌کند که با تغییر سازگار باشد و در برابر شکستگی مقاوم باشد. در این مقاله نحوه پیاده سازی OCP در سی شارپ را با مثال هایی از جمله پردازش پرداخت و ثبت گزارش توضیح داده ایم.
با استفاده از رابط‌ها و چندشکلی، می‌توانید کد خود را برای توسعه باز و برای اصلاح بسته کنید – که منجر به یک پایگاه کد قوی‌تر، انعطاف‌پذیرتر و قابل نگهداری می‌شود.

یک تشکر بزرگ از شما، رفیق! برای خواندن و حمایت. 💜 💖 💛

باز بسته

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا