2011-02-07 16 views
9

Używam aplikacji Douglasa Crockforda design pattern do implementacji metod prywatnych, uprzywilejowanych i publicznych. W zasadzie wygląda mniej więcej tak (za pomocą RequireJS):Uzyskiwanie wzorców projektowych jsdoc i Crockford, aby się dogadać

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

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

     _privateFn = function() { 
      return 42; 
     }; 

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

     _init(arguments); 

     return that; 
    }; 
}); 

Jednak mam problemy z uzyskaniem jsdoc toolkit aby je analizować poprawnie. Grałem z adnotacjami @name i @memberOf (jak here), ale bez względu na to, co robię, po prostu nie mogę uzyskać funkcji do wyświetlenia.

Czy ktoś zna rozwiązanie?

+1

Wow, nie mogę uwierzyć, nikt nic nie wie (albo się tym nie przejmuje). Oddajmy ten frajer. – n3rd

+1

To nie może być źródłem twojego problemu, ale mam nadzieję, że umieszczasz 'var' przed każdą z tych prywatnych funkcji! –

+0

w rzeczywistości średnik po funkcji _init powinien być przecinkiem. dzięki, zaktualizuję wpis. – n3rd

Odpowiedz

16

Ok, ale w końcu zorientowaliśmy się. Oto, jak to zrobić:

/** 
* @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 Właśnie zacząłem używać jsdoc3 i byłem początkowo bummed, ponieważ nie mogłem uzyskać niczego innego niż opis modułu i nazwę, która jest rozpoznawana przez jsdoc. Twoja odpowiedź rozwiązała to. –

+0

Zobacz moją odpowiedź poniżej, jest to znacznie trudniejsze niż przy użyciu @lends. – Eli

2

Miałem podobną zabawę, rozmyślając o znacznikach, aby przekonać się, że JsDoc Toolkit wypuszcza coś rozsądnego tam, gdzie rzeczy budowano dynamicznie.

Nawet jeśli I got it working, skończyło się na dziwnych dziwactwach, które wymagały ode mnie ciągłego manipulowania tagami, wyglądało to nieprzyjemnie i nadal nie zastąpiło odpowiedniej dokumentacji - równie dobrze mógłbyś czytać te komentarze w kod źródłowy.

Szczerze mówiąc, najlepszą rzeczą, jaką kiedykolwiek zrobiłem, było poświęcenie czasu na skakanie przez obręcze za pomocą JsDoc Toolkit i używanie go do write some real documentation z Sphinx.

Oprócz wrodzonych zalet każdej z przewodnikiem dokumentacji napisane przez ludzi, dla ludzi powyżej generowanych automatycznie docs API, Sfinks ma JavaScript domain directives które pozwalają udokumentować final state of the API które będą narażone na rzecz użytkowników końcowych, zamiast trochę kodu próbę aby zrozumieć sens API, przeglądając komentarze o próbach i błędach zaśmieconych swoim kodem.

+0

Dzięki, że wygląda bardzo interesująco. Będę musiał to sprawdzić w przyszłym tygodniu. – n3rd

0

Właściwie uważam schematy OOP Douglasa Crockforda za anty-wzorce. Nauczyłem się, jak ich nie używać. Ten artykuł podsumowuje ich wady: http://bolinfest.com/javascript/inheritance.php

Rozwiązaniem jest zapomnieć o antypodach Crockforda i nauczyć się od programistów, którzy faktycznie piszą prawdziwy kod.

Jeśli nalegać na szeregowców, proponuję używać Google Closure Compiler z jego adnotacji, jak widać tutaj: http://code.google.com/closure/compiler/docs/js-for-compiler.html

+0

No cóż, używanie jednego specyficznego narzędzia do obejścia niedociągnięć kogoś innego naprawdę nie jest tym, co nazwałbym rozwiązaniem. Poza tym, po zapoznaniu się z poniższym artykułem nie jestem do końca pewien, czy narzędzie napisane przez programistów Google jest do zrobienia: http://blogs.sitepoint.com/2009/11/12/google-closure-how-not -to-write-javascript/(Przyznaję, że artykuł jest dość stary, ale tak samo jest z tym, który łączyłeś.) – n3rd

+0

Sam Crockord twierdzi, że nigdy nie używał klasycznego mimikra OOP w JS. @ n3rd, może to pomóc, jeśli wyjaśnisz, jak to ma problemy z analizą. Nie wiem zbyt wiele o JSDoc, ale może się okazać oczywiste, jeśli zobaczymy, gdzie się zepsuje. –

+0

to się nie psuje, działa dobrze. z wyjątkiem tego, że nie generuje dokumentacji dla moich funkcji: -/ – n3rd

1

Znalazłem to pytanie, szukając rozwiązania tego samego problemu. W końcu znalazłem lepszy sposób rozwiązania tego problemu, jeśli nie interesuje cię dokumentowanie prywatnych metod/zmiennych (prawdopodobnie nie powinieneś, biorąc pod uwagę, że są one naprawdę zmiennymi lokalnymi i nie można uzyskać do nich dostępu z dowolnego miejsca). Wykorzystuje ona dyrektywę @alias, co jest nowego w 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

Chcę dokumentu * wszystkie * mój kod, nawet jeśli niektóre z nich mogą nigdy nie trafi do publicznych apidocs. Już dawno przełączyłem się na jsduck, ale dzięki. – n3rd

1

nie wiem, czy ten istniał kiedy to próbował, ale jest znacznie ładniejszy @lends użyć.

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

Przykład:

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

Co zrobić, jeśli nie masz konstruktora? To nie jest poprawna dokumentacja dla fabryki – Danielo515

+0

Jeśli nie masz konstruktora, to używałbyś \ @name i \ @namespace (jeśli dotyczy) tak jak powyżej. \ @lends i \ @constructs są najlepszymi opcjami dla obiektów z konstruktorami, IMO. – Eli

Powiązane problemy