【问题标题】:Getting jsdoc and Crockford's design patterns to get along让 jsdoc 和 Crockford 的设计模式相处融洽
【发布时间】:2011-02-07 11:58:31
【问题描述】:

我正在使用 Douglas Crockford 的 design pattern 来实现私有、特权和公共方法。它基本上看起来像这样(使用RequireJS):

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

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

        _privateFn = function () {
            return 42;
        };

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

        _init(arguments);

        return that;
    };
});

但是,我无法让 jsdoc toolkit 正确解析它。我玩过@name@memberOf 注释(如here),但无论我做什么,我都无法显示这些功能。

有人知道解决办法吗?

【问题讨论】:

  • 哇,我不敢相信没有人知道任何事情(或似乎在乎)。让我们赏金这个傻瓜。
  • 这可能不是您的问题的根源,但我希望您在每个私有函数前面加上一个var
  • 其实_init-function后面的分号应该是逗号。谢谢,我会更新帖子。

标签: javascript oop requirejs


【解决方案1】:

好吧,我终于想通了。以下是你的做法:

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

【讨论】:

  • +1 我刚开始使用 jsdoc3,最初很沮丧,因为除了 jsdoc 可以识别的模块描述和名称之外,我什么也得不到。你的回答解决了这个问题。
  • 请看下面我的回答,这比使用@lends 困难得多。
【解决方案2】:

我玩弄标签以尝试让 JsDoc Toolkit 在动态构建的地方输出一些合理的东西也有类似的乐趣。

即使是I got it working,它最终还是出现了奇怪的怪癖,需要我一次又一次地摆弄标签,它看起来没有吸引力,仍然不能替代适当的文档——你不妨阅读那些 cmets源代码。

老实说,我做过的最好的事情就是花时间在 JsDoc Toolkit 上跳跃,然后将它用于 write some real documentationSphinx

除了人们为人们编写的任何指导性文档而不是自动生成的 API 文档的固有好处之外,Sphinx 还具有 JavaScript domain directives,它允许您记录将向最终用户公开的 final state of the API,而不是拥有一些代码试图通过查看散布在您的代码中的反复试验的 cmets 来理解 API。

【讨论】:

  • 谢谢,这看起来很有趣。下周我得去看看。
【解决方案3】:

我在寻找相同问题的解决方案时发现了这个问题。如果您不关心记录私有方法/变量(您可能不应该这样做,因为它们实际上是局部变量并且无法从其他任何地方访问),我最终找到了一种更好的方法来解决这个问题。它使用 @alias 指令,这是 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;
}));

【讨论】:

  • 我想要记录 all 我的代码,即使其中一些可能永远不会出现在公共 apidocs 中。我已经切换到 jsduck 很久了,但还是谢谢。
【解决方案4】:

不知道您尝试时是否存在,但@lends 使用起来明显更好。

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

例子:

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

【讨论】:

  • 如果没有构造函数怎么办?这不是工厂的有效文件
  • 如果您没有构造函数,那么您将像上面那样使用 \@name 和 \@namespace(如果相关)。 \@lends 和 \@constructs 是具有构造函数的对象的最佳选择,IMO。
【解决方案5】:

实际上,我认为 Douglas Crockford 的 OOP 模式是反模式。我学会了不使用它们的艰难方法。本文总结了它们的缺点:http://bolinfest.com/javascript/inheritance.php

因此,解决方案就是忘记 Crockford 的反模式,向真正编写真实代码的开发人员学习。

如果您坚持使用私有,我建议您使用带有注释的 Google Closure Compiler,如您在此处看到的:http://code.google.com/closure/compiler/docs/js-for-compiler.html

【讨论】:

  • 嗯,使用一种特定工具来规避另一种工具的缺点确实不是我所说的解决方案。此外,在查看以下文章后,我不完全确定由 Google 开发人员编写的工具是否适合:blogs.sitepoint.com/2009/11/12/…(当然,这篇文章相当老了。但你链接的那个也是。)跨度>
  • Crockord 本人声称他从未在 JS 中对经典 OOP 模仿有太多用处。 @n3rd,如果您解释了它是如何遇到解析问题的,它可能会有所帮助。我对 JSDoc 了解不多,但如果我们看到它在哪里发生故障,它可能会变得很明显。
  • 它不会崩溃,我工作得很好。除了它不会为我的函数生成文档:-/
  • 我也无法忍受 Crockford 的模式。但是,这并不能真正回答问题,最好作为评论
猜你喜欢
  • 2011-11-25
  • 1970-01-01
  • 2017-12-26
  • 2012-10-24
  • 2019-05-29
  • 2012-02-25
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多