Sind XML-Kommentare erforderlich?

10

Früher war ich ein Fan davon, XML-Kommentare für die Dokumentation zu benötigen. Ich habe meine Meinung seitdem aus zwei Hauptgründen geändert:

  1. Wie guter Code sollten Methoden selbsterklärend sein.
  2. In der Praxis sind die meisten XML-Kommentare nutzloses Rauschen, das keinen zusätzlichen Wert bietet.

Oft verwenden wir einfach GhostDoc, um generische Kommentare zu generieren, und das meine ich mit nutzlosem Rauschen:

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

Für mich ist das offensichtlich. Wenn jedoch spezielle Anweisungen enthalten sein sollten, sollten wir unbedingt XML-Kommentare verwenden.

Ich mag diesen Auszug aus diesem Artikel :

Manchmal müssen Sie Kommentare schreiben. Aber es sollte die Ausnahme sein, nicht die Regel. Kommentare sollten nur verwendet werden, wenn sie etwas ausdrücken, das nicht im Code ausgedrückt werden kann. Wenn Sie eleganten Code schreiben möchten, versuchen Sie, Kommentare zu entfernen, und schreiben Sie stattdessen selbstdokumentierenden Code.

Bin ich falsch zu glauben, wir sollten nur XML-Kommentare verwenden, wenn der Code nicht ausreicht, um sich selbst zu erklären?

Ich glaube, dies ist ein gutes Beispiel, bei dem XML-Kommentare hübschen Code hässlich aussehen lassen. Es braucht eine Klasse wie diese ...

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; }
}

... und macht daraus:

/// <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; }
}
Bob Horn
quelle
2
Ich würde behaupten, XML ist eine schreckliche Wahl für diesen Zweck. Es ist viel zu ausführlich und allgemein für den vorliegenden Gebrauch. In reStructuredText und sphinx finden Sie eine Auszeichnungssprache, die in Kommentare eingebettet wird, ohne sie unlesbar zu machen.
Latty
2
@Lattyware: VisualStudio unterstützt diesen Stil standardmäßig, es sind keine zusätzlichen Plugins oder Tools erforderlich. Auf diese Weise generierte Kommentare werden sofort in Popup-QuickInfos angezeigt.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Ich würde sagen, dass es sich lohnt, ein Plugin zu bekommen, um Ihren Code besser lesbar zu machen. Die integrierte Unterstützung für reST mit solchen Tooltips ist in PyCharm enthalten, daher bin ich sicher, dass Plugins für andere Sprachen in anderen IDEs vorhanden sind. Wenn Sie ein Projekt haben, in dem alles auf diese Weise dokumentiert ist, schlage ich natürlich nicht vor, dass Sie anfangen, die Art und Weise, wie es gemacht wird, aufzuteilen, aber für neue Projekte finde ich es einfach so schrecklich, es zu lesen und zu pflegen.
Latty

Antworten:

21

Wenn Ihre Kommentare nur so aussehen:

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

Dann sind sie ja gar nicht so nützlich. Wenn sie so etwas lesen:

/// <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>

Dann würde ich sagen, dass sie Wert haben. Um Ihre Frage zu beantworten: Kommentare sind erforderlich, wenn sie etwas sagen, was der Code nicht sagt.

Eine Ausnahme: Es ist gut, Kommentare zu öffentlich zugänglichen Elementen zu haben, wenn Sie eine Bibliothek / API schreiben, die der Öffentlichkeit zugänglich sein wird. Ich hasse es , eine Bibliothek zu benutzen und eine Funktion zu sehen, die getAPCDGFSocket()keine Erklärung dafür hat, was ein APCDGFSocket ist (ich würde mich über etwas so Einfaches wie freuen This gets the Async Process Coordinator Data Generator File Socket). In diesem Fall würde ich sagen, dass Sie ein Tool verwenden, um alle Kommentare zu generieren und dann diejenigen, die sie benötigen, manuell zu optimieren (und bitte stellen Sie sicher, dass Ihre kryptischen Akronyme erklärt werden).

