¿Cómo escribir Javadoc de propiedades?

93

A menudo me encuentro con un dilema al escribir javadoc para propiedades / miembros de una clase POJO "simple" que contiene solo propiedades y captadores y definidores (estilo DTO) ...

1) Escriba javadoc para la propiedad
o ...
2) Escriba javadoc para el captador

Si escribo javadoc para la propiedad, mi IDE (Eclipse) (naturalmente) no podrá mostrar esto cuando luego acceda al POJO mediante la finalización del código. Y no hay una etiqueta javadoc estándar que me permita vincular el getter-javadoc con la propiedad real javadoc.

Un ejemplo:

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

Entonces, básicamente, sería interesante escuchar cómo otros hacen que su Eclipse IDE muestre la descripción de la propiedad javadoc para sus captadores, sin tener que duplicar el comentario javadoc.

A partir de ahora, estoy considerando hacer mi práctica para documentar solo los captadores y no las propiedades. Pero no parece la mejor solución ...


fuente
1
Interesante discusión sobre esto aquí: stackoverflow.com/questions/1028967/… . La respuesta aceptada aborda lo que preguntó sobre Eclipse / javadoc.
b.roth
Parece que concluyeron con lo que estaba considerando ... escribir propiedad javadoc solo en los captadores.
Encontré una manera de hacer esto con anotaciones que funcionan en eclipse e incluso se pueden recopilar en tiempo de ejecución, ¿sería esa una opción?
Aquarius Power
los miembros privados necesitan javadoc?
cherit
El nombre de bla bla bla: mejor ejemplo
Rodrigo Espinoza

Respuestas:

75

Puede incluir miembros privados mientras genera Javadocs (usando -private) y luego usar @link para vincular a esa propiedad de campos.

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

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

Alternativamente, si no desea generar el Javadoc para todos los miembros privados, puede tener una convención para documentar todos los captadores y usar @link en los configuradores.

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;
    }
}
Chandra Sekar
fuente
2
He experimentado con las etiquetas @link y @see ... Pero ... al menos Eclipse no muestra esto correctamente. Eclipse muestra el enlace como un ... (redoble de tambores) .... enlace ... en el que uno tendrá que hacer clic para ver el contenido. Quiero poder activar la finalización del código (o con el mouse sobre) obtener el javadoc para una propiedad cuando en realidad estoy navegando por un captador ...
13
@Kenny: no modele sus prácticas de JavaDoc a partir del punto de vista de la usabilidad de Eclipse. Hágalo desde el punto de vista de obtener la salida JavaDoc correcta (o suficientemente buena). Los IDE cambian, y lo que podría ser deficiente hoy podría abordarse mañana (o podría cambiar completamente los IDE)
luis.espinal
1
@luis @linksignifica un enlace en el que se debe hacer clic para ver el javadoc real. No es un problema de usabilidad de Eclipse, es la solución incorrecta para proporcionar javadocs fáciles de usar.
NateS
4

Lombok es una biblioteca muy conveniente para tales tareas.

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

¡Eso es todo lo que necesitas! los@Getter anotación crea un método de obtención para cada campo privado y le adjunta el javadoc.

PD : la biblioteca tiene muchas características interesantes que es posible que desee consultar

Amanuel Nega
fuente
3

Hago ambas cosas, ayudado por el autocompletado de Eclipse.

Primero, documenté la propiedad:

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

Luego, copio y pego esto en el getter:

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

Con eclipse, las sentencias @return se autocompletan, por lo que agrego la palabra Gets, pongo la "t" en minúscula y copio la oración con la "t" minúscula. Luego uso @return (con autocompletar Eclipse), pego la oración y luego en mayúscula la T en la devolución. Entonces se ve así:

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

Finalmente, copio esa documentación al colocador:

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

Luego, lo modifico y con el autocompletado de Eclipse puede obtener no solo la etiqueta @param sino también el nombre del parámetro:

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

