Чи потрібна документація XML-коментарів?


10

Раніше я любив вимагати коментарів XML для документації. З тих пір я передумав з двох основних причин:

  1. Як і хороший код, методи повинні бути зрозумілими.
  2. На практиці більшість коментарів XML - це марний шум, який не надає додаткової цінності.

Багато разів ми просто використовуємо GhostDoc для генерування загальних коментарів, і саме це я маю на увазі під марним шумом:

    /// <summary>
    /// Gets or sets the unit of measure.
    /// </summary>
    /// <value>
    /// The unit of measure.
    /// </value>
    public string UnitOfMeasure { get; set; }

Для мене це очевидно. Сказавши, що, якщо були спеціальні інструкції для включення, ми повинні абсолютно використовувати коментарі XML.

Мені подобається цей уривок із цієї статті :

Іноді вам потрібно буде написати коментарі. Але, це має бути винятком не з правила. Коментарі можна використовувати лише тоді, коли вони виражають щось, що неможливо виразити в коді. Якщо ви хочете написати елегантний код, прагніть усунути коментарі, а замість цього напишіть код самодокументування.

Я помиляюся, вважаючи, що ми повинні використовувати коментарі XML лише тоді, коли код недостатньо, щоб пояснити себе самостійно?

Я вважаю, що це хороший приклад, коли коментарі XML роблять гарний код некрасивим. Він займає такий клас, як цей ...

public class RawMaterialLabel : EntityBase
{
    public long     Id                      { get; set; }
    public string   ManufacturerId          { get; set; }
    public string   PartNumber              { get; set; }
    public string   Quantity                { get; set; }
    public string   UnitOfMeasure           { get; set; }
    public string   LotNumber               { get; set; }
    public string   SublotNumber            { get; set; }
    public int      LabelSerialNumber       { get; set; }
    public string   PurchaseOrderNumber     { get; set; }
    public string   PurchaseOrderLineNumber { get; set; }
    public DateTime ManufacturingDate       { get; set; }
    public string   LastModifiedUser        { get; set; }
    public DateTime LastModifiedTime        { get; set; }
    public Binary   VersionNumber           { get; set; }

    public ICollection<LotEquipmentScan> LotEquipmentScans { get; private set; }
}

... І перетворює це на це:

/// <summary>
/// Container for properties of a raw material label
/// </summary>
public class RawMaterialLabel : EntityBase
{
    /// <summary>
    /// Gets or sets the id.
    /// </summary>
    /// <value>
    /// The id.
    /// </value>
    public long Id { get; set; }

    /// <summary>
    /// Gets or sets the manufacturer id.
    /// </summary>
    /// <value>
    /// The manufacturer id.
    /// </value>
    public string ManufacturerId { get; set; }

    /// <summary>
    /// Gets or sets the part number.
    /// </summary>
    /// <value>
    /// The part number.
    /// </value>
    public string PartNumber { get; set; }

    /// <summary>
    /// Gets or sets the quantity.
    /// </summary>
    /// <value>
    /// The quantity.
    /// </value>
    public string Quantity { get; set; }

    /// <summary>
    /// Gets or sets the unit of measure.
    /// </summary>
    /// <value>
    /// The unit of measure.
    /// </value>
    public string UnitOfMeasure { get; set; }

    /// <summary>
    /// Gets or sets the lot number.
    /// </summary>
    /// <value>
    /// The lot number.
    /// </value>
    public string LotNumber { get; set; }

    /// <summary>
    /// Gets or sets the sublot number.
    /// </summary>
    /// <value>
    /// The sublot number.
    /// </value>
    public string SublotNumber { get; set; }

    /// <summary>
    /// Gets or sets the label serial number.
    /// </summary>
    /// <value>
    /// The label serial number.
    /// </value>
    public int LabelSerialNumber { get; set; }

    /// <summary>
    /// Gets or sets the purchase order number.
    /// </summary>
    /// <value>
    /// The purchase order number.
    /// </value>
    public string PurchaseOrderNumber { get; set; }

    /// <summary>
    /// Gets or sets the purchase order line number.
    /// </summary>
    /// <value>
    /// The purchase order line number.
    /// </value>
    public string PurchaseOrderLineNumber { get; set; }

    /// <summary>
    /// Gets or sets the manufacturing date.
    /// </summary>
    /// <value>
    /// The manufacturing date.
    /// </value>
    public DateTime ManufacturingDate { get; set; }

    /// <summary>
    /// Gets or sets the last modified user.
    /// </summary>
    /// <value>
    /// The last modified user.
    /// </value>
    public string LastModifiedUser { get; set; }

