عنوان:

‫مدرن‌سازی هدفمند کدهای قدیمی #C با GitHub Copilot


نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۵/۲۹ ۱۲:۲۷
آدرس: www.dntips.ir
زبان #C طی نسخه‌های اخیر دستخوش تحولات ساختاری چشمگیری شده است؛ از این رو پروژه‌های قدیمی پر از ساختارهای پرحجم (Verbose)، بررسی‌های دستی و تکراری برای مقادیر تهی، عبارات سنتی switch و تعریف فیلدهای پشتیبان (Backing Fields) غیرضروری هستند. ارتقای کدهای قدیمی بدون تعریف چارچوب می‌تواند منجر به شکست در زمان اجرا (Runtime Breaking Changes) یا تغییر در رفتار مدیریت مقادیر تهی (Nullability) شود. هدف از مدرن‌سازی، صرفاً استفاده از سینتکس جدید نیست؛ بلکه ارتقای ایمنی، شفافیت و نگه‌داری آسان‌تر کد با تکیه بر ویژگی‌های مدرن زبان است.

ساختار پرامپت مهندسی برای ارتقای کدهای قدیمی

یک نمونه کد با ساختارهای قدیمی #C را در نظر بگیرید:
public class CustomerService
{
    private readonly IRepository _repository;

    public CustomerService(IRepository repository)
    {
        _repository = repository;
    }

    public string GetCustomerSummary(Customer customer)
    {
        if (customer != null)
        {
            var name = customer.Name;
            if (name != null)
            {
                return name.Trim();
            }
        }
        return "Unknown";
    }
}
پرامپت بهینه‌سازی و ارتقا:
این کلاس #C قدیمی را با استفاده از قابلیت‌های مدرن بازنویسی و مدرن‌سازی کن.
قیود و الزامات فنی:
۱. رفتار زمان اجرا (Runtime Behavior) و خروجی‌ها بدون تغییر حفظ شوند.
۲. از ویژگی‌های مدرن (مانند Primary Constructors، Nullable Reference Types و Pattern Matching) در صورت افزایش شفافیت استفاده شود.
۳. پیامدهای فعال‌سازی Nullable Reference Types (NRT) و تغییر قراردادها را توضیح بده.
۴. هر تغییری که ممکن است رفتار لایه اجرایی یا تخصیص حافظه را تغییر دهد، به صورت مشخص پرچم‌گذاری (Flag) کن.
۵. از انتزاع‌های بی‌مورد و سینتکس‌های گمراه‌کننده پرهیز کن.

کالبدشکافی تغییرات و نمونه بازنویسی‌شده

با اعمال پرامپت مهندسی، کد بالا به شکل زیر مدرن‌سازی می‌شود:
namespace MyApp.Services;

// ۱. استفاده از Primary Constructor جهت کاهش کدهای Boilerplate
public sealed class CustomerService(IRepository repository)
{
    // ۲. فعال‌سازی NRT و استفاده از بررسی مستقیم و امن مقادیر تهی
    public string GetCustomerSummary(Customer? customer)
    {
        return customer?.Name?.Trim() switch
        {
            { Length: > 0 } validName => validName,
            _ => "Unknown"
        };
    }
}
تحلیل تغییرات اعمال‌شده:
  • استفاده از Primary Constructors: تعریف پارامتر مستقیماً در اعلان کلاس، متغیرهای پشتیبان سنتی را حذف کرده و خوانایی را افزایش می‌دهد.
  • بررسی‌های Null-Conditional و Pattern Matching: زنجیره طولانی ifهای تودرتو جای خود را به تطبیق الگو داده که وضعیت رشته خالی ("") و مقادیر تهی (null) را به صورت شفاف و یکپارچه مدیریت می‌کند.
  • انطباق با NRT: با مشخص کردن Customer? در امضای متد، کامپایلر وضعیت ورودی را صراحتاً کنترل کرده و هشدارهای مربوط به ارجاعات تهی احتمالی را قبل از کامپایل آشکار می‌سازد.

مهم‌ترین قابلیت‌های مدرن #C برای مدرن‌سازی هدفمند
  • مجموعه‌سازها (Collection Expressions): جایگزینی new List یا new int[] { ... } با براکت‌های ساده [1, 2, 3].
  • عبارات Switch و الگوهای مشخصه (Switch Expressions & Property Patterns): حذف ساختارهای طولانی و خطاپذیر switch / case.
  • ساختارهای رکورد و انواع غیرقابل‌تغییر (Records & Init-only Setters): جایگزینی DTOهای قدیمی و پرحجم با record یا readonly record struct.
  • فضای نام تک‌فایلی (File-scoped Namespaces): حذف یک لایه تورفتگی اضافی (Indentation) در سرتاسر فایل‌های پروژه.

هشدارهای مهم در جریان مدرن‌سازی
  • از مدرن‌سازی کورکورانه بپرهیزید: ویژگی‌های جدید #C به صورت خودکار کد بهتری نمی‌سازند؛ اگر استفاده از یک الگوی مدرن باعث کاهش خوانایی برای تیم می‌شود، ساختار سنتی ارجحیت دارد.
  • تغییر در رفتار تخصیص حافظه (Boxing/Unboxing): جایگزینی بدون دقت انواع داده یا استفاده ناصحیح از الگوها می‌تواند باعث تخصیص پنهان در حافظه Heap شود.
  • تغییرات ظریف زمان اجرا: ساده‌سازی بررسی‌های تهی با عملگر ? یا الگوها نباید ارزیابی منطقی شروط (Short-circuit Evaluation) یا ترتیب پرتاب استثناها (Exceptions) را ناخواسته دستخوش تغییر کند.

قاعده کلیدی: کد را زمانی مدرن کنید که به افزایش ایمنی در برابر خطاهای زمان اجرا، سادگی در نگه‌داری و یکدستی معماری پروژه کمک کند، نه صرفاً برای استفاده از جدیدترین ویژگی‌های نگارشی زبان.