Schreiben von Dokumentation für gut verstandene Methoden wie Equals in Java

10

Ist es eine gute Praxis, Kommentare für weithin bekannte Methoden wie equals, compareTo usw. zu schreiben?

Betrachten Sie den folgenden Code.

 /**
 * This method compares the equality of the current object 
  with the object of same type
 */
@Override
public boolean equals(Object obj) {

               //code for equals

     }   

Mein Unternehmen möchte unbedingt Kommentare wie die oben genannten eingeben. Ist der oben genannte Javadoc-Kommentar erforderlich? Ist es nicht offensichtlich und gut verstanden, was die Equals-Methode und die Likes (compare, compareTo) usw. bewirken?

Was sind deine Vorschläge?

Vinoth Kumar CM
quelle
3
Ihr aktueller Kommentar ist falsch. Ihre Methodensignatur ist korrekt, wenn Sie ein generisches Objekt verwenden, aber Ihr Kommentar lautet "Objekt desselben Typs".
c_maker
4
Ich würde lieber einen Kommentar sehen, der erklärt, was Gleichheit für dieses Objekt bedeutet. "Gleichheit" ist ein schlüpfriger Begriff. In Common Lisp gibt es zahlreiche Gleichstellungsfunktionen, und Sie wählen bei der Verwendung die entsprechende aus.
David Thornley
In diesem Fall beziehe ich mich auf zwei Objekte, die auf "sinnvolle Weise" gleich sind. Zum Beispiel sind zwei Mitarbeiterobjekte gleich, wenn sie dieselbe Mitarbeiter-ID haben, anstatt zu sagen, dass sie dasselbe Farbhemd tragen.
Vinoth Kumar CM
6
@ Vinoth: Der "sinnvolle Weg" ist genau das, was Sie dokumentieren müssen :)
c_maker

Antworten:

6

JavaDoc unterstützt bereits das Erben von Kommentaren . Laut Dokumentation erben "Konstruktoren, Felder und verschachtelte Klassen keine Dokumentkommentare", sondern Methoden wie equals()will. Da die ObjectKlasse eine gut dokumentierte hat equals()Methode, sollten Sie nur in der Lage sein , diese Dokumentation ohne ein Problem zu erben.

Die Dokumentation für die Methode muss von irgendwoher stammen, damit in Ihrer IDE und in der generierten Webdokumentation darauf zugegriffen werden kann. Es ist nicht erforderlich, genaue und umfassende Kommentare, die in einer Oberklasse vorhanden sind, explizit neu zu schreiben, und ich würde argumentieren, dass die Codedateien unübersichtlich sind.

Wenn dies eine Unternehmensrichtlinie ist, haben Sie zwei Möglichkeiten. Sie können mühelos mitmachen und den zusätzlichen Aufwand für das Schreiben und Verwalten von Dokumentationen bewältigen (häufig unter Verstoß gegen das DRY-Prinzip, das auch auf Dokumente und Code angewendet werden kann). Die andere Möglichkeit wäre, nach Unternehmensrichtlinien zu suchen - zu erklären, warum diese Richtlinien keine gute Idee sind und welche Vorteile eine Änderung bietet (in Bezug auf Zeit, Geld, Aufwand, Qualität - Dinge, die das Management versteht).

Thomas Owens
quelle
Ich bin mir des Erbens bewusst. Aber das Unternehmen "beauftragt" uns, explizite Java-Dokumente zu schreiben.
Vinoth Kumar CM
3
@Vinoth Wenn dies eine Unternehmensrichtlinie ist, können Sie nichts anderes tun, als sie entweder zu schreiben oder die Richtlinie zu ändern. Wenn Sie moderne Entwicklungstools verwenden, ist diese Richtlinie veraltet. Was treibt diese Politik an? JavaDoc-Kommentare werden in Webseiten umgewandelt, und mit modernen IDEs können Sie die JavaDoc-Kommentare beim Schreiben von Software anzeigen, unabhängig davon, woher der Kommentar stammt (explizit oder geerbt).
Thomas Owens
@Thomas: Es gibt die Bitte um Vergebung, anstatt um Erlaubnis zu bitten: Biegen Sie einfach still die Regeln und sehen Sie, ob sich jemand beschwert.
Dsimcha
@dsimcha Vielleicht, aber wenn es wiederholt wird, könnte das schlecht für den Job sein. Dies ist keine Ein-oder-Zwei-Sache.
Thomas Owens
9

In meinem Team verwenden wir normalerweise die @inheritDocAnmerkung für equals()und hashcode()aber ich wünschte, wir hätten es nicht getan.

