3

したがって、私は JavaScript を初めて使用し、C.+ のバックグラウンドを持っていることを認めます (「こんにちは、私はボブです。クラスベースの静的言語のユーザーです」、コーラス「こんにちはボブ!」)。

次のような関数を書くことになることがよくあります。

function someFunc()
{
    if (arguments.length === 0 ){
       ...
    } else {
       ...
    }
}

(そのようなケースが 3 つある可能性があります)。または、代わりに、違いを名前に書き込みます。

function someFuncDefault() { ... };
function someFuncRealArg(theArg) { ... };

(意味的に内容のあるフレーズを「RealArg」に置き換えます)。

この種のより良いパターンはありますか?

4

8 に答える 8

5

この投稿を見てください。

于 2009-02-17T22:35:12.897 に答える
3

このようにするかどうかはわかりませんが、コードの管理がやや困難になる可能性があるようです。

function someFunc() {
    switch (arguments.length) {
        case 0: noArgs();
        case 1: oneArg(arguments[0]);
        case 2: twoArgs(arguments[0], arguments[1]);
    }
    function noArgs() {
        // ...
    }
    function oneArg(a) {
        // ...
    }
    function twoArgs(a, b) {
        // ...
    }
}

別の例は次のとおりです。

function someFunc(a, b) {
    if ('string' == typeof a) {
        // ...
    } else if ('number' == typeof a) {
        // ...
    }
}

もちろん、両方の例を組み合わせることで、非常に扱いにくいものを作成することもできます (条件を使用して、引数の数と引数の型に基づいて動作を決定します)。

于 2009-02-17T22:30:55.637 に答える
1

Javascript では、すべての引数はオプションです。

次のようなものを試すことができます:

編集(「真実性」がfalseである値に対して壊れないより良い方法):

function bar(arg1, arg2) {
  if(arg1 === undefined) { set default }
  if(arg2 === undefined) { set default }
  //do stuff here
}

偽の値で壊れる古いメソッド:

function foo(arg1, arg2) {
  if(!arg1) { set default }
  if(!arg2) { set default }
  //do stuff here
}

JavaScript を始めるのに最適な場所は、Douglas Crockford の JavaScript レクチャーです: http://video.yahoo.com/search/?p=javascript

于 2009-02-17T22:35:46.233 に答える
1

これはオーバーロードであり、no をオーバーライドしていませんか?

Javascript は型付けが弱いため、メソッド シグネチャとネイティブ サポートは廃止されました。私のお勧めは、拡張可能なオブジェクトを単独の引数として渡すことです。必要に応じて、param オブジェクトのプロパティの存在を検査して処理します。

これは引数よりもどのような利点がありますか? 呼び出す場所で意図を明確にし、受け取る場所で arg1 と arg2 の意味を明確にし、機能を拡張できるカスタム データ オブジェクト クラスに抽象化できます。

function someFunc(params)
{
  var x = params.x || defaultX;
  var y = params.y || defaultY;

  //businesslogic
}

someFunc({x:'foo',y:'bar'});

someFunc({y:'baz'});
于 2009-02-17T22:43:49.113 に答える
0

Javascript を使用すると、非常に怠惰になります (Python ほど怠惰ではありませんが、かなり怠惰です)。

function someFunc(arg1, arg2)
{
  if(typeof(arg1) == "undefined") {
    arg1 = default;
  }
  ... 
}

したがって、実際にオーバーロードする必要はありません。Javascript は、間違った数のパラメーターを渡しても怒鳴ることはありません。

于 2009-02-17T22:36:52.453 に答える
0

もう少し包括的なオーバーロード メカニズムがbob.jsによって提供されます。

var notify = new bob.fn.overloadFunction([ 
    { 
        condition: function(msg) { return bob.utils.isString(msg); }, 
        overload: function(msg) { 
            console.log(msg); 
        } 
    }, 
    { 
        condition: function(bSayHello) { return bob.utils.isBoolean(bSayHello); }, 
        overload: function(bSayHello, msg) { 
            msg = bSayHello ? 'Hello: ' + msg : msg; 
            console.log(msg); 
        } 
    } 
]); 

オーバーロードされた関数を呼び出す:

notify('Simple sentence.'); 
// Output: 
// Simple sentence. 
notify(true, 'Greeting sentence.'); 
// Output: 
// Hello: Greeting sentence. 
notify(123); 
// JavaScript Error: 
// "No matching overload found." 
于 2013-04-03T19:49:52.213 に答える
0

個人的には、実行される最も複雑な関数を記述し、それをコメントで文書化して、他の人がすべての引数を送信する必要がないことを理解できるようにすることを好みます。

//concat(str1, str2 [,str3 [,str4 [,str5]]])
function concat(str1, str2, str3, str4, str5) {
    var str = str1 + str2;
    if(str3 != undefined)
        str += str3;
    if(str4 != undefined)
        str += str4;
    if(str5 != undefined)
        str += str5;
    return str;
}

また、通常の関数で引数の順序が問題になる状況も発見しましたが、引数を別々に送信したい場合があります (つまり、str3 と str5 を送信したいが、str4 は送信したくない場合)。このために、オブジェクトを使用して既知のプロパティをテストします

//concat({str1:string, str2:string, str3:string, str4:string, str5:string})
//str3, str4, and str5 are optional
function concat(strngs) {
    var str = strngs.str1 + strngs.str2;
    if(strngs.str3 != undefined)
        str += strngs.str3;
    if(strngs.str4 != undefined)
        str += strngs.str4;
    if(strngs.str5 != undefined)
        str += strngs.str5;
    return str;
}
于 2009-02-18T03:40:18.420 に答える
0

ここでの本当の問題は、JavaScript では、渡されたパラメーターに基づいて動作を変更してはならないということだと思います。

JavaScript はすべてのパラメーターをオプションにするため、この規則を使用する簡潔な方法に従うことができます。

function foo(bar, baz) {
    bar = bar || defaultBar;
    baz = baz || defaultBaz;
    .
    .
    .
}
于 2009-02-17T23:00:56.563 に答える