    /// <summary>
    /// Gets or sets the last modified time.
    /// </summary>
    /// <value>
    /// The last modified time.
    /// </value>
    public DateTime LastModifiedTime { get; set; }

    /// <summary>
    /// Gets or sets the version number.
    /// </summary>
    /// <value>
    /// The version number.
    /// </value>
    public Binary VersionNumber { get; set; }

    /// <summary>
    /// Gets the lot equipment scans.
    /// </summary>
    /// <value>
    /// The lot equipment scans.
    /// </value>
    public ICollection<LotEquipmentScan> LotEquipmentScans { get; private set; }
}

2
Я б стверджував, що XML - це страшний вибір для цієї мети. Це занадто багатослівний і загальний для використання. Ознайомтеся з реструктуризованим текстом та сфінксом щодо мови розмітки, яка вбудовується в коментарі, не роблячи їх нечитабельними.
Латті

2
@Lattyware: VisualStudio підтримує цей стиль за замовчуванням, додаткові плагіни та інструменти не потрібні. Коментарі, створені таким чином, відразу видно у спливаючих підказках.
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner Я б сказав, що отримання плагіна варто того, щоб зробити ваш код набагато читабельнішим. Вбудована підтримка reST з такими підказками, як у PyCharm, тому я впевнений, що плагіни існують для інших мов інших IDE. Очевидно, якщо у вас є проект, де все зафіксовано таким чином, я не пропоную почати ділити так, як це робиться, але для нових проектів я просто думаю, що це так жахливо читати та підтримувати.
Латті

Відповіді:


21

Якщо ваші коментарі виглядають лише так:

/// <summary>
/// Gets or sets the sublot number.
/// </summary>
/// <value>
/// The sublot number.
/// </value>

Тоді так, вони не все так корисні. Якщо вони читають щось подібне:

/// <summary>
/// Gets or sets the sublot number.
/// Note that the sublot number is only used by the legacy inventory system.
/// Latest version of the online inventory system does not use this, so you can leave it null. 
/// Some vendors require it but if you don't set it they'll send a request for it specifically.
/// </summary>
/// <value>
/// The sublot number.
/// </value>

Тоді я б сказав, що вони мають цінність. Отже, щоб відповісти на ваше запитання: коментарі необхідні, коли вони говорять щось, що не говорить код.

Виняток: добре писати коментарі до всього, що є загальнодоступним, якщо ви пишете бібліотеку / API, які будуть доступні громадськості. Я ненавиджу використовувати бібліотеку і бачити функцію, названу getAPCDGFSocket()без пояснення того, що таке APCDGFSocket (я б радий чомусь простому This gets the Async Process Coordinator Data Generator File Socket). Тож у такому випадку я б сказав, використовуйте якийсь інструмент для генерації всіх коментарів, а потім вручну підготуйте ті, що потребують (і будь ласка, переконайтеся, що ваші криптовані абревіатури пояснені).

Крім того, геттери / сетери, як правило, є поганими прикладами для "чи потрібні коментарі?" оскільки вони зазвичай досить очевидні і коментарі не потрібні. Коментарі важливіші для функцій, які виконують певний алгоритм, де деякі пояснення того, чому все робиться, так, як вони є, можуть зробити код набагато зрозумілішим, а також полегшать роботу майбутнім програмістам.

... і, нарешті, я впевнений, що це питання стосується всіх стилів коментарів, а не лише тих, які відформатовані за допомогою XML (який ви використовуєте, оскільки ви працюєте в середовищі .NET).


2
+1 - GhostDoc - це відправна точка для перетворення першої версії, що є котлован, у другу версію, яка містить детальні знання про домен.
Джессі К. Слікер

4
+1 За чому частина. Принцип DRY застосовується - не повторювати себе, і якщо код вже робить дуже хорошу роботу по опису якої частини, ваші коментарі повинні зосередитися на пояснення що - то інше ( як правило, чому ).
Даніель Б

@DanielB або, можливо, вам взагалі не потрібні коментарі;) Я здебільшого погоджуюся з цією відповіддю, за винятком слова, необхідного в "Коментарі потрібні, коли вони говорять про те, що код не говорить". Я думаю, що якщо в коді написано все необхідне, то вам не потрібно більше інформації в коментарях, навіть якщо коментарі дають інформацію не в коді.
Джиммі Хоффа

1
@DanielB - Коментарі XML у .NET в основному призначені для ситуацій, коли програміст кінцевого користувача бібліотеки чи служби не має для них вихідного коду.
jfrankcarr

