Come scrivere Javadoc di proprietà?


93

Spesso mi trovo di fronte a un dilemma quando scrivo javadoc per proprietà / membri di una classe POJO "semplice" che contiene solo proprietà e getter e setter (stile DTO) ....

1) Scrivi javadoc per la proprietà
o ...
2) Scrivi javadoc per il getter

Se scrivo javadoc per la proprietà, il mio IDE (Eclipse) non sarà (naturalmente) in grado di visualizzarlo quando accederò successivamente al POJO tramite il completamento del codice. E non esiste un tag javadoc standard che mi consenta di collegare il getter-javadoc alla proprietà javadoc effettiva.

Un esempio:

public class SomeDomainClass {

  /**
   * The name of bla bla bla
   */
  private String name;

  /**
   * @return INSERT SOME SMART JAVADOC TAG LINKING TO name's javadoc
   */
  public String getName() {  
    return name;  
  }  

Quindi, fondamentalmente sarebbe interessante sentire come fanno gli altri per avere il tuo IDE Eclipse per visualizzare la descrizione della proprietà javadoc per i tuoi getter, senza dover duplicare il commento javadoc.

Per ora sto considerando di fare pratica per documentare solo i getter e non le proprietà. Ma non sembra la soluzione migliore ...


1
Discussione interessante su questo qui: stackoverflow.com/questions/1028967/… . La risposta accettata affronta ciò che hai chiesto su Eclipse / javadoc.
b

Sembra che abbiano concluso con quello che stavo considerando ... scrivere proprietà javadoc solo nei getter.

Ho trovato un modo per farlo con annotazioni che funzionano in eclipse e possono anche essere raccolte in fase di esecuzione, sarebbe un'opzione?
Aquarius Power

i membri privati ​​hanno bisogno di javadoc?
cherit

Il nome di bla bla bla: miglior esempio
Rodrigo Espinoza

Risposte:


75

È possibile includere membri privati ​​durante la generazione di Javadoc (utilizzando -private) e quindi utilizzare @link per collegarsi a quella proprietà dei campi.

public class SomeDomainClass {
    /**
     * The name of bla bla bla
     */
    private String name;

    /**
     * {@link SomeDomainClass#name}
     */
    public String getName() {
        return name;
    }
}

In alternativa, se non vuoi generare Javadoc per tutti i membri privati, puoi avere una convenzione per documentare tutti i getter e utilizzare @link sui setter.

public class SomeDomainClass {
    private String name;

    /**
     * The name of bla bla bla
     */
    public String getName() {
        return name;
    }

