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 @class
es, 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