2010-07-03 44 views
47

Edit: Dies ist technisch eine 2-teilige Frage. Ich habe die beste Antwort gewählt, die die Frage im Allgemeinen behandelt und mit der Antwort verknüpft, die die spezifische Frage behandelt.Beste Möglichkeit, anonyme Objekte und Funktionen mit jsdoc zu dokumentieren

Was ist der beste Weg, um anonyme Objekte und Funktionen mit jsdoc zu dokumentieren?

/** 
* @class {Page} Page Class specification 
*/ 
var Page = function() { 

    /** 
    * Get a page from the server 
    * @param {PageRequest} pageRequest Info on the page you want to request 
    * @param {function} callback Function executed when page is retrieved 
    */ 
    this.getPage = function(pageRequest, callback) { 
    }; 
}; 

Weder die PageRequest Objekt oder die callback existieren im Code. Sie werden zur Laufzeit an getPage() übergeben. Aber ich möchte gerne definieren können, was das Objekt und die Funktion sind.

Ich kann mit der Erstellung der PageRequest Objekt weg, das zu dokumentieren:

/** 
* @namespace {PageRequest} Object specification 
* @property {String} pageId ID of the page you want. 
* @property {String} pageName Name of the page you want. 
*/ 
var PageRequest = { 
    pageId : null, 
    pageName : null 
}; 

Und das ist in Ordnung (obwohl ich auf bessere Möglichkeiten offen bin, dies zu tun).

Was ist der beste Weg, um die callback Funktion zu dokumentieren? Ich möchte es in dem Dokument machen weiß, dass zum Beispiel der Callback-Funktion in Form ist:

callback: function({PageResponse} pageResponse, {PageRequestStatus} pageRequestStatus) 

Irgendwelche Ideen, wie dies zu tun?

Antwort

39

können Sie Sachen dokumentieren, die im Code existieren tut durch die @name-Tag:

 /** Description of the function 
      @name IDontReallyExist 
      @function 
      @param {String} someParameter Description 
     */ 


     /** The CallAgain method calls the provided function twice 
      @param {IDontReallyExist} func The function to call twice 
     */ 
     exports.CallAgain = function(func) { func(); func(); } 

Hier die @name tag documentation ist. Sie könnten auch name paths nützlich finden.

+0

Wirklich ordentlich! Eine gute Möglichkeit, Callbacks zu dokumentieren. – oligofren

+1

Aber ich sehe nicht, wie das für anonyme Objekte funktioniert? Sprechen Sie ein Einstellungsobjekt, das an eine Funktion gesendet wird, um ein Objekt zu erstellen, das im aktuellen Bereich nicht sichtbar ist. – oligofren

+1

Wenn Sie das @ @ name-Tag nicht verwenden möchten, um Ihrem anonymen Objekt einen Namen zu geben, beschreiben Sie das Objekt, an dem es verwendet wird. Dies wäre der Body des @ @ param-Tags für das Beispiel mit Einstellungsobjekten. – Eric

0

Sie können @see verwenden, um eine Verbindung zu einer anderen Methode innerhalb derselben Klasse herzustellen. Die Methode würde niemals verwendet werden, sie wäre nur zu Dokumentationszwecken da.

Wenn Sie eine Art von Build-System verwenden, könnte die Dummy-Methode einfach aus dem Build weggelassen werden.

+0

Danke, nein. Ich mache das momentan (ohne das ifdef) und es funktioniert, aber ich möchte, dass der Benutzer sofort sieht, dass es eine Funktion ist, die die Parameter X und Y akzeptiert, ohne zu verlassen, wo sie sind. Ähnlich wie die Google Map API es tut. Beispiel: http://code.google.com/apis/maps/documentation/javascript/reference.html#DirectionsService –

+0

Habe gerade herausgefunden, dass @link das tun kann, worüber ich rede. Es ist nicht perfekt, aber es funktioniert. Ich werde eine separate Antwort erstellen, falls es jemand anders für nützlich hält. –

1

@link können Inline-Links zu Methoden und Klassen hinzufügen.

