عنوان:

‫مستندسازی استاندارد و بدون حشو (XML Documentation) با GitHub Copilot


نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۵/۲۹ ۱۲:۵۴
آدرس: www.dntips.ir
نگارش مستندات درون‌کدی (XML Documentation Comments) برای APIهای عمومی، کتابخانه‌ها (NuGet Packages) و اینترفیس‌های کلیدی یک الزام حرفه‌ای است؛ با این حال، نوشتن دستی کامنت‌های تکراری معمولاً به کامنت‌های سطحی و بی‌خاصیت (مانند Gets the order برای متد GetOrder) ختم می‌شود. چنین کامنت‌هایی نه‌تنها باری از دوش مصرف‌کننده کد برنمی‌دارند، بلکه خوانایی ساختار فایل را نیز کاهش می‌دهند.
هدف از نگارش XML Documentation، توصیف قرارداد (Contract)، رفتار در زمان تهی بودن (Nullability) و استثناها (Exceptions) است، نه تکرار بدیهی نام متد و پارامترها. Copilot ابزاری ایده‌آل برای حذف این فرآیند فرسایشی و تولید کامنت‌های مهندسی و استاندارد است.

ساختار پرامپت مهندسی برای تولید مستندات XML

امضای متد یا اینترفیس زیر را در نظر بگیرید:
public async Task<OrderResponse?> GetOrderAsync(
    int orderId, 
    CancellationToken cancellationToken)
برای دریافت یک مستند فنی و مفید، پرامپت را به این صورت تنظیم کنید:
برای این متد/اینترفیس عمومی #C مستندات استاندارد و فشرده XML Documentation تولید کن.
الزامات و محورهای مستندسازی:
۱. هدف متد (Summary): کارکرد واقعی متد را بدون تکرار کلمه به کلمه نام آن شرح بده.
۲. پارامترها (): نقش، فرمت یا شرایط مورد انتظار هر پارامتر را مشخص کن.
۳. رفتار بازگشتی (): رفتار دقیق نوع بازگشتی، به‌ویژه شرایط بازگرداندن یا مجموعه‌های خالی را شفاف کن.
۴. خطاها و استثناها (): استثناهای احتمالی نظیر OperationCanceledException، ArgumentOutOfRangeException یا خطاهای دامنه را همراه با تگ مربوطه مستند کن.
۵. از توضیح جزئیات بدیهی پیاده‌سازی داخلی و ایجاد کدهای تکراری و بی‌ارزش (Boilerplate) پرهیز کن.

مقایسه مستندسازی ضعیف در برابر مستندسازی قراردادی

مستندسازی ضعیف و بی‌ارزش (طوطی‌وار):
/// <summary>
/// Gets the order async.
/// </summary>
/// <param name="orderId">The order id.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The order response.</returns>
(این کامنت هیچ ارزشی فراتر از خواندن امضای متد به توسعه‌دهنده ارائه نمی‌دهد.)

مستندسازی مهندسی و غنی‌شده:
/// <summary>
/// Retrieves the detailed information of an existing order by its unique identifier.
/// </summary>
/// <param name="orderId">The positive integer identifier representing the targeted order.</param>
/// <param name="cancellationToken">A token to monitor for cancellation requests during the asynchronous I/O operation.</param>
/// <returns>
/// A task representing the asynchronous operation. The task result contains the <see cref="OrderResponse"/> 
/// matching the identifier, or <see langword="null"/> if no corresponding order is found.
/// </returns>
/// <exception cref="ArgumentOutOfRangeException">Thrown when <paramref name="orderId"/> is less than or equal to zero.</exception>
/// <exception cref="OperationCanceledException">Thrown if the operation is canceled via the <paramref name="cancellationToken"/>.</exception>

یکپارچه‌سازی مستندات با ابزارهای تولید Swagger / OpenAPI

در پروژه‌های ASP.NET Core، فعال‌سازی تگ در فایل .csproj باعث می‌شود این توضیحات مستقیماً وارد فایل Swagger JSON شده و در Swagger UI یا اسناد OpenAPI مصرف‌کنندگان API نمایش داده شوند.

برای Endpointهای کنترلر، می‌توانید از Copilot بخواهید تگ‌های را نیز اضافه کند:
/// <summary>
/// Retrieves an order by its unique identifier.
/// </summary>
/// <param name="orderId" example="1042">The unique identifier of the order.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <response code="200">Returns the requested order data.</response>
/// <response code="404">If no order matches the provided identifier.</response>
/// <response code="400">If the provided orderId is invalid.</response>

نکات تکمیلی برای کامنت‌نویسی تمیز

  • استفاده از تگ‌های کمکی ( و ): این تگ‌ها در IDE (مانند Visual Studio و Rider) به صورت هایپرلینک به انواع داده تبدیل می‌شوند و تجربه ناوبری (IntelliSense Navigation) بهتری فراهم می‌کنند.
  • ارزیابی تطابق با رفتار واقعی: خروجی هوش مصنوعی را همیشه با منطق کد بسنجید؛ اگر متدی استثنایی پرتاب نمی‌کند یا هرگز مقدار null بازنمی‌گرداند، آن تگ را حذف کنید تا مستندات گمراه‌کننده نباشند.
  • دستور اختصاصی /doc در Copilot Chat: با انتخاب امضای متد و ارسال دستور /doc concise contract-based می‌توانید بلافاصله کامنت‌های ساختاریافته دریافت کنید.

قاعده کلیدی: مستندسازی باکیفیت شرح «قرارداد رفتار و استثناها» است، نه بازگویی نام متد؛ از Copilot برای غنی‌سازی توضیحات استفاده کنید تا IntelliSense ابزاری واقعی برای راهنمایی توسعه‌دهندگان باشد.