YUIDocs中的类和模块的文档

时间:2012-12-14 10:10:37

标签: javascript yui documentation-generation

我在编写一组分组模块的文档时遇到了一些麻烦。我认为这部分是对@class@module@namespace所代表的内容的误解。 (或许这是雅虎试图将“经典”语言词汇用于制作JS的结果。)

我在下面有一个粗略的示例,展示了我的大部分代码是如何编写的,以及我尝试以YUIDoc风格记录它。前两部分(FooBazManager)非常简单。对我来说:

  • Foo@class;
  • Baz@class;
  • BazManager@module(或者@class,仅包含@static个成员);
  • Qux也是@module,但仅包含方法。

我的问题是:

  1. 如果BazManager@moduleFoo会显示在BazManager下;
  2. 如果BazManager@class,如果您没有向所有内容添加Baz,则@for内的方法会被吸入其中;
  3. 如果BazManager@class,则记录Baz的可见性变得非常棘手;
  4. 我真的不知道我应该如何记录Qux。在我看来,它是一个模块,但由于它没有@class es,它会吞噬它周围的一切,包括BazManager。所以它必须是@class
  5. 任何人都可以建议我应该这样做吗?只要文档中的所有内容都能正确生成,我就不在乎我是否正确使用这些条款。

    这是我的示例代码:

    // 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;
    } ());
    

1 个答案:

答案 0 :(得分:9)

在YUIDoc中@class用于经典类和包含一堆方法的对象。要实例化的类也标有@constructor。这主要是因为这些类随后在模板中显示的方式。跟踪课程要比许多单独的功能容易得多。

YUI团队和社区中的许多人(包括我自己)似乎正在离开@namespace。很难做对。相反,我们正在编写带有点的类名,即:@class Plugin.NodeMenuNav

模块在YUI意义上是指,并且大多数可以理解为包含一个或多个类的“脚本”。

所以典型的模块看起来像这样:

/**
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 () {

    }
};

最后,@for适用于扩展其他模块的模块。例如,您可以使用模块Bar将方法添加到Foo的原型中:

/**
Adds extra functionality to Foo

@module Bar
**/

/**
Run really fast

@method run
@for Foo
**/
Foo.prototype.run = function () {};bv