Entonces, he terminado. En mi opinión, esta plantilla hace que sea mucho más fácil, a largo plazo, no solo recordarse a sí mismo lo que significa la propiedad a través de la repetición, sino que también facilita agregar comentarios adicionales al getter y setter si desea agregar side efectos (como no permitir propiedades nulas, convertir cadenas a mayúsculas, etc.). Investigué la creación de un complemento de Eclipse para este propósito, pero no pude encontrar el punto de extensión apropiado para el JDT, así que me rendí.

Tenga en cuenta que es posible que la oración no siempre comience con una T; es solo que la primera letra debe estar sin mayúscula / recapitalizada al pegar.

MetroidFan2002
fuente
23
Copiar / pegar es malo ... y lleva mucho tiempo. Estos pasos parecen mucho trabajo, y si el javadoc cambia, tendrá 3 lugares diferentes para actualizar. No creo que un complemento justifique esto tampoco ... al menos, entonces el complemento tendría que, por ejemplo, considerar la propiedad javadoc como el maestro y luego sobrescribir los captadores (y definidores). Lo que quiero lograr es escribir el javadoc en 1 solo lugar, y luego hacer que tanto los getters como los javadocs de propiedad asuman la misma descripción ...
Normalmente, las propiedades no cambian con tanta frecuencia. Y las operaciones de copiar y pegar, con autocompletar de Eclipse, toman menos de 30 segundos una vez que se construye la propiedad Javadoc.
MetroidFan2002
4
No estoy convencido ... En mi humilde opinión, la introducción de este tipo de esquema de copiar / pegar conduce a inconsistencias. Tengo muy poca fe en que otros cocineros (o yo mismo) editen el código más tarde. Además, al menos si no tiene un diseño inicial completo, las propiedades de javadoc a menudo están sujetas a cambios, al menos durante una fase experimental / de diseño. Y javadoc será de mejor calidad si se escribe cuando el código está fresco en mente ... Lo siento si parezco un llorón ;-)
1
Lo sentimos, pero la edición de propiedades seguramente dará lugar a inconsistencias; de cualquier forma que lo juegues, Javadoc tiende a quedarse en el camino a menos que se mantenga enérgicamente de alguna manera. Incluso si hubiera una manera fácil de exponer la propiedad javadoc, es igualmente probable que la propiedad javadoc en sí no se actualice. Es realmente una cuestión de las convenciones de codificación del equipo, etc., y las revisiones de código, cosas así; buena suerte, así es como lo hago, así que no lo olvido.
MetroidFan2002
@Metroid, a menos que se mantenga enérgicamente de alguna manera , bueno, se supone que debe mantenerse enérgicamente si se trata como parte del código fuente en sí. Y no tratar los comentarios de Javadoc (y su equivalente en otros lenguajes) como parte intrínseca del código, aunque lamentablemente es la práctica estándar, es la raíz de muchos males. El peor comentario es el que ha quedado obsoleto. En el mejor de los casos, ralentizan a los programadores para que no puedan controlar el código (ya que tienen que revalidar y aceptar / rechazar constantemente comentarios obsoletos). En el peor de los casos, dan información propensa a errores que introduce errores.
luis.espinal
0

Realmente creo que es un problema y la guía oficial de Javadoc no dice nada al respecto. C # puede resolver esto de una manera elegante con el uso de Propiedades (no codifico en C #, pero realmente creo que es una buena característica).

Pero tengo una suposición: si necesita explicar qué es someString, tal vez sea un `` pequeño error '' sobre su código. Puede significar que debería escribir SomeClass para escribir someString, por lo que explicaría qué es someString en la documentación de SomeClass, y así los javadocs en getter / setter no serían necesarios.

Leonardo Leite
fuente
1
Sobre el uso inadecuado de cadenas en el código, marque `` Evitar cadenas donde otros tipos son más apropiados '' en el libro Effective Java.
Leonardo Leite