Für diese beiden Methoden muss ich immer die Implementierung betrachten. Da Sie eine Methode überschreiben, bedeutet dies, dass Sie möchten, dass sie etwas anderes ausführt. Ich denke, das verdient eine eigene Dokumentation.

Es ist gut, zumindest zu dokumentieren, welche Attribute an der Methode beteiligt sind und vielleicht sogar warum.

c_maker
quelle
1
Ihre letzte Aussage ist der beste Grund, sie selbst zu dokumentieren. Erklären Sie, was es tut. Sicher, gleich () vergleicht möglicherweise jedes Element in der Klasse, oder Sie möchten, dass nur alle Zeichenfolgenfelder oder etwas anderes verglichen werden.
Nicholas
2

Denken Sie daran, dass Kommentare Entwicklern aller Art helfen, wenn sie korrekt sind.

Das Problem ist, dass sie manchmal unvollständig und nicht genau sind.

Um ehrlich zu sein, kann das Vergleichen von 2 Objekten schwierig sein (z. B. das Vergleichen von 2 Rechnungsobjekten). Auch Ihre Methode kann sich mit der Zeit weiterentwickeln und muss dann kommentiert werden.

Es ist eine gute Sache, das Methodenziel, die Regeln usw. in einem "nützlichen und aussagekräftigen" Kommentar zu zeigen.

Keine Chance
quelle
2

Es ist äußerst schlecht, Code mit leeren Kommentaren wie:

/**
 * This method compares the equality of the current object with the object of same type...
 */

Das sagt nichts Nützliches aus. Schlimmer noch, es ist sowohl in Stil als auch in Grammatik schlecht:

  1. Kommentare sollten niemals mit "Diese Methode" oder "Diese Klasse" oder "Dies" beginnen. Der Kommentar ist einer Methode oder Klasse anhand seines Speicherorts in der Quelldatei zugeordnet.

  2. "das Objekt" sollte "ein Objekt" lesen

  3. "Vergleicht die Gleichheit" ist nur dann sinnvoll, wenn das eine Objekt mehr "Gleichheit" als das andere haben kann. Diese Funktion vergleicht nicht "Gleichheit"; Es vergleicht Objekte, um ihre Gleichheit miteinander zu bestimmen.

Stattdessen sollte der Kommentar angeben, wann die beiden Objekte als gleich angesehen werden. Hier würde ich die Methodenbeschreibung komplett weglassen und nur den Rückgabewert dokumentieren, zum Beispiel:

public class Fraction {
  private int numerator, denominator;
  /**
   * @return true if <i>this</i> is numerically equal to <i>other</i>
   */
  public boolean equals(Fraction other) {
    return numerator * other.denominator == other.numerator * denominator;
  }
...
}

Generierte Kommentare für triviale Get / Set-Methoden sind die schlechtesten von allen.

Kevin Cline
quelle
1

Unser Codierungsstandard schreibt vor, dass beim Überschreiben einer Methode keine Dokumentation erforderlich ist, es sei denn, beim Überschreiben ist die Dokumentation in der übergeordneten Klasse oder Schnittstelle für die Unter- oder Implementierungsklasse nicht mehr genau und umfassend.

Für Gleichgestellte möchten wir möglicherweise beachten, dass der Vergleich nur mit einem Primärschlüssel durchgeführt wird, wenn eine datenbankgestützte Entität verglichen wird, da dies nicht vollständig mit der Dokumentation für übereinstimmt Object.equals().

Kris
quelle
0

Meiner Meinung nach, und ich denke, dass dies kontrovers sein kann, sollten Sie im Kommentar angeben, in welcher Klasse Sie die Klasse überschrieben haben. Dann, sechs Monate später, wenn Sie sich fragen, ob es implementiert ist oder nicht, können Sie sehen, ohne die Klasse zu öffnen.

Peter Taylor
quelle
0

Da Sie wissen, dass diese Methoden üblich sind und die meisten Entwickler wissen, wofür sie gedacht sind, müssen Sie dort keine Kommentare abgeben. Kommentare sind auf lange Sicht nicht so zuverlässig, da diese möglicherweise nicht aktualisiert werden, wenn die Implementierung aktualisiert wird, und Verwirrung stiften können. Daher ist es immer besser, Ihren Code lesbar zu machen, da Sie dem meistens vertrauen können.

Darüber hinaus würde ich sagen, dass wenn der Code, den Sie erstellen / bearbeiten, nicht für eine öffentliche API bestimmt ist, Sie die Javadocs für gängige Methoden einfach weglassen, da diese nur Unordnung und Rauschen verursachen.

Bob Santos
quelle