    /**
     * {@link SomeDomainClass#getName}
     */
    public void setName(String name) {
        this.name = name;
    }
}

2
Ho sperimentato entrambi i tag @link e @see .. Ma ... almeno Eclipse non lo visualizza correttamente. Eclipse mostra il collegamento come un ... (rullo di tamburi) .... collegamento .. che si dovrà cliccare per vedere il contenuto. Voglio essere in grado di attivare il completamento del codice (o al passaggio del mouse) ottenere il javadoc per una proprietà quando sto effettivamente esplorando un getter ...

13
@ Kenny - non modellare le tue pratiche JavaDoc dal POV dell'usabilità di Eclipse. Fallo dal POV per ottenere l'output JavaDoc corretto (o sufficientemente buono). Gli IDE cambiano e ciò che potrebbe essere carente oggi potrebbe essere affrontato domani (o potresti effettivamente cambiare completamente gli IDE).
luis.espinal

1
@luis @linkindica un collegamento che deve essere cliccato per vedere il javadoc effettivo. Non è un problema di usabilità di Eclipse, è la soluzione sbagliata per fornire javadoc facili da usare.
NateS

4

Lombok è una libreria molto conveniente per tali attività.

@Getter
@Setter
public class Example {
    /**
     * The account identifier (i.e. phone number, user name or email) to be identified for the account you're
     * requesting the name for
     */
    private String name;
}

È tutto ciò di cui hai bisogno! L' @Getterannotazione crea un metodo getter per ogni campo privato e vi allega il javadoc.

PS : La libreria ha molte funzioni interessanti che potresti voler controllare


3

Faccio entrambe le cose, aiutato dal completamento automatico di Eclipse.

Per prima cosa, documento la proprietà:

/**
 * The {@link String} instance representing something.
 */
private String someString;

Quindi, copio e incollo questo nel getter:

/**
 * The {@link String} instance representing something.
 */
public String getSomeString() {
    return someString;
}

Con eclipse, le istruzioni @return hanno un completamento automatico, quindi aggiungo la parola Gets, minuscolo la "t" e copio la frase con la "t" minuscola. Quindi uso @return (con il completamento automatico di Eclipse), incollo la frase e poi la T maiuscola nel ritorno. Quindi assomiglia a questo:

/**
 * Gets the {@link String} instance representing something.
 * @return The {@link String} instance representing something.
 */
public String getSomeString() {
    return someString;
}

Infine, copio quella documentazione sul setter:

/**
 * Gets the {@link String} instance representing something.
 * @return The {@link String} instance representing something.
 */
public void setSomeString(String someString) {
    this.someString = someString;
}

Quindi, lo modifico e con il completamento automatico di Eclipse puoi ottenere non solo il tag @param ma anche il nome del parametro:

/**
 * Sets the {@link String} instance representing something.
 * @param someString The {@link String} instance representing something.
 */
public void setSomeString(String someString) {
    this.someString = someString;
}

Allora ho finito. A mio parere, questo modello rende molto più semplice, a lungo termine, non solo ricordare a te stesso cosa significa la proprietà attraverso la ripetizione, ma rende anche più facile aggiungere commenti aggiuntivi al getter e al setter se vuoi aggiungere lato effetti (come non consentire proprietà nulle, trasformare le stringhe in maiuscolo, ecc.). Ho cercato di creare un plug-in Eclipse per questo scopo, ma non sono riuscito a trovare il punto di estensione appropriato per JDT, quindi ho rinunciato.

Nota che la frase potrebbe non iniziare sempre con una T: è solo che la prima lettera deve essere senza maiuscole / ricapitalizzata per incollare.


23
Copia / incolla è malvagio ... e richiede tempo. Questi passaggi sembrano un sacco di lavoro e se il javadoc cambia avrai 3 diversi posti da aggiornare. Non penso che un plugin giustificherebbe nemmeno questo ... almeno, allora il plugin dovrebbe considerare ad esempio la proprietà javadoc come master e quindi sovrascrivere getter (e setter). Quello che voglio ottenere è scrivere il javadoc in un unico posto, quindi fare in modo che sia i getter che i javadoc di proprietà assumano la stessa descrizione ...

In genere, le proprietà non cambiano molto spesso. E le operazioni di copia e incolla, con il completamento automatico di Eclipse, richiedono meno di 30 secondi una volta creata la proprietà Javadoc.
MetroidFan2002

4
Non sono convinto ... L'introduzione di questo tipo di schema copia / incolla è IMHO destinato a portare a incongruenze. Ho troppa poca fiducia negli altri cuochi (o in me stesso) che modificano il codice in un secondo momento. Inoltre, almeno se non si dispone di un design iniziale completo, le proprietà di javadoc sono spesso soggette a modifiche, almeno durante una fase sperimentale / di progettazione. E javadoc sarà di migliore qualità se scritto quando il codice è fresco in mente ... Scusate se sembro un piagnucolone ;-)

1
Siamo spiacenti, ma la modifica delle proprietà è destinata a portare a incongruenze: in ogni caso, Javadoc tende a cadere nel dimenticatoio a meno che non venga mantenuto vigorosamente in qualche modo. Anche se esisteva un modo semplice per esporre la proprietà javadoc, è altrettanto probabile che la proprietà javadoc stessa non venga aggiornata. È davvero una questione delle convenzioni di codifica del team, ecc. E delle revisioni del codice, cose del genere - buona fortuna a te, questo è solo il modo in cui lo faccio, quindi non me lo dimentico.
MetroidFan2002

@Metroid - a meno che non sia mantenuto vigorosamente in qualche modo - beh, dovrebbe essere mantenuto vigorosamente se viene trattato come parte del codice sorgente stesso. E non trattare i commenti Javadoc (e il loro equivalente in altre lingue) come parte intrinseca del codice, sebbene purtroppo sia la pratica standard, è la radice di molti mali. Il commento peggiore è quello che è diventato obsoleto. Nella migliore delle ipotesi, rallentano i programmatori dall'ottenere un controllo sul codice (poiché devono costantemente riconvalidare e accettare / rifiutare commenti obsoleti). Nel peggiore dei casi, forniscono informazioni soggette a errori e che introducono bug.
luis.espinal

0

Penso davvero che sia un problema e la guida ufficiale di Javadoc non dice nulla al riguardo. C # può risolvere questo problema in modo elegante con l'utilizzo delle proprietà (non codifico in C #, ma penso davvero che sia una bella funzionalità).

Ma ho una supposizione: se hai bisogno di spiegare cos'è someString, forse è un `` cattivo piccolo '' sul tuo codice. Può significare che dovresti scrivere SomeClass per digitare someString, quindi spiegheresti cos'è someString nella documentazione SomeClass, e solo così i javadoc in getter / setter non sarebbero necessari.


1
Per quanto riguarda il mancato utilizzo corretto delle stringhe nel codice, selezionare `` Evita stringhe dove altri tipi sono più appropriati '' nel libro Effective Java.
Leonardo Leite
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.