2011-04-21 10 views
22

¿Cuál es la forma más útil/más estándar/menos sorprendente de escribir consistentemente bloques de comentarios para constructores y clases y archivos que contienen solo una clase?¿Cuál es la forma correcta de documentar archivos, clases y constructores?

  • bloques comentario para clases, no constructores
  • bloques de comentarios para los constructores, no clases
  • módulos de comentario, tanto para los constructores y clases -> En ese caso, qué tipo de datos deben ir en cada uno?

¿Y luego el archivo en sí? ¿Necesita esto un bloque de comentarios si solo contiene una sola clase? ¿Qué detalles deberían ir allí?

Quiero tratar de evitar, en la medida de lo posible, la repetición entre bloques de comentarios de clase, constructor y archivo.

+1

* (relacionado) * [¿Cuáles son los enfoques válidos y legibles a comentar en php5 ] (http://stackoverflow.com/questions/5618592/what-are-the-valid-readable-approaches-to-commenting-in-php5/5618786) – Gordon

+0

La "forma correcta" sintáctica se define por la forma en que el extremo generado -la documentación del usuario se ocupa de que las herramientas terminen analizándolo. Esto es en gran medida la implementación definida. La calidad del contenido de su documentación está definida por si los usuarios todavía tendrán que leer el código fuente antes de usarlo. - También, puntos de bonificación para la sintaxis de documentación IDE autocompletable. –

Respuesta

55

Esto depende en gran medida de su contexto y el nivel de habilidad asumido de las personas que trabajan o las personas que vienen después de usted.

Si publica un marco, una biblioteca o algo por el estilo que por lo general se presupone que el usuario son de todos los niveles de habilidad para que puede desee documentar basura tanto triviales como sea posible para reducir la carga de preguntas que su la comunidad tiene que manejar.

Permítanme comenzar con un ejemplo donde creo que la documentación puede ser un gran dolor.

¿Qué te absolutamente necesidad

Si desea utilizar PHPDoc que necesidad un bloque doc archivo y otro bloque doc después de eso (por lo general el bloque doc clase).

Esos ** necesitan * tener una etiqueta @package. Todo lo demás es opcional.

Iría tan lejos y diría que incluso la etiqueta @package es opcional, ya que es posible que pueda generarla automáticamente para el proyecto. Y si mal no recuerdo, PHPDoc te permite incluso establecer un paquete predeterminado para todo lo que no tenga una etiqueta.

Para la documentación en general, permítanme empezar con un ejemplo (un ejemplo ya se encuentra al final):

¿Cuántas veces se puede explicar lo que "uri" significa:

Massive docs Nota que para getUri se explica lo que significa URI (solo para tener algo de qué hablar en el comentario que asumiría) mientras que no está en isAbsUri porque allí al menos puede decir "abs significa absoluto" dos veces.


Si usted no es un proyecto de código abierto (o falta transportar COMPLETO !!! 11Eleven documentación API):

que había fuertemente sugieren utilizar adecuada, larga y descriptiva nombres de clase, variable y método en lugar de documentación.

No hay ganancia para escribir algo nuevo en los bloques de doc. Dado que es 2011 y tenemos 120 terminales de ancho de banda y autocompletado, ya no hay necesidad de abreviar todo con el fin de guardar algunos caracteres.

yo incluso argumentan que la documentación de las cosas triviales usted y su equipo duele por lo que obligó a perder el tiempo en cosas que nadie se pone valor a partir de entrar en el hábito de escribir siempre documentos triviales y no leer nunca más.

Un buen comentario debería explicar POR QUÉ se hizo algo mientras que el código en sí debería explicar CÓMO sin necesidad de más comentarios.

Mi ejemplo favorito de los documentos redundantes es éste:

class myClass { 
/** 
* Constructor 
*/ 
public function __construct() { 
} 

Algunas pautas decir que TIENE para documentar TODO y se termina con la gente decir lo obvio y otra vez.

Esto no agrega ningún valor pero pierde el tiempo al leer el código.

Un ejemplo para la denominación correcta:

class Person { 
/** 
* Set a persons weight in Kilogram 
* 
* @param float $kg Weight in Kilogram 
*/ 
public function setWeight($kg) {} 

Este código es fácil de documentar porque es necesario para explicar lo que "kg" significa, porque algunas personas pueden utilizar un sistema diferente y no se puede Google de "kg ".

estoy a favor de escribir

class Person { 
/** 
* @param float $kilogram 
*/ 
public function setWeight($kilogram) {} 

El bloque doc es superflua porque llamando setWeight en Person realmente se puede esperar para establecer el peso en una persona. No es necesario que lo escriba de nuevo.

Usar $ kilogramm como parámetro también le ahorra la molestia de explicarlo en los documentos y yo diría que, dependiendo de su entorno, se puede esperar que todos busquen "kilogramos" en google si realmente no conoce el Unidad de medida.


documentación @PHPDoc

  • Toda mi humilde opinión, por supuesto
  • Si no se utiliza el tipo-dando a entender siempre utilizar etiquetas @param.
  • Utilice siempre las etiquetas @return
  • No utilice las etiquetas @author. Collection code ownership is more valuable y la información está en el repositorio de control de origen de todos modos.
  • Solo use etiquetas @copyright si es necesario. Solo me gusta tener un archivo de LICENCIA, pero no soy abogado, así que podría ser necesario.

Los comentarios en línea:

public function generateReport() { 
    // get the db connection 
    $reg = WhateverGlobalStorage::get(“db“); 
    // auth 
    if(!$reg->getOne("SELECT view_report FROM USER ...")) {} 
    // template 
    $id = $reg->getOne("select ... "); 
    // render 
    new ReportTemplate($id); // ... 
} 

si esas son "bloques" separados sólo se mueven a descriptiva funciones con nombre

public function generateReport() { 
    $this->checkAuthentication(); 
    $template = this->createReportTemplate(); 
    $this->renderReport($template); 
} 
// Not perfect but at least you can grasp what the method does much quicker 

recursos adicionales:

diapositivas de una presentación que di sobre el tema en algunas conferencias: Slideshare: clean-code-stop-wasting-my-time

y adicionales pequeña, poco más viejo, diatriba: they-told-you-to-document-everything-they-lied

referencias de libros:

Clean Code - Cover Clean Code: A Handbook of Agile Software Craftsmanship

Refactoring - Cover Refactoring: Improving the Design of Existing Code

Un ejemplo ya

abstract class xyzRequest { 
/** 
    * Initializes this xyzRequest. 
    * 
    * Available options: 
    * 
    * * logging: Whether to enable logging or not (false by default) 
    * 
    * @param xyzEventDispatcher $dispatcher An xyzEventDispatcher instance 
    * @param array $parameters An associative array of initialization parameters 
    * @param array $attributes An associative array of initialization attributes 
    * @param array $options  An associative array of options 
    * 
    * @return bool true, if initialization completes successfully, otherwise false 
    * 
    * @throws <b>xyzInitializationException</b> If an error occurs while initializing this xyzRequest 
    */ 
    public function initialize(xyzEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array()) { 

Veamos, línea por línea, lo que te dice esa documentación. (es broma por aquí un poco para conseguir mi punto de vista)

* Initializes this xyzRequest. 

Así llamando -> initialize en un xyzRequest inicializa esa petición? De Verdad? Ok, entonces, si tú lo dices!

* Available options: 
    * 
    * * logging: Whether to enable logging or not (false by default) 

Se nos dice las opciones para el tercer parámetro, no para el segundo o tercer parámetro, pero tal vez sabemos los que si conocemos el marco? (Ya que no somos capaces de averiguar lo que -> initialize hace uso sin alguien diciendo que podría no ser tan inteligente ...)

* @param xyzEventDispatcher $dispatcher An xyzEventDispatcher instance 

Sí, la sugerencia del tipo está ahí. Por lo tanto, si el método espera una "instancia xyzEventDispatcher", debemos pasar una "instancia xyzEventDispatcher". Bueno saber.

* @param array $parameters An associative array of initialization parameters 
    * @param array $attributes An associative array of initialization attributes 
    * @param array $options  An associative array of options 

Ok. Entonces no es una matriz lineal. Pero necesito pasar "parámetros de inicialización" a un método de "inicialización" que podría haber descubierto.

Todavía no tengo ni idea de lo que realmente necesito pasar allí, pero siempre que esté documentado, ¡tiene que estar bien!

* @return bool true, if initialization completes successfully, otherwise false 

lo tanto, un valor de retorno booleano es "verdadero" de "bueno" y "falso" para el mal".

* @throws <b>xyzInitializationException</b> If an error occurs while initializing this xyzRequest 
    */ 

Así se produce una excepción si se produce un error al que estamos haciendo lo que el la función se llama?

Así excepciones se utilizan para casos de error. Ok. es bueno saberlo.

  • no me dice la diferencia entre ret urn falso y una excepción.
  • El @throws su auto está muy bien, ya que añade información
  • Por cierto: ¿Por qué es tan audaz y no un enlace @
+1

muy agradable, merece 500 votos favorables o más – Daria

0

Coméntalo todo: archivos (autoría, copyright, descripción, etc.), clases (descripción, ejemplos de código), métodos y propiedades. Here es un buen ejemplo con phpDoc comentarios.

+1

-1 la cantidad de documentación que ZF ofrece es factible para un marco público pero no necesariamente para cada aplicación. También diría que el desc corto en el ctor y los getters y setters es completamente superfluo. – Gordon

+0

Si quiere reutilizar su código (o si alguien más lo hará), documéntelo como lo hace Zend. 5 minutos ahora ahorrarán mucho tiempo en el futuro – biakaveron

+1

@biakaveron ¿Quieren decir que, en particular, la breve descripción de los constructores, instaladores y captadores permite una reutilización más sencilla del código? Si es así, ¿por qué? –

1

Personalmente, solo comento en los constructores si hay algo especial que comentar al respecto (como una inicialización especial).

No diría que es la forma "más útil" de ir, pero mantiene el código ordenado, y repetir dos veces lo mismo no es realmente necesario (si esa es su preocupación).

0

Personalmente, creo que la documentación de clases y métodos es la documentación más importante. Cuando escribo el código, deseo la ayuda de mi IDE cuando la finalización del código me muestra la documentación que pertenece a un método. De esta manera puedo encontrar fácilmente el método que necesito.

Como trato de mantener al mínimo la inicialización explícita de las clases, no utilizo los comentarios del constructor. Por lo tanto, trato de evitar el uso de constructores en sí mismo.

El código en un método o función debe ser lo más claro posible utilizando nombres de variables declarativas y manteniéndolos lo más pequeños posible. Solo cuando hago algo inesperado, por ejemplo para problemas de integración, los comento.

Cuestiones relacionadas