8

我在为一组分组模块编写文档时遇到了一些麻烦。我认为这部分是对什么@class和代表@module的误解。@namespace(或者这可能是雅虎试图将“经典”语言词汇硬塞进 JS 的结果。)

我在下面有一个粗略的示例,显示了我的大部分代码是如何编写的,以及我尝试以 YUIDoc 样式记录它。前两部分 (FooBazManager) 非常简单。大部头书:

  • Foo是一个@class
  • Baz是一个@class
  • BazManager是一个@module(或者可能是一个@class只包含@static成员的);
  • Qux也是一个@module但只包含方法。

我的问题是:

  1. 如果BazManager是 a @module,则Foo显示在BazManager;
  2. 如果BazManager是 a @class,如果你不添加所有内容,里面的方法Baz就会被吸入其中@for
  3. 如果BazManager是 a @class,那么记录Baz的可见性就变得非常棘手;
  4. 我真的不知道我应该如何记录Qux。在我看来它是一个模块,但由于它没有@classes,它会吞噬它周围的所有东西,包括BazManager. 所以它必须是一个@class.

谁能建议我应该怎么做?只要文档中的所有内容都正确生成,我真的不在乎我是否正确地使用了这些条款。

这是我的示例代码:

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

1 回答 1

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
于 2012-12-20T15:32:12.643 回答