عنوان:

‫مدیریت دقیق زمینه (Context) با متغیرهای ارجاع # در GitHub Copilot


نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۵/۲۹ ۱۲:۰۸
آدرس: www.dntips.ir
کیفیت تحلیل‌ها و پیشنهادات Copilot وابستگی مستقیمی به محتوای پنجره کانتکست (Context Window) دارد. تکیه صرف بر تب‌های باز محیط توسعه یا کدهای انتخاب‌شده (Selection)، اغلب اطلاعات ناقص یا نامرتبطی به مدل تزریق می‌کند. استفاده از متغیرهای ارجاع صریح با کاراکتر # در محیط Copilot Chat، به شما امکان می‌دهد تا گراف ارتباطی میان فایل‌ها، ساختارها و اینترفیس‌های پروژه را به صورت دقیق و هدفمند برای هوش مصنوعی بازسازی کنید.

ارتقای کیفیت تحلیل از ارزیابی کورکورانه به بررسی رابطه‌ای

توسعه‌دهندگان در بسیاری از موارد کدهایی را بدون ارائه قراردادها به Copilot می‌سپارند. بررسی یک کلاس سرویس بدون دسترسی به Entity یا Repository مربوطه، ارزش اعتبارسنجی پایینی دارد.

رویکرد ضعیف و مبهم:
«آیا این سرویس درست نوشته شده است؟»
(هوش مصنوعی بدون دانستن تایپ‌های بازگشتی ریپازیتوری یا ساختار مدل پایگاه داده، فقط به بررسی خطاهای نگارشی و سینتکسی بسنده می‌کند.)

رویکرد مهندسی و مبتنی بر کانتکست:
کلاس #OrderService.cs را در تقابل با #IOrderRepository.cs، #Order.cs و #OrderDto.cs بازبینی کن.
اهداف بررسی:
  • نقض قواعد معماری و نشت منطق بیزینس به لایه‌های نامرتبط
  • فراخوانی‌های اضافی و ناکارآمد به پایگاه داده (مثل کوئری‌های تکراری یا مشکلات N+1)
  • الگوهای نادرست Asynchronous (شامل async void، استفاده نابجا از .Result یا عدم انتقال CancellationToken)
  • مشکلات عدم قطعیت تهی‌پذیری (C# Nullable Reference Types)
  • مدیریت نادرست تراکنش‌ها و مرزهای تغییر وضعیت در دیتابیس

نمونه سناریوی کاربردی: کشف باگ‌های ظریف در معماری دات‌نت

فرض کنید پیاده‌سازی زیر در OrderService.cs قرار دارد:
public class OrderService(IOrderRepository repository, IUnitOfWork unitOfWork) : IOrderService
{
    public async Task<OrderDto> CompleteOrderAsync(Guid orderId, CancellationToken cancellationToken)
    {
        var order = await repository.GetByIdAsync(orderId, cancellationToken);
        
        // بروزرسانی وضعیت بدون اعتبارسنجی Nullability
        order.Status = OrderStatus.Completed; 
        
        await repository.UpdateAsync(order, cancellationToken);
        await unitOfWork.SaveChangesAsync(cancellationToken);

        // واکشی مجدد و غیرضروری از دیتابیس
        var updatedOrder = await repository.GetByIdAsync(orderId, cancellationToken);

        return new OrderDto(updatedOrder.Id, updatedOrder.TotalAmount, updatedOrder.Status);
    }
}
زمانی که ارجاعات #Order.cs و #IOrderRepository.cs ضمیمه پرامپت می‌شوند، کوپایلوت متوجه موارد زیر می‌شود:
  • متد GetByIdAsync در ریپازیتوری خروجی Task برمی‌گرداند؛ عدم بررسی وضعیت null در خط ۵ منجر به خطای بالقوه NullReferenceException و هشدار کامپایلر C# (CS8602) می‌شود.
  • فراخوانی دوم GetByIdAsync پس از SaveChangesAsync یک درخواست شبکه/دیتابیس اضافی و بی‌مورد است، زیرا شیء order از قبل در حافظه موجود است و نیازی به واکشی مجدد ندارد.

انواع متغیرهای ارجاعی پرکاربرد در Visual Studio و VS Code
  • #file:FileName.cs: تزریق کامل متن یک فایل به کانتکست (حیاتی برای ارتباط سرویس‌ها و اینترفیس‌ها).
  • #editor: متمرکز کردن هوش مصنوعی روی فایل یا تب فعلی در محیط ویرایشگر.
  • #selection: محدود کردن دامنه تحلیل تنها به خطوط انتخاب‌شده جهت جلوگیری از سردرگمی مدل در فایل‌های حجیم.
  • #sym:SymbolName: ارجاع مستقیم به یک متد، کلاس، enum یا رکورد خاص بدون نیاز به ارسال تمام فایل.
  • #terminalLastCommand: استفاده از خروجی ترمینال برای عیب‌یابی سریع خطاهای dotnet build یا dotnet test.

چه زمانی باید از ارجاعات صریح استفاده کرد؟

استفاده از ارجاعات چندگانه زمانی بیشترین اثربخشی را دارد که تعامل بین چند ماژول مطرح باشد:
  • تست‌نویسی: ارجاع هم‌زمان کلاس هدف (#PaymentService.cs) و اینترفیس‌های وابسته برای تولید دقیق Mockها با Moq یا NSubstitute.
  • بازآفرینی کد (Refactoring): اطمینان از اینکه تغییر یک متد در لایه هسته، امضای متدها در لایه‌های بالا را دچار شکست نمی‌کند.
  • بررسی معماری: مقایسه پیاده‌سازی با قوانین لایه‌بندی در Clean Architecture یا DDD.

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