1

キャンバスのライブラリ内で使用するJavaScriptで小さな構造を作成しようとしています。この構造を作成するときに渡される引数は、コンパイル言語で行うように複数の引数にするか、これらのパラメーターに対応するプロパティを持つオブジェクトにする必要があります。

BoundingBox = function( x, y, w, h ) {

    if( 'object' === typeof x ) {

        if( ! 'x' in x ) throw new Error('Property "x" missing');
        if( ! 'y' in x ) throw new Error('Property "y" missing');
        if( ! 'w' in x ) throw new Error('Property "w" missing');
        if( ! 'h' in x ) throw new Error('Property "h" missing');

        this.x = x.x;
        this.y = x.y;
        this.w = x.w;
        this.h = x.h;

    } else {

        if( null == x ) throw new Error('Parameter 1 is missing');
        if( null == y ) throw new Error('Parameter 2 is missing');
        if( null == w ) throw new Error('Parameter 3 is missing');
        if( null == h ) throw new Error('Parameter 4 is missing');

        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
    }
};

その後 :

var bb1 = new BoundingBox(0, 0, 200, 100);

var bb2 = new BoundingBox({
    x: 0,
    y: 0,
    w: 200,
    h: 100
});

var bb3 = new BoundingBox(bb2);

これはそれを行うためのクリーンな方法ですか?オブジェクトを使用している場合、オブジェクトとして「x」を使用すると、非常に奇妙に見えます。

そして私は2番目の質問があります:そのすべてのエラーチェックのものは努力する価値がありますか?コードのサイズが2倍になり、読み取りと書き込みが長くなります。また、プロパティはパブリックであるため、nullまたは未定義の値を持つことから完全に保護することはできません。

ご協力いただきありがとうございます :)

4

2 に答える 2

2

私はそれがひどいとは思いませんが、JavaScript では、オーバーロードはすべての関数で利用可能な引数 var を通じてより一般的に行われます。

function BoundingBox(){

//do named functions with constructors. It sets the constructor.name
//property in instances, which can be handy sometimes

    if(typeof arguments[0] === 'object'){
        var coordsObj = arguments[0];
    }
    else {
        coordsObj = {} //no need for var dec even when upper if doesn't evaluate
        coordsObj.x = arguments[0];
        coordsObj.y = argumetns[1];
        //...etc.
    }
    //laziest way to make those publicly available.
    this.constructor.prototype = coordsObj;
}

パラメータをテストする限り、リラックスしてください。パラメータに問題があることを報告する try/catch でラップするか、外部ソースに依存しない関数でデータを信頼することを学びます。アプリを介したデータの流れを認識することを学び、すべての動的キャスト規則を十分に学習して、何か問題が発生したときに何が起こっているのかを理解することを学ぶと、動的型付け全体の恐怖ははるかに少なくなります。厳密に型付けされたパラダイムであっても良心的である必要があります

于 2012-12-14T14:21:32.383 に答える
0

関数に関する私の考えoverloadは次のとおりです。関数overloadを受け入れる関数と、その署名を持つ新しい関数を (typeof値の配列として) 作成できます。次に、返された関数は、現在の呼び出しがこのシグネチャと一致するかどうかを確認し、その場合は新しい関数を呼び出します。それ以外の場合は、古い関数を呼び出します。

このようにして、何度もパッチを適用することで関数をオーバーロードできます。さまざまな関数の定義と実際のオーバーロード ロジックは、この方法で分離できます。http://jsfiddle.net/m2cRK/を参照してください。

​var overload = function(oldFunc, types, newFunc) {
    return function() {
        var suffice = Array.prototype.every.call(arguments, function(v, i) {
            return typeof v === types[i];
        });
        return (suffice ? newFunc : oldFunc).apply(this, arguments);
    };
};

使用法 (再割り当てを必要としない機能は次のとおりです: http://jsfiddle.net/m2cRK/1/ ):

// The end of the chain, e.g. a function that throws a "no overload" error
var foo = overloadStart();

// Function 1
foo = overload(foo, ["number", "number"], function(a, b) {
    return a + b;
});

// Function 2
foo = overload(foo, ["object"], function(obj) {
    return obj.a + obj.b;
});


foo(1, 2);            // 3
foo({ a: 1, b: 2 });  // 3
foo("bar");           // error
于 2012-12-14T20:21:22.210 に答える