Getter / Setter sind im Allgemeinen schlechte Beispiele für "Sind Kommentare notwendig?" weil sie normalerweise ziemlich offensichtlich sind und Kommentare nicht notwendig sind. Kommentare sind wichtiger für Funktionen, die einen Algorithmus ausführen, bei dem eine Erklärung, warum die Dinge so ausgeführt werden, wie sie sind, den Code viel verständlicher machen und auch zukünftigen Programmierern die Arbeit erleichtern könnte.

... und schließlich bin ich mir ziemlich sicher, dass diese Frage für alle Arten von Kommentaren relevant ist , nicht nur für diejenigen, die mit XML formatiert sind (die Sie verwenden, weil Sie in einer .NET-Umgebung arbeiten).

FrustratedWithFormsDesigner
quelle
2
+1 - GhostDoc ist für mich ein Ausgangspunkt, um die erste Version, die Boilerplate ist, in die zweite Version umzuwandeln, die detailliertes Domänenwissen enthält.
Jesse C. Slicer
4
+1 für den Warum- Teil. Es gilt das DRY-Prinzip - wiederholen Sie sich nicht, und wenn der Code bereits ziemlich gut beschreibt, welcher Teil, sollten sich Ihre Kommentare darauf konzentrieren, etwas anderes zu erklären (normalerweise das Warum ).
Daniel B
@DanielB oder vielleicht brauchst du überhaupt keine Kommentare;) Ich stimme dieser Antwort größtenteils zu, mit Ausnahme des Wortes "Kommentare sind notwendig, wenn sie etwas sagen, was der Code nicht sagt." Ich denke, wenn der Code alles Nötige sagt, brauchen Sie keine weiteren Informationen in Kommentaren, selbst wenn die Kommentare Informationen enthalten, die nicht im Code enthalten sind.
Jimmy Hoffa
1
@DanielB - XML-Kommentare in .NET sind in erster Linie für Situationen gedacht, in denen dem Endbenutzerprogrammierer einer Bibliothek oder eines Dienstes der Quellcode nicht zur Verfügung steht.
jfrankcarr
2
@Lattyware - XML-Kommentare lassen sich nahtlos in Intellisense von Visual Studio integrieren. Dies spart viel Zeit im Vergleich zum Nachschlagen von Inhalten in einem separaten Dokument.
Jfrankcarr
5

Die Kommentare, die für Benutzer, die den Code lesen können, nutzlos erscheinen, werden für Benutzer, die keinen Zugriff auf die Quelle haben, ziemlich nützlich. Dies geschieht, wenn die Klasse von Personen außerhalb Ihrer Organisation als externe API verwendet wird: Die aus Ihren XML-Dokumenten generierten HTMLs sind die einzige Möglichkeit, mehr über Ihre Klassen zu erfahren.

Ein Kommentar, der den Methodennamen mit zusätzlichen Leerzeichen zwischen den Wörtern wiederholt, bleibt jedoch nutzlos. Wenn Ihre Klasse außerhalb Ihrer Organisation verwendet werden soll, müssen Sie mindestens die gültigen Bereiche für Ihre Werte dokumentieren. Sie sollten beispielsweise sagen, dass die Einstellung UnitOfMeasureauf nullunzulässig ist, dass der dem Setter übermittelte Wert keine Leerzeichen am Anfang oder am Ende der Zeichenfolge usw. enthalten darf. Sie sollten auch den Bereich dokumentieren, in dem LabelSerialNumberer sich von dem einer Ebene unterscheidet Int32: Möglicherweise sind keine negativen Zahlen zulässig *oder erlaubt nicht mehr als sieben Ziffern. Ihre internen Benutzer halten dies möglicherweise für selbstverständlich, da sie Tag für Tag die Seriennummern überprüfen. Die externen Benutzer sind jedoch möglicherweise wirklich überrascht, eine Ausnahme von dem zu sehen, was wie ein unschuldiger Setter aussieht.


