I'm having a bit of trouble writing my documentation for a set of grouped modules. I think it's partly a misconception over what @class, @module and @namespace represent. (Or maybe it's a result of Yahoo trying to shoehorn a 'classical' language vocabulary into JS.)
I've got a roughed out sample below showing how most of my code is written and my attempt at documenting it in YUIDoc-style. The first two parts (Foo and BazManager) are pretty straightforward. To me:
Foo is a @class;Baz is a @class;BazManager is a @module (or maybe a @class that contains only @static members);Qux is also a @module but contains only methods.My problems are:
BazManager is a @module, Foo shows up under BazManager;BazManager is a @class, the methods inside Baz get sucked into it if you don't add @for to everything;BazManager is a @class, then documenting Baz's visibility becomes really tricky;Qux. It seems to me to be a module, but since it has no @classes, it gobbles everything around it, including BazManager. So it must be a @class.Can anyone suggest how I should be doing this? I don't really care if I get the terms right as long as everything in the documentation gets generated correctly.
Here's my sample code:
// File: Widgets.js
/**
MyNamespace namespace
@namespace MyNamespace
*/
var MyNamespace = window.MyNamespace || {};
//--------------------PART 1: Foo-------------------//
/**
This is a description of Foo.
@class Foo
*/
MyNamespace.Foo = function () {
    this.toString = function () {
        return "I am a foo";
    };
    /**
    This is Foo's private method description.
    @method privateMethod
    @private
    */
    var privateMethod = function () {};
    /**
    This is Foo's public method description.
    @method publicMethod
    */
    this.publicMethod = function () {};
};
//--------------------PART 2: Baz-------------------//
/**
This is a description of BazManager.
@module BazManager
@namespace MyNamespace
*/
MyNamespace.BazManager = (function () {
    var self = {};
    /**
    This is a description of Baz.
    @class Baz
    */
    var Baz = function (type) {
        /**
        toString description
        @method toString
        @returns {String}
        */
        this.toString = function () {
            return "I am a baz and I'm " + type;
        };
    };
    /**
    This is BazManager's privateBaz description.
    @method privateBaz
    @private
    */
    var privateBaz = new Baz("private");
    /**
    This is BazManager's publicBaz description.
    @method publicBaz
    */
    self.publicBaz = new Baz("public");
    return self;
} ());
//--------------------PART 3: Qux-------------------//
MyNamespace.Qux = (function () {
    var self = {};
    /**
    execute description
    @method execute
    @private
    */
    var execute = function () {
        console.log("Qux is done");
    };
    /**
    start description
    @method start
    */
    self.start = function () {
        setTimeout(execute, 1000);
    };
    return self;
} ());
                In YUIDoc @class is used for both classical classes and for objects which contain a bunch of methods. Classes that are meant to be instantiated are also marked with @constructor. That's mostly because of the way that those classes are then shown in the templates. It's a lot easier to track down a class than many lone functions.
The YUI team and many in the community (myself included) seem to be moving away from @namespace. It's hard to get right. Instead we're writing class names with dots in them, ie: @class Plugin.NodeMenuNav.
Modules are meant in the YUI sense and can be mostly understood as "scripts" that contain one or more classes.
So a typical module will look like this:
/**
A series of utilities to do stuff
@module Stuff
**/
/**
A class that does foo very well
@class Foo
@constructor
@param {Object} [config] Configuration object
@param {Boolean} [config.jumpHigh] Whether foo should jump really high
**/
function Foo(config) {
  config = config || {};
  var high = config.jumpHigh;
}
/**
@method jump
@chainable
**/
Foo.prototype.jump = function () {
    // jump
    return this;
};
/**
A series of utilities to make Foo do more stuff
@class FooUtils
**/
var FooUtils = {
    /**
    @method doSomeStuff
    @static
    **/
    doSomeStuff: function () {
    }
};
Finally, @for is meant for modules that extend other modules. For instance, you could have a module Bar that adds methods to the prototype of Foo:
/**
Adds extra functionality to Foo
@module Bar
**/
/**
Run really fast
@method run
@for Foo
**/
Foo.prototype.run = function () {};bv
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With