2011-02-07 3 views
9

Estoy usando Douglas Crockford's design pattern para implementar métodos privados, privilegiados y públicos. Básicamente se ve algo como esto (usando RequireJS):Obtener los patrones de diseño de jsdoc y Crockford para llevar bien

define(function() { 
    return function() { 
     var that = {}, 

     _init = function() { 
      // "constructor" 
     }, 

     _privateFn = function() { 
      return 42; 
     }; 

     that.publicFn = function() { 
      return 2 * _privateFn(); 
     }; 

     _init(arguments); 

     return that; 
    }; 
}); 

Sin embargo, estoy teniendo problemas para conseguir la jsdoc toolkit para analizar correctamente. He jugado con las anotaciones @name y @memberOf (como here), pero haga lo que haga, no puedo hacer que aparezcan las funciones.

¿Alguien sabe una solución?

+1

Wow, no puedo creer que nadie sabe nada (o parece preocuparse). Vamos a recompensar a este hijo de puta. – n3rd

+1

Puede que no sea la fuente de su problema, pero espero que esté poniendo 'var' delante de cada una de esas funciones privadas. –

+0

en realidad, el punto y coma después de la función _init debe ser una coma. gracias, actualizaré la publicación. – n3rd

Respuesta

16

bien, finalmente lo he descubierto. Así es como lo hace:

/** 
* @name MyModule 
* @namespace 
*/ 
define(['MyModule'], (function() { 
    "use strict"; 

    var Clazz = function (config) { 
     var that = {}, 

     /** 
     * @private 
     * @type number 
     * @name MyModule#_privateField 
     * @field 
     */ 
     _privateField = 42, 

     /** 
     * Returns a private field 
     * 
     * @private 
     * @memberOf MyModule# 
     */ 
     _privateFn = function() { 
      return _privateField; 
     }; 

     /** 
     * Uppercases a string value. 
     * 
     * @public 
     * @name MyModule#publicFn 
     * @function 
     * @param {string} value The value to uppercase. 
     */ 
     that.publicFn = function (value) { 
      return value.toUpperCase(); 
     }; 

     return that; 
    } 

    return Clazz; 
})); 
+0

+1 Empecé a usar jsdoc3 y al principio me fastidió porque no pude obtener nada más que la descripción del módulo y el nombre para ser reconocido por jsdoc. Tu respuesta solucionó eso. –

+0

Ver mi respuesta a continuación, esto es mucho más difícil que usar @lends. – Eli

2

He tenido la misma diversión jugando con las etiquetas para tratar de obtener JsDoc Toolkit para producir algo sensato donde las cosas se construyen de forma dinámica.

Incluso cuando I got it working, terminó con caprichos extraños que me obligaban a jugar con las etiquetas una y otra vez, parecía poco atractivo y aún no era un sustituto de la documentación adecuada. También podría leer esos comentarios en el código fuente.

Honestamente, lo mejor que he hecho fue tomarme el tiempo que estaba pasando saltándome los aros con JsDoc Toolkit y usarlo en write some real documentation con Sphinx.

Además de los beneficios inherentes de cualquier documentación guiada por escrito por personas para personas mayores de documentos de la API generados automáticamente, Sphinx tiene JavaScript domain directives que le permiten documentar la final state of the API que será expuesto a los usuarios finales, en lugar de tener algún intento de código para darle sentido a la API observando los comentarios de prueba y error que se encuentran en su código.

+0

Gracias, eso se ve muy interesante. Tendré que verificarlo la próxima semana. – n3rd

0

En realidad considero los patrones OOP de Douglas Crockford como antipatrones. Aprendí la manera difícil de no usarlos. Este artículo resume sus inconvenientes: http://bolinfest.com/javascript/inheritance.php

Así que la solución es olvidarse de los antipatrones de Crockford y aprender de los desarrolladores, que realmente escriben códigos reales.

Si insiste en soldados, sugiero que uses Google Closure Compiler con sus anotaciones, como se puede ver aquí: http://code.google.com/closure/compiler/docs/js-for-compiler.html

+0

Bueno, usar una herramienta específica para eludir las deficiencias de otra realmente no es lo que llamaría una solución. Además, después de mirar el siguiente artículo, no estoy del todo seguro de que una herramienta escrita por los desarrolladores de Google sea el camino a seguir: http://blogs.sitepoint.com/2009/11/12/google-closure-how-not -to-write-javascript/(De acuerdo, el artículo es bastante antiguo. Pero también lo es el que enlazó). – n3rd

+0

El mismo Crockord afirma que nunca le ha servido de mucho el mimetismo OOP clásico en JS. @ n3rd, podría ser útil si explicó cómo se están teniendo problemas de análisis. No sé mucho sobre JSDoc, pero podría ser obvio si vemos dónde se descompone. –

+0

no se descompone, yo trabajo bien. excepto que no genera documentación para mis funciones: -/ – n3rd

1

He encontrado esta pregunta al buscar una solución al mismo problema. Terminé encontrando una mejor manera de resolver esto si no te importa documentar métodos/variables privados (que probablemente no deberías, ya que son variables locales y no se puede acceder desde ningún otro lugar). Se utiliza la directiva @alias, que es nuevo en jsdoc 3.

/** 
* @name MyModule 
* @namespace 
*/ 
define(['MyModule'], (function() { 
    "use strict"; 

    var Clazz = function (config) { 
     /** @alias MyModule.prototype */ 
     var that = {}; 

     /** 
     * Uppercases a string value. 
     * @param {string} value The value to uppercase. 
     */ 
     that.publicFn = function (value) { 
      return value.toUpperCase(); 
     }; 

     return that; 
    } 

    return Clazz; 
})); 
+0

Quiero el documento * todo * mi código, incluso si parte de él nunca puede terminar en el público apidocs. He cambiado a jsduck hace bastante tiempo, pero gracias de todos modos. – n3rd

1

No sabe si esto existía cuando lo intentó, pero @lends es significativamente más agradable de usar.

Ver: http://usejsdoc.org/tags-lends.html

Ejemplo:

var Person = makeClass(
/** @lends Person.prototype */ 
{ 
    /** @constructs */ 
    initialize: function(name) { 
     this.name = name; 
    }, 
    say: function(message) { 
     return this.name + " says: " + message; 
    } 
}); 
+0

¿Qué sucede si no tienes un constructor? Esta no es una documentación válida para una fábrica – Danielo515

+0

Si no tiene un constructor, entonces usaría \ @name y \ @namespace (si corresponde) como lo hicieron anteriormente. \ @lends y \ @constructs son las mejores opciones para objetos con constructores, IMO. – Eli