2

属性が必要な特定のJavascriptメソッド、一致させるパターン、一致しない場合の対応方法を指定する方法があります。メソッドシグネチャを強制するための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にはモデルのプロパティの検証とデフォルト値の両方があります。私は、これらがここにあるユースケースを満たすために、またはほぼ満たすことができると思います。

+3

私は、あなたが意図していない方法で動作するように強制するべきではないと思います。ちょうど私の意見。 – bfavaretto

+0

ライトボックスに渡されるデータを処理する「ヘルパークラス」を作ってみませんか?ライトボックスは、パラメータをチェックするのではなく、行うべきことをする必要があります。 Btwのtypeofは角括弧なしで使用されます。 – Bakudan

+0

ここで角括弧は "TheEnforcer"がテスト対象として引数の配列を使用すると推測しています。すみませんでした。ごめんなさい – SimplGy

答えて

0

私はこれに2つの部分があると思います。哲学的/建築的であり、実装です。

哲学的な面では、各メソッドに必要とされるものと不要なものを記述する明確な期待やエラーメッセージよりも(APIのユーザーではなく、API開発者ではない)

質問が本来の目的であった実装側では、自分自身に答える必要があると思います。 Backbone.js 'モデル、特に.validate部分は、この必要性を十分に満たしているようです。私はまだそれらを使用する必要がありますが、それは私がそれまでのように見つけた唯一のものです。

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

EDIT: 別の解決策は、コンパイル時である可能性があります。Google Closure Compilerはこれを非常にうまく処理しているようです:https://developers.google.com/closure/compiler/docs/js-for-compiler

2

(これはコメントであることをintentedが、それは予想以上に長くなりました。)

私はそのような機能は時々役立ちます理解が、私はそれは可能な限り避けるべきであると考えています。そして私は、ECMA標準にそれを絶対に含めてはいけないと思います。

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

私はそれがjQueryと根本的に異なると思います。それらは連鎖可能なラッパーオブジェクトを提供するだけで(内部に便利なメソッドがたくさんあります)、特定のコーディング/構文スタイルを優先します。これがjQueryの大部分です。これは、タイプとメソッドのシグネチャを強制するのとは異なり、言語をよりシンプルにします。間違いなく「Simple As Could Be」(申し訳ありません)のようにはなりません。

関連する問題