عنوان:

‫بهینه‌سازی تجربه کار با GitHub Copilot در VSCode


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۳/۱۳ ۰۹:۳۳
آدرس: www.dntips.ir
GitHub Copilot به عنوان یک دستیار برنامه‌نویس هوش مصنوعی (AI Pair Programmer)، نحوه کدنویسی ما را دگرگون کرده است. این ابزار قدرتمند می‌تواند در سرعت بخشیدن به توسعه، پیشنهاد کد، و حتی یادگیری مفاهیم جدید به ما کمک کند. اما برای بهره‌برداری حداکثری از قابلیت‌های Copilot، به خصوص در اکوسیستم پیچیده و گسترده .NET، ضروری است که بدانیم چگونه زمینه (کانتکست Context) لازم را به طور مؤثر در اختیار آن قرار دهیم. این مقاله به بررسی روش‌های ارائه کانتکست به GitHub Copilot می‌پردازد تا توسعه‌دهندگان دات‌نت بتوانند پیشنهادهای دقیق‌تر و مرتبط‌تری دریافت کنند و در نهایت، بهره‌وری و کیفیت کد خود را افزایش دهند.

اهمیت زمینه (کانتکست) در تعامل با GitHub Copilot
هنگامی که با GitHub Copilot از طریق واسط چت آن تعامل می‌کنید، یکی از مهم‌ترین بخش‌هایی که باید به آن توجه کنید، قسمت مراجع (References) است. این بخش نشان می‌دهد که Copilot برای تولید کد پیشنهادی خود، چه فایل‌ها و اطلاعاتی را مدنظر قرار داده است. درک این موضوع حیاتی است، زیرا کیفیت و ارتباط پیشنهادهای Copilot مستقیماً به کیفیتی زمینه‌ای که در اختیارش قرار می‌گیرد، بستگی دارد.

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

فایلcopilot-instructions.md: راهنمای استراتژیک برای Copilot
یکی از قدرتمندترین روش‌ها برای ارائه کانتکست سطح بالا و پایدار به Copilot، استفاده از یک فایل خاص به نام copilot-instructions.md است. این فایل باید در پوشه .github ریشه پروژه شما قرار گیرد. پس از قرارگیری در این مسیر، Copilot به طور خودکار محتویات آن را در هر بار تعامل از طریق چت، به عنوان بخشی از کانتکست خود لحاظ می‌کند.
محتوای این فایل می‌تواند شامل موارد زیر باشد:
  • شرح کلی پروژه: توضیح دهید که پروژه در مورد چیست، چه اهدافی را دنبال می‌کند و از چه بخش‌های اصلی تشکیل شده است. برای مثال، در یک پروژه .NET، می‌توانید مشخص کنید که آیا با یک برنامه تحت وب ASP.NET Core، یک سرویس Worker، یک برنامه دسکتاپ WPF یا Maui، یا یک کتابخانه کلاس سر و کار دارید.
  • الگوهای معماری و ساختاری: اگر از الگوهای خاصی مانند Domain-Driven Design (DDD)، CQRS، یا معماری چندلایه (N-Tier Architecture) استفاده می‌کنید، به آن‌ها اشاره کنید. همچنین، نحوه ساختاربندی کد، مانند قراردادهای نام‌گذاری یا سازماندهی پوشه‌ها را شرح دهید.
  • ترجیحات کدنویسی: مشخص کنید که تیم شما چه سبک کدنویسی را ترجیح می‌دهد. به عنوان مثال، در یک پروژه C#، می‌توانید تأکید کنید که:
  • همیشه از برنامه‌نویسی ناهمگام (Asynchronous Programming) با async/await برای عملیات ورودی/خروجی (I/O-bound operations) استفاده شود.
  • تزریق وابستگی (Dependency Injection) برای سرویس‌ها به درستی پیاده‌سازی شود.
  • در صورت امکان، از آخرین ویژگی‌های زبان C# و فریم‌ورک .NET (مثلاً .NET 8 یا نسخه‌های جدیدتر) استفاده گردد.
  • در استفاده از LINQ، سینتکس کوئری (Query Syntax) بر سینتکس متد (Method Syntax) ارجحیت دارد یا بالعکس.
  • اشتباهات رایج یا الگوهای نامطلوب: اگر متوجه شده‌اید که Copilot به طور مکرر پیشنهادهایی ارائه می‌دهد که با استانداردهای پروژه شما همخوانی ندارد (مثلاً استفاده از کلاس‌های استاتیک به جای سرویس‌های تزریق شده، یا ایجاد فیلدهای عمومی به جای خصوصیات Properties با Getter/Setter)، می‌توانید این موارد را در copilot-instructions.md گوشزد کنید تا از تکرار آن‌ها جلوگیری شود.

