0

編集:この興味深いライブラリを見つけました。これは、私が最後に説明したこととまったく同じことができるように見えます: https://github.com/philbooth/check-types.js

check.quacksLike を呼び出すことでできるようです。


私は JavaScript を使用するのにかなり慣れていないので、JavaScript が提供する強力な機能を気に入っています。一部の引数が特定のインターフェイスを尊重するようにする簡単な方法が欲しいです。

私の問題を強調する簡単な方法の例を次に示します。

var execute = function(args)
{
    executor.execute(args);
}

argsエグゼキュータが というプロパティを持つことを期待しているとしましょうcmd。定義されていない場合、プログラムが参照しようとしたときに別のレベルでエラーがキャッチされる可能性がありますがcmdundefined. cmdこのようなエラーは、このメソッドに が存在することを明示的に強制するよりも、デバッグが面倒です。エグゼキュータは、少し渡さargsれる関数が呼び出されることを期待することさえあります。getExecutionContext()デバッグが、引数が最初に渡された場所を確認するために関数呼び出しを追跡するという悪夢にすぐに変わる、はるかに複雑なシナリオを想像することができました。

また、次の行で何かをしたくありません。

var execute = function(args)
{
    if(args.cmd === undefined || args.getExecutionContext === undefined ||
       typeof args.getExecutionContext !== 'function')
        throw new Error("args not setup correctly");
    executor.execute(args);
}

これは、引数を持つすべての関数、特に複雑な引数の場合、かなりの量のメンテナンスを必要とします。インターフェイスを指定して、このインターフェイスに一致する入力を期待することを javascript に伝えるコントラクトを何らかの方法で強制できるようにしたいと考えています。

たぶん次のようなもの:

var baseCommand =
{
    cmd: '',
    getExecutionContext: function(){}
};

var execute = function(args)
{
    enforce(args, baseCommand); //throws an error if args does not honor
                                //baseCommand's properties
    executor.execute(args);
}

その後、これらのインターフェイスをさまざまな関数間で再利用し、プロパティ名のスペルミスや間違った引数を渡すことを心配することなく、それらを拡張して関数に渡すオブジェクトを定義できます。これを実装する方法、または既存の実装をどこで利用できるかについてのアイデアはありますか?

4

3 に答える 3

0

これを強制する他の方法はありません。これは、JavaScript の動的な性質の副作用の 1 つです。それは本質的に自由参加であり、その自由には責任が伴います:-)

于 2013-07-19T01:20:55.083 に答える
0

型チェックが必要な場合は、typescript (JavaScript ではない) または Google のクロージャ コンパイラ (コメント付きの JavaScript) を参照してください。

クロージャ コンパイラは、コメントを使用して、コンパイル時に期待される型を把握します。大変そうに見えますが、大きなプロジェクトでは役に立ちます。

netbeans などの IDE で使用されるコメントを作成する必要があるため、クロージャ コンパイラには他にも利点があります。コードを縮小し、未使用のコードを削除し、名前空間を平坦化します。したがって、名前空間で編成されたコードは、myApp.myModule.myObject.myFunctionオブジェクトの検索を最小限に抑えるためにフラット化されます。

短所は、jQuery のようにコンパイラと互換性のないライブラリを使用する場合、externs を使用する必要があることです。

于 2013-07-19T01:31:20.807 に答える
0

この種のことを JavaScript で通常処理する方法は、デフォルトを使用することです。ほとんどの場合、参照エラーなどを防ぐために特定のメンバーが存在することを保証したいだけですが、プリンシパルを使用して必要なものを取得できると思います。

jQuery の extends メソッドのようなものを使用することで、パラメーターが一連の定義済みデフォルトを実装することを保証できます。

    var defaults = {
        prop1: 'exists',
        prop2: function() { return 'foo'; }
    };

    function someCall(args) {
        var options = $.extend({}, defaults, args);
        // Do work with options... It is now guarentee'd to have members prop1 and prop2, defined by the caller if they exist, using defaults if not.
    }

特定のメンバーが提供されていない場合に実行時にエラーを本当にスローしたい場合は、おそらくエラーをスローする関数を定義し、それをデフォルトに含めることができます。したがって、メンバーが呼び出し元によって提供された場合、デフォルトが上書きされますが、欠落している場合は、デフォルトの機能を引き継ぐか、必要に応じてエラーをスローする可能性があります。

于 2013-07-19T03:15:42.977 に答える