Прокоментувати інтерфейс, реалізацію чи те й інше?


128

Я думаю, що всі ми (коли нас може турбувати!) Коментують наші інтерфейси. напр

/// <summary>
/// Foo Interface
/// </summary>
public interface Foo
{
    /// <summary>
    /// Will 'bar'
    /// </summary>
    /// <param name="wibble">Wibble factor</param>
    void Bar(string wibble);
}

Ви також коментуєте реалізацію (яка також може бути надана клієнтам, наприклад, як частина бібліотеки aa)? Якщо так, як вам вдається синхронізувати їх? Або ви просто додаєте коментар "Див інтерфейс документації"?

Дякую


Дублікат пробрався через тут: stackoverflow.com/questions/1875440 / ...
bytedev

Відповіді:


98

Як правило, я використовую той же принцип DRY (не повторюй себе), як і для коду:

  • на інтерфейс, документуйте інтерфейс
  • щодо впровадження, документуйте особливості реалізації

Специфічна для Java : під час документування реалізації використовуйте тег {@inheritDoc}, щоб "включити" javadocs з інтерфейсу.

Для отримання додаткової інформації:


Приємне спасибі за інформацію, яку я не знав про тег @inheritDoc
Пол Уїлан

Нічого собі ... Я й гадки не мала, що і @ @herheritDoc} існував! Я буду користуватися ним регулярно з сьогоднішнього дня.
mcherm

35
Для C # ви можете використовувати <inheritdoc />, що підтримується SandCastle. ( Детальніше ... )
Daniel AA Pelsmaeker

2
Властивості та інші елементи в успадкованому класі не показують XML-документацію в підказці, якщо вказано лише в інтерфейсі. Для зовнішнього використання того ж класу це видно. Це може бути помилка з Visual Studio 2015.
SondreB

2
Ось оновлена ​​версія посилання @Virtlink для сторінки Sandcastle / SHFB inheritdoc: ewsoftware.github.io/XMLCommentsGuide/html/…
weir

7

Якщо ви використовуєте додаток GhostDoc , він оновлює реалізацію за допомогою коментаря з інтерфейсу, коли клацніть правою кнопкою миші та виберіть "Документ це" в методі.


5

Для C # це залежить від IMO: Якщо ви використовуєте явні реалізації інтерфейсу, я б не документував реалізацію.

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

Як сказала Nath, ви можете використовувати GhostDoc для автоматичного вставлення документації інтерфейсу в реалізацію. Я відобразив документ Дана команда на ярлику Ctrl + Shift + D і її одному з натискань клавіш, які я майже автоматично натискаю. Я вважаю, що ReSharper також має можливість вставити документацію інтерфейсу, коли він реалізує методи для вас.


4

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


4

Ми просто коментуємо інтерфейс, коментарі так легко вийти з синхронізації з похідним або базовим класом / інтерфейсом, що приємно мати його лише в одному місці.

Хоча це схоже на @Nath, можливо, пропонує автоматизований інструмент документації, який допомагає тримати речі разом (звучить круто, якщо ви користуєтесь цим). Тут у WhereIWorkAndYouDontCare коментарі призначені для розробників, тому одне місце в коді є кращим


На жаль, не вимагає автоматизованих дій, на жаль, користувачів.
NikolaiDante

3

Коментуючи інтерфейс, має бути достатньо документації, щоб визначити, як використовувати фактичну реалізацію. Єдиний раз, коли я додаю коментарі до реалізації, це якщо у неї є приватні функції, які були вставлені для задоволення інтерфейсу, однак вони були б лише внутрішніми коментарями і не були б помічені в документації в Інтернеті чи доступній для клієнтів.

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


1

Я створив інструмент, який після обробки файлів документації XML додає підтримку тегу <nasleditdoc />.

Хоча він не допомагає Intellisense у вихідному коді, він дозволяє включити змінені файли документації XML до пакету NuGet і, отже, працює з Intellisense у посилах NuGet.

Це на сайті www.inheritdoc.io (безкоштовна версія доступна).


Зауважте, що <nasleditdoc /> підтримується і програмою довідкових файлів Sandcastle, і це документально підтверджено тут: ewsoftware.github.io/XMLCommentsGuide/html/… . Щойно помітив, що про це також було сказано вище.
Оллі

1

Ви, звичайно, можете коментувати і те, і інше, але тоді у вас є проблема збереження обох (як уже згадувалося). Однак в цей день чи вік якийсь споживчий код дійсно не використовує IoC / DI і не використовує інтерфейс? Враховуючи це, якщо ви хочете лише заперечувати коментарі, я настійно пропоную прокоментувати інтерфейс. Таким чином споживач вашого коду швидше за все отримає приємні підказки про інтелігенцію.


1

Використання C #:

Інтерфейс може виглядати так:

    /// <summary>
    /// Helper class to access various properties for the current site.
    /// </summary>
    public interface ISiteHelper
    {
        /// <summary>
        /// Gets the site id of the current site
        /// </summary>
        /// <returns>The site id.</returns>
        int GetSiteID();
    }
}

Реалізація може виглядати приблизно так:

/// <inheritdoc />
public class SiteHelper: ISiteHelper
{
    /// <inheritdoc />
    public int GetSiteID()
    {
        return CommonRepository.GetSiteID();
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.