/** 
* Get a page from the server 
* @param {PageRequest} pageRequest Info on the page you want to request 
* @param {function} callback Function executed when page is retrieved<br /> 
* function({@link PageResponse} pageResponse,{@link PageRequestStatus} pageRequestStatus) 
*/ 
this.getPage = function (pageRequest, callback) { 
}; 

Nicht ideal, aber es macht die Arbeit erledigt.

1

Die Google Closure Compiler Anmerkungen hat Type Expressions für diese, die die Möglichkeit enthält, Typ für bestimmte Argumente, Rückgabetyp und sogar dies anzugeben. Viele Bibliotheken betrachten die Google Closure-Compiler-Annotationen, weil sie damit ihren Code verkleinern möchten. Es hat also etwas Schwung. Der Nachteil ist, ich sehe keinen Weg, die Beschreibung zu geben.

Für die Beschreibung vielleicht die JSDoc Toolkit Parameters With Properties Ansatz würde funktionieren (siehe unten auf der Seite). Genau das mache ich gerade. Das JSDoc-Toolkit bereitet auf die Arbeit an V3 vor, so dass das Feedback gut sein kann.

7

Um die Antwort von Studgeek zu ergänzen, habe ich ein Beispiel, das zeigt, was JsDoc with Google Closure Compiler können Sie tun.

Beachten Sie, dass die dokumentierten anonymen Typen aus der generierten minimierten Datei entfernt werden und der Compiler dafür sorgt, dass gültige Objekte (wenn möglich) übergeben werden.Auch wenn Sie den Compiler nicht verwenden, kann er dem nächsten Entwickler und den Tools wie WebStorm (IntelliJ) helfen, ihn zu verstehen und Ihnen Code-Vervollständigung zu geben.

// This defines an named type that you don't need much besides its name in the code 
// Look at the definition of Page#getPage which illustrates defining a type inline 
/** @typedef { pageId : string, pageName : string, contents: string} */ 
var PageResponse; 

/** 
* @class {Page} Page Class specification 
*/ 
var Page = function() {  
    /** 
    * Get a page from the server 
    * @param {PageRequest} pageRequest Info on the page you want to request 
    * 
    * The type for the second parameter for the function below is defined inline 
    * 
    * @param {function(PageResponse, {statusCode: number, statusMsg: string})} callback 
    *  Function executed when page is retrieved 
    */ 
    this.getPage = function(pageRequest, callback) { 
    }; 
}; 
+0

Hallo, dies scheint die eleganteste Antwort zu sein, jedoch enthält die JSDoc-Ausgabe nur 'function' ohne die spezifische Parametereingabe. Ich benutze jsdoc '3.4.0'. Wird diese Syntax nicht vollständig unterstützt? –

+1

@PeteV. Ich habe nicht mit dem Grad der Synchronisation zwischen Jsdoc und Closure-Compiler Schritt gehalten. Ich würde empfehlen, dass Sie alternative doc-Generatoren betrachten, die mit dem Closing-Compiler arbeiten (da dies eine Obermenge des jsdoc-Standards ist). Versuchen Sie http://plovr.com/, http://www.seehuhn.de/pages/jvjsdoc oder https://github.com/google/closure-compiler/wiki/Create-HTML-Docs-using-JSDoc. Ich habe mit TypeScript zum Hinzufügen von statischen Typisierung zu JavaScript –

26

können Sie @callback oder @typedef verwenden.

/** 
* @callback arrayCallback 
* @param {object} element - Value of array element 
* @param {number} index - Index of array element 
* @param {Array} array - Array itself 
*/ 

/** 
* @param {arrayCallback} callback - function applied against elements 
* @return {Array} with elements transformed by callback 
*/ 
Array.prototype.map = function(callback) { ... } 
+0

verwiesen Referenz: http://usejsdoc.org/tags-callback.html –

+2

@ChrisMoschini Danke. Das @ Callback-Tag in der Antwort wurde mit der entsprechenden Dokumentationsseite verknüpft. – kzh

Verwandte Themen