* ... in diesem Fall uintkann eine bessere Wahl sein

dasblinkenlight
quelle
1
Es ist nicht nur für, wenn Sie nicht die Quelle haben. Wenn Ihr Editor sie analysieren kann (wie es Visual Studio mit XML-Kommentaren tut), können sie Informationen als Mouseover / Popups bereitstellen, ohne dass Sie zu einer anderen Datei navigieren müssen. Ein 1-Zeilen-Bereichsvalidator, der ein int auf einen engeren Bereich begrenzt, ist offensichtlich, wenn Sie zu der Datei gehen, in der der Setter implementiert ist. Wenn Sie jedoch "myFrobable.Fro ..." eingeben und "FrobableID muss zwischen 0 und 1000 liegen" angezeigt werden, wird die automatische Vervollständigung eine hilfreiche Erinnerung an uns sein.
Dan spielt am Feuer
1

Sie haben absolut Recht, solche nutzlosen Kommentare zu vermeiden. Sie erschweren das Lesen des Codes, anstatt ihn zu vereinfachen, und beanspruchen zu viel Platz.

In meiner Praxis neigen Leute, die Kommentare mit Getter / Setter schreiben, dazu, Kommentare wegzulassen, wenn diese wirklich notwendig sind (wie das Erstellen einer 20-zeiligen SQL-Abfrage für eine Komponente ohne Dokumentation).

Ich schreibe Kommentare, wenn es andere offensichtliche Lösungen gibt. Ich gebe an, warum genau dieser Ansatz verwendet wurde. Oder wenn es schwierig ist, auf die Idee zu kommen, ohne alle Details zu kennen _ Ich liste kurz die Details auf, die zum Verständnis des Codes erforderlich sind.

Das Beispiel, das Sie mitbringen, besteht eher darin, Kommentare zu schreiben, um zu sagen, dass man Kommentare schreibt, als das Leben anderer (und auch ihrer) zu erleichtern.

Übrigens können Sie Ihre Fähigkeit, Kommentare zu schreiben, verbessern, indem Sie zu Ihrem alten Code zurückkehren und versuchen, ihn zu verstehen (möglicherweise erkennen Sie Ihren eigenen Code in 2-3 Monaten sogar nicht - es ist absolut so, als würden Sie den Code eines anderen lesen). Wenn Sie dies schmerzlos tun, ist alles in Ordnung.

superM
quelle
Ich kenne niemanden mehr, der sich bemüht, Kommentare zu Gettern / Setzern zu schreiben. Wenn Sie fast jede moderne IDE verwenden (und sogar fortgeschrittene Texteditoren können dies über Plugins unterstützen), können Getter und Setter normalerweise sehr einfach mit ein oder zwei Mausklicks oder dem richtigen Tastendruck (falls konfiguriert) dokumentiert werden. Manchmal werden sie automatisch generiert, wenn Sie Code basierend auf einem Datenbankschema oder einer WSDL generieren ...
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner, die Person, über die ich gesprochen habe, war, das Unternehmen zu verlassen, und ich glaube, all diese Kommentare zu Gettern / Setzern wurden von dieser Person gemacht, um zu zeigen, dass sie sich bemüht hat, einige Unterlagen zu hinterlassen
superM
Wurden alle falschen Kommentare eingegeben, nachdem die Person dies angekündigt hatte? Ich habe gesehen, wie Leute überall leere / nutzlose XML-Kommentare erstellt haben, um zu verhindern, dass VS "Fehlende XML-Kommentare zu öffentlich sichtbaren Foo" -Warnungen generiert.
Dan spielt am Feuer
@ Dan Neely, ich denke, diese Person hat sich nicht wirklich darum gekümmert und nur Kommentare hinzugefügt, um zu sagen, dass Kommentare hinzugefügt werden. Wir achten normalerweise nicht besonders auf Kommentare, aber wenn jemand gehen und an einer Komponente arbeiten soll, ist es ein Muss, klar lesbaren Code zu schreiben.
SuperM