2
@Lattyware - коментарі XML легко інтегруються з Intellisense Visual Studio, що значно заощаджує час порівняно з пошуком матеріалів в окремому документі.
jfrankcarr

5

Коментарі, які виглядають марними для користувачів, які можуть читати код, стають досить корисними для користувачів, які не мають доступу до джерела. Це відбувається, коли клас використовується як зовнішній API людьми поза вашою організацією: HTML-файли, згенеровані з ваших документів XML, є їх єдиним способом дізнатися про ваші класи.

Однак, коментар, який повторює назву методу з доданими пробілами між словами, залишається марним. Якщо ваш клас буде використовуватися за межами вашої організації, вам потрібно документувати, щоб не було дійсних діапазонів для ваших значень. Наприклад, ви повинні сказати, що встановлення UnitOfMeasureна nullзначення незаконно, що значення, яке надається сетеру, не повинно містити пробілів на початку або в кінці рядка тощо. Ви також повинні задокументувати діапазон, LabelSerialNumberякщо він відрізняється від простого Int32: можливо, він не дозволяє від'ємних чисел *, або не допускає більше семи цифр. Ваші внутрішні користувачі можуть сприймати це як належне, оскільки вони переглядають серійні номери день у день, але зовнішні користувачі можуть бути по-справжньому здивовані, побачивши виняток із того, що виглядає як невинний сетер.


* ... в цьому випадку uintможе бути кращим вибором


1
Це не тільки для того, коли у вас немає джерела. Якщо ваш редактор може проаналізувати їх (як Visual Studio робить з Xml коментарями), вони можуть надати інформацію у вигляді миші / спливаючих вікон, не вимагаючи переходу до іншого файлу. Валідатор діапазону на 1 рядок, що обмежує цілий діапазон на більш вузький діапазон, очевидний, коли ви переходите до файлу, де реалізований сетер; але якщо "FrobableID повинен бути від 0 до 1000" з'являється, коли ви починаєте вводити "myFrobable.Fro ...", і автозаповнення натискає нам корисне нагадування.
Ден піднімається Firelight

1

Ви абсолютно праві щодо того, щоб уникнути таких марних коментарів. Вони роблять читання коду складнішим, а не полегшують його, і займають занадто багато місця.

У моїй практиці люди, які пишуть коментарі за допомогою геттерів / сетерів, схильні пропускати коментарі, коли це дійсно необхідно (наприклад, побудова 20-рядкового запиту sql для компонента без документації).

Я пишу коментарі, коли є якісь інші очевидні рішення - я вказую, чому саме такий підхід застосовували. Або коли важко отримати ідею, не знаючи всіх деталей - я коротко перелічу деталі, необхідні для розуміння коду.

Приклад, який ви наводите, - це більше писати коментарі, щоб сказати, що один пише коментарі, а не полегшує життя інших людей (і їх також).

До речі, ви можете покращити свою здатність писати коментарі, повернувшись до свого старого коду і намагаючись зрозуміти його (ви можете навіть не розпізнати власний код через 2-3 місяці - це абсолютно як читання чужого коду) Якщо ви робите це безболісно, ​​то все просто чудово.


Я вже не знаю нікого, хто більше намагається писати коментарі до геттерів / сетерів. Якщо ви використовуєте практично будь-який сучасний IDE (і навіть просунутий текстовий редактор може підтримувати це за допомогою плагінів), геттери та сетери, як правило, можуть бути задокументовані дуже легко за допомогою клацання мишкою або двох або правого натискання клавіші (якщо воно налаштовано). Іноді вони генеруються автоматично, коли ви генеруєте код на основі схеми бази даних або WSDL ...
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner, людина, про яку я говорив, повинна була залишити компанію, і я вважаю, що всі ці коментарі щодо геттерів / сеттерів були зроблені тією людиною, щоб показати, що він / вона доклав певних зусиль, щоб залишити якусь документацію
superM

Чи були всі коментарі до бого введені після того, як особа повідомила? Я бачив, як люди створюють порожні / непотрібні коментарі у форматі XML повсюди, як нахабний спосіб зупинити VS від створення попереджень про "відсутніх коментарів у форматі XML щодо публічно видимих ​​Foo".
Ден піднімається вогняним світлом

@Dan Neely, я думаю, що ця людина не дуже хвилювалася, і просто додала коментарі, щоб сказати, що коментарі додаються. Зазвичай ми не приділяємо багато уваги коментарям, але якщо хтось повинен піти і працює над компонентом, потрібно написати чіткий читабельний код.
superM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.