ایجاد و نگهداری این فایل به اشتراک‌گذاری دانش و هماهنگی بین اعضای تیم نیز کمک شایانی می‌کند، زیرا همه توسعه‌دهندگان از یک راهنمای واحد برای تعامل با Copilot بهره‌مند می‌شوند.

نکته بسیار مهم در تهیه این فایل، رعایت اختصار و تمرکز بر اطلاعات سطح بالا و کلیدی است. از آنجایی که Copilot در هر تعامل، محدودیت در تعداد توکن‌هایی (Tokens) که می‌تواند پردازش کند دارد، ارائه اطلاعات بیش از حد و غیرضروری می‌تواند منجر به نادیده گرفته شدن برخی جزئیات مهم یا سردرگمی Copilot شود. بنابراین، محتوای این فایل باید برای اکثر قریب به اتفاق تعاملات شما با Copilot مفید و مرتبط باشد.

گنجاندن فایل‌های حیاتی پروژه در زمینه Copilot
علاوه بر فایل copilot-instructions.md که به صورت خودکار شناسایی می‌شود، گاهی نیاز است فایل‌های مشخص دیگری را نیز به طور دائم در کانتکست Copilot قرار دهید. این مورد به خصوص زمانی اهمیت پیدا می‌کند که با بخش‌هایی از سیستم کار می‌کنید که درک ساختار آن‌ها برای Copilot ضروری است، مانند شمای پایگاه داده.

در متن اصلی، به فایل شمای Prisma (یک Object Relational Mapper یا ORM برای TypeScript) اشاره شده است. در دنیای .NET، معادل این فایل می‌تواند شامل موارد زیر باشد:
  • کلاس DbContext در Entity Framework Core: این کلاس قلب تپنده EF Core است و تعریف موجودیت‌ها (Entities)، روابط بین آن‌ها، و پیکربندی اتصال به پایگاه داده را در خود جای داده است.
  • فایل‌های مدل (Model) یا موجودیت (Entity): کلاس‌هایی که ساختار جداول پایگاه داده شما را منعکس می‌کنند.
  • فایل‌های DTO (Data Transfer Object): کلاس‌هایی که برای انتقال داده بین لایه‌های مختلف برنامه استفاده می‌شوند.
  • فایل‌های تعریف سرویس‌های کلیدی یا واسط‌ها (Interfaces).
برای اینکه Copilot همیشه اینگونه فایل‌های حیاتی را "ببیند"، می‌توانید مسیر آن‌ها را در تنظیمات VS Code (فایل settings.json) مشخص کنید. این تنظیمات می‌توانند در سطح پروژه (Workspace Settings) یا در سطح کاربر (User Settings) اعمال شوند. با افزودن مسیر این فایل‌ها به تنظیمات، تضمین می‌کنید که Copilot درک دقیق‌تری از ساختار داده‌ای و اجزای کلیدی پروژه .NET شما خواهد داشت و در نتیجه، پیشنهادهای مرتبط‌تری در زمینه کار با داده‌ها، منطق کسب‌وکار و فراخوانی سرویس‌ها ارائه خواهد داد.

به عنوان مثال، بخشی از فایل settings.json شما می‌تواند به شکل زیر باشد:
"github.copilot.chat.extendedContext": {
    "include": [
        "src/MyProject.Data/MyDbContext.cs",
        "src/MyProject.Core/Models/**/*.cs", // شامل تمام فایل‌های cs در پوشه Models و زیرپوشه‌های آن
        "docs/architecture-overview.md" // حتی یک فایل Markdown با توضیحات معماری
    ]
}
در اینجا، github.copilot.chat.extendedContext (توجه: نام دقیق این تنظیم ممکن است در نسخه‌های مختلف افزونه Copilot یا بر اساس تنظیمات خاص متفاوت باشد، لطفاً مستندات رسمی را بررسی کنید) برای گنجاندن فایل‌های مشخص استفاده شده است. هدف اصلی، آگاه‌سازی Copilot از فایل‌هایی است که به طور مکرر در توسعه پروژه به آن‌ها ارجاع داده می‌شود.

