Skomentuj interfejs, implementację czy jedno i drugie?

129

Wyobrażam sobie, że wszyscy (kiedy możemy się martwić!) Komentujemy nasze interfejsy. na przykład

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

Czy komentujesz również implementację (która może być również udostępniona klientom, np. W ramach biblioteki aa)? Jeśli tak, jak radzisz sobie z utrzymaniem synchronizacji tych dwóch? A może po prostu dodajesz komentarz „Zobacz interfejs w celu uzyskania dokumentacji”?

Dzięki

ng5000
źródło
Duplikat
przekradł się

Odpowiedzi:

99

Generalnie używam tej samej zasady DRY (Don't Repeat Yourself) jak w przypadku kodu:

  • na interfejsie, udokumentuj interfejs
  • na wdrożeniu udokumentuj specyfikę wdrożenia

Specyficzne dla języka Java : podczas dokumentowania implementacji użyj tagu {@inheritDoc}, aby „dołączyć” javadocs z poziomu interfejsu.

Po więcej informacji:

Neeme Praks
źródło
Fajne dzięki za informacje, których nie wiedziałem o tagu @inheritDoc
Paul Whelan
Wow ... też nie miałem pojęcia, że ​​{@inheritDoc} istnieje! Od dziś będę go regularnie używać.
mcherm
37
W przypadku C # można użyć <inheritdoc />, który jest obsługiwany przez SandCastle. ( Więcej informacji ... )
Daniel AA Pelsmaeker
2
Właściwości i inne elementy w dziedziczonej klasie nie pokazują dokumentacji XML w etykiecie narzędzia, jeśli są określone tylko w interfejsie. Do użytku zewnętrznego tej samej klasy jest widoczny. To może być błąd w programie Visual Studio 2015.
SondreB
2
Oto zaktualizowana wersja linku @Virtlink podanego dla strony Sandcastle / SHFB inheritdoc: ewsoftware.github.io/XMLCommentsGuide/html/…
jaz
7

Jeśli używasz dodatku GhostDoc, aktualizuje on implementację komentarzem z interfejsu po kliknięciu prawym przyciskiem myszy i wybraniu opcji „Dokumentuj to” w metodzie.

NikolaiDante
źródło
5

W przypadku C # zależy to od IMO: Jeśli używasz jawnych implementacji interfejsu, nie dokumentowałbym implementacji.

Jeśli jednak implementujesz interfejs bezpośrednio i ujawniasz elementy członkowskie interfejsu z obiektem, te metody również muszą być udokumentowane.

Jak powiedział Nath, możesz użyć GhostDoc do automatycznego wstawienia dokumentacji interfejsu do implementacji. Zmapowałem polecenie Document This do skrótu Ctrl + Shift + D i jest to jedno z klawiszy, które prawie automatycznie naciskam. Uważam, że ReSharper ma również opcję wstawiania dokumentacji interfejsu, gdy implementuje metody za Ciebie.

Grover
źródło
4

Tylko interfejs. Komentowanie obu jest duplikacją i jest prawdopodobne, że oba zestawy komentarzy ostatecznie stracą synchronizację, jeśli zmieni się kod. Skomentuj implementację słowem „implementuje MyInterface” ... Rzeczy takie jak Doxygen generują dokumenty, które i tak zawierają dokumenty pochodne w dokumentach do implementacji (jeśli ustawisz je poprawnie).

Len Holgate
źródło
4

Po prostu komentujemy interfejs, komentarze są tak łatwe do zsynchronizowania z klasą / interfejsem pochodną lub podstawową, że dobrze jest mieć je w jednym miejscu.

Chociaż wygląda na to, że @Nath może sugerować automatyczne narzędzie do dokumentacji, które pomaga utrzymać wszystko razem (brzmi fajnie, jeśli go używasz). Tutaj w WhereIWorkAndYouDontCare komentarze są dla programistów, więc preferowane jest jedno miejsce w kodzie

Jiminy
źródło
Nie zautomatyzowany, niestety wymaga działania użytkownika.
NikolaiDante
3

Komentowanie interfejsu powinno być wystarczającą dokumentacją, aby dowiedzieć się, jak korzystać z rzeczywistej implementacji. Jedyny moment, w którym dodałbym komentarze do implementacji, to gdyby zawierała prywatne funkcje, które zostały wstawione w celu zaspokojenia interfejsu, jednak byłyby to tylko komentarze wewnętrzne i nie byłyby widoczne w dokumentacji online lub dostępne dla klientów.

Implementacje są po prostu takie, o ile są zgodne z interfejsem, nie ma potrzeby dokumentowania ich osobno.

X-Istence
źródło
2

Użycie C #:

Interfejs może wyglądać następująco:

    /// <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();
    }
}

Implementacja może wyglądać następująco:

/// <inheritdoc />
public class SiteHelper: ISiteHelper
{
    /// <inheritdoc />
    public int GetSiteID()
    {
        return CommonRepository.GetSiteID();
    }
}
Raghav
źródło
1

Stworzyłem narzędzie, które post-przetwarza pliki dokumentacji XML, aby dodać obsługę tagu <inheritdoc />.

Chociaż nie pomaga to w przypadku Intellisense w kodzie źródłowym, umożliwia uwzględnienie zmodyfikowanych plików dokumentacji XML w pakiecie NuGet i dlatego współpracuje z Intellisense w przywoływanych pakietach NuGet.

Jest na www.inheritdoc.io (dostępna jest darmowa wersja).

K Johnson
źródło
Zauważ, że <inheritdoc /> jest również obsługiwane przez Sandcastle Help File Builder i jest udokumentowane tutaj: ewsoftware.github.io/XMLCommentsGuide/html/… . Właśnie zauważyłem, że było to również wspomniane powyżej.
Olly
1

Z pewnością możesz skomentować oba, ale wtedy masz problem z utrzymaniem obu (jak wspomniano wcześniej). Jednak w dzisiejszych czasach jakikolwiek konsumujący kod naprawdę nie będzie używał IoC / DI i nie będzie używał interfejsu? Biorąc to pod uwagę, jeśli chcesz tylko zawracać sobie głowę komentarzem, zdecydowanie sugeruję skomentowanie interfejsu. W ten sposób konsument Twojego kodu najprawdopodobniej otrzyma przyjemne wskazówki dotyczące inteligencji.

bytedev
źródło