2

特定の 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* フレームワークの 1 つに組み込まれているのでしょうか?

編集:これ通常、MV* フレームワークによって処理されるようです。Backbone.js には、モデルのプロパティに検証値とデフォルト値の両方があります。これらは、ここで紹介するユースケースを満たす、またはほぼ満たすために使用できると思います。

4

2 に答える 2

2

(これはコメントのつもりでしたが、予想以上に長くなりました。)

そのような機能が役立つ場合があることは理解していますが、可能な限り避けるべきだと思います。そして、ECMA 標準にそれを含めるべきではないと思います。

あなたの例を見てみましょう: ライトボックスのタイトルとコンテンツは必須です。なんで?タイトルやコンテンツのない空のライトボックスを表示しないのはなぜですか? 私の意見では、それはまともなフォールバックです。API を構築している場合、それを使用している人は誰でも空のタイトルとコンテンツをチェックでき、必要に応じてライトボックス関数を呼び出さないようにすることができます。また、JS で型を強制しようとする考えも好きではありません。

jQueryとは根本的に違うと思います。それらは連鎖可能なラッパー オブジェクト (内部に多数の便利なメソッドを含む) を提供し、特定のコーディング/構文スタイルを支持するだけであり、それが jQuery のほとんどです。型やメソッド シグネチャの強制とは異なり、言語がよりシンプルに見えます。

于 2012-04-19T03:14:09.443 に答える
0

これには、哲学/アーキテクチャと実装の 2 つの部分があると思います。

哲学的な側面では、(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

于 2012-04-21T19:54:16.763 に答える