مثال عملی و ملاحظات برای توسعه‌دهندگان .NET
فرض کنید در یک پروژه .NET Core، قصد دارید یک سرویس جدید برای مدیریت "رویدادهای جمع‌آوری کمک مالی" (Fundraisers) ایجاد کنید، مشابه مثالی که در متن اصلی برای یک وبسایت برگزاری مسابقات دو مطرح شده است. شما از Copilot می‌خواهید که یک سرویس با قابلیت جستجو بر اساس شناسه (ID) و شناسه مسابقه (Race ID) ایجاد کند.

در copilot-instructions.md می‌توانید موارد زیر را برای یک پروژه .NET ذکر کنید:
# Project Overview
This is a race management platform built using ASP.NET Core 8 Web API and Entity Framework Core for data access.

# Coding Standards
- Use `async/await` for all I/O-bound operations.
- Services should be registered for Dependency Injection in `Program.cs`.
- Follow SOLID principles.
- Prefer LINQ Query Syntax for complex queries.
- All public APIs must be documented using XML documentation comments.

# Common Pitfalls to Avoid
- Do not use `DateTime.Now`; use a time abstraction service for testability.
- Avoid returning `IEnumerable<T>` from API controllers; use `ActionResult<IEnumerable<T>>` or `IAsyncEnumerable<T>`.
در settings.json می‌توانید فایل DbContext خود را بگنجانید:
"github.copilot.chat.extendedContext": { // نام تنظیم بر اساس مستندات Copilot
    "include": [
        "src/RaceManagement.Data/RaceManagementDbContext.cs"
    ]
}
سپس، در چت Copilot می‌توانید درخواست خود را مطرح کنید:
"Create a C# service class named FundraiserService with an interface IFundraiserService. It should include methods to get a fundraiser by its ID and get all fundraisers for a specific race ID. Use RaceManagementDbContext for data access and ensure methods are asynchronous."
با ارائه این سطح از کانتکست، Copilot می‌تواند کدی تولید کند که به احتمال بسیار زیاد با ساختار پروژه، الگوهای کدنویسی و نیازمندی‌های خاص شما در اکوسیستم .NET همخوانی بیشتری دارد. به جای دریافت یک کلاس عمومی و ساده، کدی دریافت خواهید کرد که احتمالاً شامل تزریق RaceManagementDbContext از طریق سازنده، استفاده از async/await و شاید حتی پیاده‌سازی اولیه واسط خواهد بود.


خودآزمایی
کدام یک از موارد زیر بهترین توصیف برای هدف اصلی فایل copilot-instructions.md در یک پروژه است؟
الف) تعریف شمای دقیق پایگاه داده برای استفاده Copilot.
ب) ارائه راهنمایی‌های سطح بالا، استانداردهای کدنویسی و توصیف کلی پروژه به Copilot.
ج) نگهداری تاریخچه تغییرات و کامیت‌های پروژه برای Copilot.
د) ذخیره تنظیمات شخصی کاربر برای افزونه GitHub Copilot.


نتیجه‌گیری
توانایی GitHub Copilot در درک زمینه و تولید کد متناسب با آن، کلید بهره‌وری حداکثری از این ابزار است. با استفاده هوشمندانه از فایل copilot-instructions.md برای ارائه راهنمایی‌های استراتژیک و سطح بالا و همچنین گنجاندن فایل‌های حیاتی پروژه مانند DbContext یا مدل‌های داده در تنظیمات, توسعه‌دهندگان .NET می‌توانند Copilot را به یک همکار برنامه‌نویس واقعاً آگاه و مفید تبدیل کنند. این رویکرد نه تنها به تولید کد سریع‌تر و دقیق‌تر کمک می‌کند، بلکه باعث ارتقاء کیفیت کلی نرم‌افزار و تسهیل همکاری تیمی می‌شود. با صرف زمان اندکی برای تنظیم این زمینه‌ها، می‌توانید صرفه‌جویی قابل توجهی در زمان توسعه و رفع اشکال در دراز مدت داشته باشید.


پاسخ خودآزمایی
ب) ارائه راهنمایی‌های سطح بالا، استانداردهای کدنویسی و توصیف کلی پروژه به Copilot.


مشاهده مطلب اصلی