是否有用于强制执行方法签名的Javascript库?

时间:2012-04-18 15:35:03

标签: javascript architecture backbone.js unobtrusive-javascript signature

我希望有一种方法可以为某些Javascript方法指定哪些属性是必需的,它们应该匹配哪种模式,以及如果它们不匹配则如何响应。

这是因为它会导致大量重复代码在方法级别检查必需参数和可选参数。

举个例子。在这里,我想建立一个灯箱。如果他们给我发了一个字符串,我会显示一个只有内容的灯箱。如果他们发给我一个选项对象,我会寻找'标题'和'内容'。能够以某种标准化的方式指定它不是很好吗?

// Static method for generating a lightbox
// callerOptions = '' //if sent a string, the lightbox displays it with no title
// callerOptions = {
//      content: '' // required popup contents. can be HTML or text.
//  ,   title: '' // required title for the lightbox
//  ,   subtitle: '' // optional subtitle for lightbox
//  }
lightbox = function (callerOptions) {
    if (!callerOptions) {
        log.warn(_myName + ': calling me without a message to display or any options won\'t do anything');
        return;
    }

    // If they send us a string, assume it's the popup contents
    if (typeof(callerOptions) === 'string') {
        this.options = {};
        this.options.content = callerOptions;

    // Otherwise assume they sent us a good options object
    } else {
        this.options = callerOptions;
    }

    _build();
    _contentLoaded();
};

我希望能够使用一些我从未听说过的图书馆来做这样的事情:

// Maybe this is what it looks like with a method signature enforcement library
lightbox = function (callerOptions) {
    TheEnforcer(
    ,   {   valid: [
                'string' // assumes that it is testing type against arguments by convention
            ,   'typeof([0].title) === "string" && typeof([0].content) === "string"'
            ]
        }
    });

    // If they send us a string, assume it's the popup contents
    if (typeof(callerOptions) === 'string') {
        this.options = { 'content': callerOptions };

    // Otherwise we know they sent us a good options object
    } else {
        this.options = callerOptions;
    }

    _build();
    _contentLoaded();
};

有没有人见过像这样的Javascript库?也许内置于1000个JS MV *框架之一?

修改: 似乎这个 通常由MV *框架处理。 Backbone.js在它的模型属性上有验证和默认值。我认为这些可以用来满足或几乎满足我在这里提出的用例。

2 个答案:

答案 0 :(得分:2)

(这是一个意见,但它变得比预期的长。)

我知道这样的功能有时会很有用但我相信应该尽可能避免。我认为ECMA标准不应该包括那个。

举个例子:灯箱标题和内容是必需的。为什么?为什么不显示没有标题或内容的空灯箱?在我看来,这是一个不错的后备。如果您正在构建API,则使用它的任何人都可以检查空标题和内容,如果需要,则不要调用灯箱功能。另外,我不喜欢尝试在JS中强制执行类型的想法。

我认为这与jQuery截然不同。它们只是提供一个可链接的包装器对象(里面有一堆有用的方法),并且支持某种编码/语法风格,而且这是jQuery的大部分内容。它使语言看起来更简单,不像类型和方法签名强制执行 - 绝对不是“简单可能”(对不起)。

答案 1 :(得分:0)

我想这有两个部分,哲学/架构和实施。

在哲学方面,我认为没有比明确的期望和错误消息更简单(对于我的API的用户,不是我的API开发人员),而是描述每种方法需要和不需要的内容。

在实施方面,这是最初的问题,我想我必须自己回答。 Backbone.js的模型,特别是.validate部分,似乎很好地满足了这个需求。我还没有使用它们,但到目前为止,这是我发现的唯一一件事。

http://documentcloud.github.com/backbone/#Model-validate

编辑: 另一个解决方案是编译时间。 Google Closure Compiler似乎很好地解决了这个问题:https://developers.google.com/closure/compiler/docs/js-for-compiler